Java中java.io包中最重要的有五个类和一个接口。
5个类指的是File、OutputStream、InputStream、Writer、Reader;一个接口指的是Serializable。
OutputStream、InputStream都是抽象类,代表字节流输入输出,是所有字节输入输出类的超类;Writer、Reader代表字符流(适用于纯文本);
File代表非流式操作,
不负责数据的输入输出,而专门用来管理磁盘文件与目录,主要用于命名文件、查询文件属性和处理文件目录
,File类不是前面的类的子类,而是同一级的
FileInputStream、FileOutputStream并不是File类的子类,
而是Output
Stream、InputStream的子类,表示对文件的字节操作,采用read()、write()方法对文件进行读写;
相对的
FileReader、FileWriter也不是File的子类,是Reader和Writer的子类。
但是这的4个类的构造方法的参数经常是File对象。
Java的流,将所有的输入输出的数据都统一成一样的格式,而不必关系数据从什么样的设备来到什么设备区(自我理解)
Java中的流分为两种:
1) 字节流:
数据流中最小的数据单元是字节
2) 字符流:
数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。
如何选择IO流
1)确定是数据源和数据目的(输入还是输出)
源:输入流 InputStream Reader
目的:输出流 OutputStream Writer
2)明确操作的数据对象是否是纯文本
是:字符流Reader,Writer
否:字节流InputStream,OutputStream
3)明确具体的设备。
是硬盘文件:
File++:
读取:FileInputStream,, FileReader,
写入:FileOutputStream,FileWriter
是内存用数组
byte[]:
ByteArrayInputStream, ByteArrayOutputStream
是char[]:
CharArrayReader, CharArrayWriter
是String:
StringBufferInputStream(已过时,因为其只能用于String的每个字符都是8位的字符串), StringReader, StringWriter
是网络用Socket流
是键盘:
用System.in(是一个InputStream对象)读取,用System.out(是一个OutoutStream对象)打印
3)是否需要转换流
是,就使用转换流,从Stream转化为Reader,Writer:InputStreamReader,OutputStreamWriter
4)是否需要缓冲
提高效率
是就加上Buffered:
BufferedInputStream, BufferedOuputStream, BuffereaReader, BufferedWriter
5)是否需要格式化输出
例:将一个文本文件中数据存储到另一个文件中。
1)数据源和数据目的:
读取流,InputStream Reader 输出:OutputStream Writer
2)是否纯文本:
是!这时就可以选择Reader Writer。
3)设备:
是硬盘文件。Reader体系中可以操作文件的对象是 FileReader FileWriter。
FileReader fr = new FileReader("a.txt");
FileWriter fw = new FileWriter("b.txt");
4)是否需要提高效率:
是,加Buffer
BufferedReader bfr = new BufferedReader(new FileReader("a.txt"); );
BufferedWriter bfw = new BufferedWriter(new FileWriter("b.txt"); );