1.注意,输入输出流以字节流为操作对象,InputStream是所有输入流基类,OutputStream是所有输出流基类,这两个基类不能被实例化;
2.InputStream的public int read()函数从输入流读入一个字节,存储在返回int对象的低八位里。OutputStream的public void write(byte[] b)把字节数组写入当前文件,public void write(int b)把b的低八位写入当前文件;
3.数据输入输出流DataInputStream、DataOutputStream的有点在于他们提供了readBoolean、readFloat等直接读取基本类型的成员方法,还有writeBoolean、writeFloat等直接输出基本类型的成员方法;
4.PrintStream是标准输出,System.out和System.err都是PrintStream的对象(),有点在于包含可以直接输出多种数据类型的成员方法,像print(char c)、print(float)、print(String)、print(Object)等,还有对应的println函数换行输出函数;
5.带缓冲的输入输出流BufferedInputStream、BufferedOutputStream,他们的对象会在内存中开辟一个字节数组,存放数据流中数据。这样可以把一个较大的数据块读入内存,也可以把一个大数据块一次性写入文件中,实现高效读写。
他们的构造函数如下:
public BufferedInputStream(InputStream in) public BufferedInputStream(InputStream in, int size) 和 public BufferedOutputStream(OutputStream out) public BufferedOutputStream(OutputStream out, int size)
其中in、out通常是文件输入输出流对象,用BufferedInputStream、BufferedOutputStream比普通文件输入输出流快;
6.随即访问文件类型RandomAccessFile:他不同于普通输入输出流之处在于,他可以不按顺序的读写,而且可以用同一个对象进行读写。
RandomAccessFile将文件看成字节数组,他用一个指针记录当前位置,可以用成员函数public seek(long pos) throws IOException将指针定位到pos制定位置,pos单位为字节,getFilePointer()可以获得指针当前位置,skipBytes(int n)把指针后移n个字节。
RandomAccessFile的read函数只读取一个字节,RandomAccessFile还提供readInt、readFloat等成员方法来读取基本类型,public final String readLine()读取一行
RandomAccessFile的write函数当参数为int时只将int对象的低8为写入文件,当参数为字节数组时把该数组写入文件,如果想直接写入基本数据类型可以用writeInt、writeFloat等函数;
7.Java中有一套和输入输出流对应的读写器:Reader、Writer、FileReader、FileWriter...,读写器与输入输出流区别在于,前者处理的是字符流,后者处理的时字节流,读写器一般会获得较好的中文支持;
8.ObjectInputStream、ObjectOutputStream用来输入输出可序列化对象(可序列化的类型必须继承自java.io.Serializable)。
ObjectOutputStream提供writeBoolean、writeFloat等成员方法输出基本类型,writeObject输出引用类型对象;
ObjectInputStream提供readBoolean、readFloat等成员方法读入基本类型,readObject读入引用类型对象,读出后需要做类型转换,如T t = (T)(of.readObject());
注意,如果不在序列化类中定义static final long serialVersionUID,系统会自动生成一个序列号,当做当前类的哈希码,只有序列号相等的对象才能有readObject读取。当类发生改变时系统会自动生成的序列号会改变,序列号不一致时会导致读取失败;
9.前面的输入输出类都是针对文件内容的,而java.io.File可以从整体上对文件进行处理,很少涉及文件内容操作。比如File对象可以用exists判断当前对象的路径或文件是否存在,isFile判断当前对象是否是文件,isDirectory判断当前对象是否是路径,getAbsolutePath获取当前对象的绝对路径,delete删除当前对象所表示的文件或路径,mkdir创建路径;