二进制I/O

Java提供了很多进行输入输出的类,分为文本I/O类和二进制I/O类。

File对象封装文件或路径属性,但是不包含从文件读数据、向文件写数据的方法。若要进行I/O操作,需要用适当的Java I/O类创建对象,这些对象包含读数据写数据的方法。输入对象(输入流)从文件中读取数据流,输出对象(输出流)将数据流写入文件。

由于二进制I/O不需要编码和解码,所以比文本I/O效率高。二进制文件与主机编码方案无关,因此是可移植的,所以Java程序可以在任何机器上访问Java程序创建的二进制文件,这也是把Java的类文件存储为二进制文件的原因。因此,Java类文件可在任何具有Java虚拟机的机器上运行。

注:二进制I/O类中的所有方法都声明为抛出java.io.IOException或java.io.IOException的子类,所以必须在方法中声明抛出异常,或者将代码放到try-catch块中。

二进制I/O

二进制I/O

二进制I/O

1、FileInputStream类和FileOutputStream类

       用于向文件中写入字节、从文件中读取字节,只能对字节进行处理。所以方法都是继承InputStream类和OutputStream类。

FileInputStream类的构造方法如下:若文件不存在,则会抛出java.io.FileNotFoundException异常

二进制I/O

FileOutputStream类的构造方法如下:若文件不存在,则会创建一个新文件。若文件已存在,前两个构造方法会删除文件的当前内容

二进制I/O

2、FilterInputStream类和FilterOutputStream类

过滤器数据流可读取整数值、双精度值和字符串,而不仅仅是字符或字节

2.1  DataInputStream类和DataOutputStream类

     用于处理基本数据类型数据,DataInputStream从数据流中读取字节并转化为基本类型或字符串,DataOutputStream将基本类型的值或字符串转化为字节,并输出到数据流。用于对已存在的输入输出流进行包装,以便从原来的流中过滤数据。

二进制I/O

二进制I/O

2.2 BufferedInputStream类和BufferedOutputStream类

  通过减少读写次数来提高输入输出流速度,为存储字节在流中添加一个缓冲区(默认512字节),提高处理速度。所有方法继承自InputStream和OutputStream类。

3、ObjectInputStream类和ObjectOutputStream类

可实现对象的输入输出,readObject()方法可能会抛出异常java.lang.ClassNotFoundException,因为Java虚拟机读出一个对象时,若该对象所在的类没有装入,首先装入该类,若该类不存在则会抛出异常。

二进制I/O

二进制I/O

并不是所有对象都可以写到输出流,可以写入输出流的对象称为可序列化的,可序列化对象是java.io.Serializable接口的实例,所以可序列化对象必须实现Serializable接口。试图存储一个不支持Serializable接口的对象会引起java.io.NotSerializableException异常。

存储一个可序列化对象时,会对该对象的类进行编码,包括类名、类的签名、对象实例变量的值以及从初始对象引用的其他对象闭包,不存储对象静态变量的值

如果一个对象是Serializable的实例,但包含一个非序列化的数据域,那么该对象不是可序列化的。为了使其序列化,可在非序列化的数据域上加transient关键字,告诉Java虚拟机将对象写入对象流时忽略这些数据域。