Java中输入输出流主要涉及到的包是Java.io,Java.io中最重要的就是5个类和1个接口:5个类是File、OutputStream、InputStream、Writer、Reader;一个接口是Serializable。
1.1、主要类
- File(文件特征与管理):用于文件或者目录的描述信息,例如生成新目录,修改文件名,删除文件,判断文件所在路径等。
- InputStream/OutputStream(字节操作):抽象类,基于字节的输入/输出操作。
- Reader/Writer(字符操作):抽象类,基于字符的输入/输出操作。
- OutputStreamWriter/InputStreamReader(字节、字符转换类):分别是Writer/ Reader的子类,需要InputStream/OutputStream类对象做参数。
1.2、File类
1.2.1、File类
File类既可以表示目录也可以表示文件(isFile、isDirectory),可以完成目录和文件的创建(createNewFile、new File(目录))、删除(delete)和查询(list)等操作。
1.2.2、FileInputStream/FileOutputStream类
FileInputStream的read(byte[])方法把生成的文件输入流读入到内存中byte[]数组保存,然后FileOutputStream的writer(byte[])将byte[]数组中保存的字节写入到文件中。
复制文件内容:
1.2.3、RandomAccessFile类
FileInputStream/FileOutputStream类只能简单的读写文件内容,如果需要随机读取和需要更改文件内容的时候时可以使用RandomAccessFile类。
RandomAccessFile类除了也有read和writer方法之外还有length()、seek(i)方法,其中seek方法可以根据下标数字i来定位。
将文件中所有字母a换成c实例:
1.3、InputStream/OutputStream
字节流最大的特点是每次输入输出都是一个字节,不关心输入输出具体内容及编码,所有在内存缓存操作、文件复制等不需要关心流的内容的时候使用。
1.3.1、类结构图
1.3.2、ObjectInputStream/ObjectOutputStream类
在序列化1.6节中详细介绍
1.4、Reader/ Writer
字符流除了有read和writer方法之外,还有一个readLine()方法,因为现在是操作的字符,所以有换行之类的字符。
相对于ObjectInputStream/ObjectOutputStream中读写的单位是byte,Reader/Writer中读写的单位是char。
需要注意的是因为计算机底层都是字节数据,所以在创建字符流对象的时候需要已中间转换类对象为参数,即InputStreamReader/OutputStreamWriter类对象。
1.4.1、类结构图
1.4.2、InputStreamReader/OutputStreamWriter类
在1.5中详细介绍
1.5、InputStreamReader/OutputStreamWriter类
- OutputStreamWriter:是Writer的子类,将输出的字符流变为字节流,即将一个字符流的输出对象变为字节流输出对象。
- InputStreamReader:是Reader的子类,将输入的字节流变为字符流,即将一个字节流的输入对象变为字符流的输入对象。
1.5.1、编码问题
在字节与字符的转换过程中肯定会涉及到字符的编码问题。
详见:http://www.ibm.com/developerworks/cn/java/j-lo-chinesecoding/
1.6、序列化
1.6.1、概念
Java 串行化技术可以使你将一个对象的状态写入一个Byte 流里,并且可以从其它地方把该Byte 流里的数据读出来,重新构造一个相同的对象。这种机制允许你将对象通过网络进行传播,并可以随时把对象持久化到数据库、文件等系统里。Java的串行化机制是RMI、EJB等技术的技术基础。
用途:利用对象的串行化实现保存应用程序的当前工作状态,下次再启动的时候将自动地恢复到上次执行的状态。
序列化是将java对象内存中的数据变成一串二进制数据,然后把这些数据存放在持久数据存储设备上,当需要还原这些数据的时候,再通过反序列化的过程把对象还原到内存中。
1.6.2、相关技术
将需要被序列化的类实现Serializable接口,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着使用ObjectOutputStream对象的writeObject(Objectobj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。
1.6.3、Serializable接口
Serializable接口没有任何需要实现的抽象方法,仅仅告诉JVM对象实例可以进行序列化,并通过序列ID标识,它由静态的serialVersionUID变量提供。
1.6.4、ObjectInputStream/ObjectOutputStream类
他们的用法与基本的字节流类似,不过写入和读出方法为:readObject和wirteObject。