浅谈Java文件、IO流(二)
在上一篇里我们简单的讲了一下文件和常用的IO流操作,主要要熟悉字节流和字符流操作。在刚开始不熟悉的时候其实我总是会把这几个东西给混起来,比如会把字节流的InputStream和字符流Reader给混起来。其实在这里我们只要记住一点就好了,凡是带有Reader的类都是处理字符流的。
除了上篇博客所提到的这些输入输出流之外,我们还有几个常用的流:
一、缓冲流
同样的也分为字节缓冲流和字符缓冲流。这两个缓冲流的作用是可以提高我们IO流的性能,使用的时候在以前的基础上再套用一层就可以了。比如:
FileInputStream f = new FileInputStream(new File(src));
BufferedInputStream b = new BufferedInputStream(new FileInputStream(new File(src)));在上面的基础上再套用一层即可。1)字节缓冲流
BufferedInputStream
BufferedOutputStream
2)字符缓冲流
BufferedReader readLine()
BufferedWriter newLine()
字节缓冲流和字符缓冲流较前面所提到的普通的输入输出流有些不同的地方,比如字符缓冲流的readLine()方法和newLine方法。具体的参考API文档。字节流文件拷贝+缓冲流提高性能
二、转换流:
字节流转换为字符流 处理乱码(编码集、解码集合)
1、编码与解码概念编码:字符 --编码字符集 >二进制,是把字符集编码成二进制的形式存储在计算机中
解码: 二进制 ---解码字符集 --> 字符 ,是把计算机存储的二进制文件解码成字符集
乱码:包含两种情况
1)编码与解码的字符集不统一
2)字节数减少,长度丢失。
实现读取文件和写入文件编码统一:在读取和写出时包裹InputStreamReader和OutputStreamWriter实现编码和解码。如:
三、其他流(作为了解)
1、节点流 字节数组 字节 节点流
输入流:ByteArrayInputStream
输出流:ByteArrayOutputStream
字节数组节点流
数组的长度有限,数据量不会很大
文件内容不用太大
1、文件 ---程序-->字节数组
2、字节数组--程序-->文件
示例:
public static void write() throws IOException {
byte[] dest ;
//选择流不同点
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String msg = "操作与文件输出流一致";
byte[] info= msg.getBytes();
bos.write(info,0,info.length);
dest = bos.toByteArray();
bos.close();
}
public static void read() throws IOException {
String msg = "操作与文件输入流操作一致";
byte[] src =msg.getBytes();
InputStream is =new BufferedInputStream(
new ByteArrayInputStream(src)
);
// ObjectInputStream oi = new ObjectInputStream(new ByteArrayInputStream(src));
byte[] b= new byte[1024];
int len =0;
while (-1 != (len=is.read(b))){
System.out.println(new String(b,0,len));
}
}
2、处理流
1)基本类型+string 保留数据+类型
输入流:DataInputStream+readXXX
输出流:DataOutputStream+writeXXX
2)引用类型(对象)保留数据+类型
在这里解释一下序列化和反序列化的概念:简而言之,序列化就是将对象转换成字节序列,反序列化就是将字节序列恢复成对象的。序列化用在哪里呢?当我们需要将对象永久的存储起来,比如说
a)存储到数据库里面
b)当想用套接字在网络上传送对象的时候
c)当想通过RMI传输对象的时候
这几种情况都要序列化。
实现序列化的方法,实现Serializable接口即可,这个接口的作用是标注对象是否可序列化。若在对象中不想对其中的某个属性序列化,则可以加上transient关键字。更多关于序列化和反序列化的知识,本篇不做详细介绍。
反序列化 输入流 ObjectInputStream readObject()利用这个流可以实现把文件中的字节序列反序列化成对象序列化 输出流ObjectOutputStream writeObject 这个流可以把对象序列化成字节序列存储到文件中去。
下面借用其他博客的一张图来看一下IO流的组成
四、IO流中用到的设计模式
在我们以上对文件的操作中,其实可以发现,类与类之间的关系是多样的,我们在父类的基础上增加子类的方法
装饰设计模式:定义为在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能。它的特点是:多用组合,少用继承。
如扩音器
类与类之间的关系
1、依赖:形参,局部变量
2、关联:属性
聚合:属性 整体与部分 不一致的生命周期 人与手
组合:属性 整体与部分 一致的生命周期 人与大脑
3、继承:父子类关系
4、实现:接口与实现类关系
这里只做一个简单的介绍,可能说的不明白,待补充。。。