10. 对IO流的多重封装的使用的理解

10.1. java IO 流介绍

以下是java的基本IO流:

java basic io stream

举例子,我们在对一个文件进行数据读取时,使用的是FileInputStream,但是使用该类获取的数据是字节流/二进制流,我们在读取文件数据时只能通过字节来读取;如果希望提高读取效率可以使用BufferedInputStream作为二级流,对输入缓冲流提供更多控制。当然,如果希望直接从文件中返回各种基本类型的数据,可以使用DataInputStream作为三级流。

io stream read
//构建文件输入流
DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream()));

备注

多重封装的好处是提高程序效率;在网络通讯程序中,字符流对一句话的传输比字节流一个字节一个字节得传输要好,有缓冲得BufferedInputStream要比没有缓冲的InputStream要好。以上三重封装适用于文本以及文本文件的传输,对于非文本文件的传输需要另外考虑。

10.2. FileOutputStream与ObjectOutputStream的组合理解

For example to write an object that can be read by the example inObjectInputStream:

FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);

oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date());

oos.close();

new FileOutputStream(“t.tmp”)创建的是一个文件流,所有通过该对象进行写操作的数据都将写入t.tmp文件中。

上文代码块可理解为:通过ObjectOutputStream对象把对象数据写入文件t.tmp中,即创建ObjectOutputStream对象的同时,确定了通过该对象进行的写操作的数据流是流向FileOutputStream对象的。

备注

通过API文档可知,ObjectOutputStream类的构造函数有两个,分别为有参和无参。

其中,无参构造函数即 ObjectOutputStream() 是为完全重新实现ObjectOutputStream的子类提供一种方法,实际上是不能无参生成对象输出流对象的。

有参构造函数即 ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。

10.3. ByteArrayOutputStream与ObjectOutputStream的组合理解

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Translate {

	/**
	 * 对象转换为字节数组形式,实现对向的序列化
	 * @param obj 为待转换对象
	 * @return 字节数组
	 */
	public static byte [] ObjectToByte(Object obj) {
		byte[] buffer=null;
		
		try {
			//字节数组输出流
			ByteArrayOutputStream bo=new ByteArrayOutputStream();
			//对象输出流
			ObjectOutputStream oo=new ObjectOutputStream(bo);
			oo.writeObject(obj);
			buffer=bo.toByteArray();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		
		return buffer;
	}
}

备注

通过API文档可知,ByteArrayOutputStream类实现了将数据写入字节数组的输出流。 当数据写入缓冲区时,缓冲区会自动增长。

10.4. 小结

对于一个OutputStream/InputStream 类及其子类,如果其类对象拥有缓冲区/文件空间,那么这种类型的流对象可以作为IO流多重封装的最内层。