对于 java IO 这块一直是云里雾里,每次用的时候不是百度就是翻书,虽然能实现结果,但总是理解的不清楚。偶尔又翻了《Java疯狂讲义》中的I/O一节,再加上动手实践,终于理清了常见用法的思路,真是百看不如一练。
Java I/O 的基类有2种。InputStream/Reader, OutputStream/Writer。
基类
① InputStream/Reader
InputStream/Reader 是输入流,这里的输入输出是相对于内存来说的。这两个类都是基类(抽象类),不能实例化对象,可以靠它的派生类来实例化对象,实现文件的各种操作。InputStream 是字节流,Reader 是字符流。② OutputStream/Writer
OutputStream/Writer 是输出流,这里是指输出到磁盘等存储介质上,这两个类也都是基类,可以用它们的派生类来实现各种操作。OutputStream 是字节流,Writer 是字符流。组合流过滤器
平常的操作大部分是针对文件的,而且字符类操作多一些,下面说一下两种常用的派生类。
① FileInputStream/FileReader
操作文件相关的输入流(字节)/输入字符
常用的实例化对象格式为:FileInputStream input = new FileInputStream(File file); FileReader reader = new FileReader(File file);
②FileOutputStream/FileWriter
操作文件相关的输出流(字节)/输入字符
实例化方式类似输入流。转换流
在保存数据或者读取数据的时候往往需要指定编码,Java 提供了2中转换流:
① InputStreamReader
将包含字节的输入流转换为使用Unicode编码的字符流。
② OutputStreamWriter
将包含字节的输出流转换为使用Unicode编码的字符流它们的构造函数需要指定 InputStream 或者 OutputStream 的对象 或者和支持的字符编码组合。如:
InputStreamReader in = new InputStreamReader(System.in);// 这个输入流读入器会使用系统默认的字符编码格式。 InputStreamReader in = new InputStreamReader(new FileInputStream("log.txt"), "GBK"); //使用构造函数中指定的编码格式读取指定文件
缓冲流
① BufferedInputStream/BufferedReader
其构造函数是已经存在的物理节点流,如: BufferedInputStream(InputStream in)
创建一个带缓冲期的流。带缓冲区的输入流在从流中读入字符时,不会每次都对设备访问,当缓冲区为空时,会向缓冲区读入一个新的数据块。② BufferedOutputStream/BufferedWriter
其构造函数是已经存在的 输出流。
带缓冲区的输出流在收集要写出的字符时,不会每次都对设备访问,当缓冲区填满或者当流被冲刷时,数据就被写出。写出文本输出
对于文本输出,可以使用PrintWriter,这个类拥有以文本格式打印字符串和数字的方法,还有一个将PrintWriter 链接到FileWriter 的便捷用法,可以直接使用:PrintWriter out = new PrintWriter("employee.txt"); //等同于 PrintWriter out = new PrintWriter(new FileWriter("employee.txt"));
思考: 怎么实现改变文件的编码格式?
百度上搜索了半天,没有直接的api可以实现这一功能,只好自己实现,思路是:首先以指定编码格式读取源文件,把读取的内容可以存储到字符数组中,然后把字符数组转成字符串,再把字符串以指定的编码格式输出到目标文件中(源文件与目标文件可以是同一个文件),为了提高效率,可以使用Bufferd…的缓冲流。