Java中的IO流总结(续)

IO流中的转换流

OutputStreamWriter是字符流通向字节流的桥梁,可使用指定的字符流编码表,将要写入流中的字符编吗成字节,将字符串按照指定的编吗表转成字节,再使用字节流将这些字节写出去。对于字符转换成字节输出的原理,在我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转换成字节数存放到OutputStreamWriter缓冲区中。然后再调用刷新功能,或者关闭流,或者将缓冲区存满后会把缓冲区中的字节数据使用字节流写到指定的文件中。

FileOutputStream fos = new FileOutputStream("c:\\cn8.txt");
//创建可以把字符转成字节的转换流对象,并指定编码
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
//调用转换流,把文字写出去,其实是写到转换流的缓冲区中
osw.write("你好");//写入缓冲区。
osw.close();

InputStreamReader是字节流通向字符流的桥梁:它使用指定的字符编吗表读取字节并将其解码为字符。它使用的字符集可以由名称指定或显示给定,或者接收平台默认的字符集。在读取指定的编吗的文件时,一定要指定编吗格式,否则会发生解码错误变成乱码。

缓冲流

提高读写的速度可以利用缓冲流,缓冲输出流BufferedOutputStream和缓冲输入流BufferedInputStream,都是通过缓冲区来读写的。

private static void write() throws IOException {
//创建基本的字节输出流
FileOutputStream fileOut = new FileOutputStream("abc.txt");
//使用高效的流,把基本的流进行封装,实现速度的提升
BufferedOutputStream out = new BufferedOutputStream(fileOut);
//2,写数据
out.write("hello".getBytes());
//3,关闭流
out.close();

字符缓冲流有缓冲输入流BufferedReader和缓冲输出流BufferedWriter。

用于从流中取出对象的操作流ObjectInputStream称为反序列化流,用于向流中写入对象的操作流ObjectOutputStream称为序列化流。它们用于操作对象,可以将对象写入到文件中,也可以从文件中读取对象。

//1,明确存储对象的文件。
FileOutputStream fos = new FileOutputStream("tempfile\\obj.object");
//2,给操作文件对象加入写入对象功能。
ObjectOutputStream oos = new ObjectOutputStream(fos);
//3,调用了写入对象的方法。
oos.writeObject(new Person("wangcai",20));
//关闭资源。
oos.close();

当一个对象能被序列化,这个对象所属的类必须实现Serializable接口,否则会发生异常NotSerializableException异常。同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常InvalidClassException。

对IO流进行了规律的总结:

1.看操作的数据是数据源还是数据目的。(先根据需求明确要读,还是要写)

源:InputStream       Reader

目的:OutputStream    Writer

2.要操作的数据是字节还是文本(明确到具体的体系上)

源:

字节:InputStream

文本:Reader

目的

字节:OutputStream

文本:Writer

3.根据数据所在的具体设备

源(目的)设备:

硬盘:文件    File开头

内存:数组,字符串

键盘(屏幕):System.in(System.out)

网络:Socket

4.看是否需要额外功能:

额外功能:

转换:InputStreamReader    OutputStreamWriter

高效:缓冲区对象  Buffered***

猜你喜欢

转载自blog.csdn.net/HelloMy_Future/article/details/82385337