Java IO 中涉及的类确实太多,刚开始看的时候一头雾水,用的多了,慢慢也就清晰了。
IO 中常用的类如下:
字节流基类:InputStream,OutputStream
字符流基类:Reader,Writer
文件字节流:FileInputStream,FileOutputStream
文件字符流:FileReader,FileWriter
字节缓冲流:BufferedInputStream,BufferedOutputStream
字符缓冲流:BufferedReader,BufferedWriter
字节转换成字符的转换流:InputStreamReader,OutPutStreamWriter
字节输出流:PrintInputStream
字符输出流:PrintWriter,
带Print 的输出流可以格式化输出内容,例如格式化成String,或者%d这种样式,用法比较灵活
Java IO 框架使用的是装饰者模式,类与类之间的关系不是单纯的继承,
一个类可以辅助另一个类,更完善的实现功能,比如下面的实例化BufferedReader对象:
BufferedReder reader = new BufferedReader(new InputStreamReader(new FileInputStream(file, "UTF-8")));
最终实现的是使用缓存流读入UTF-8编码格式的文件中内容。一层一层进行包装,比如FileInputStream是与文件关联的字节流,但是文本中文件使 用字符流读比较好,于是 InputStreamReader 把与文件关联的字节流作为自己的输入,包装成了字符流,但是又想使用效率比较高的 BufferedReader来读取文件的内容,于是在InuputStreamReader 的基 础上又包装了一层,最终的代码就成了上面那种写法。
IO流有四个几类,这四个基类是对应关系,是抽象类,不能直接使用,实际应用中要使用它们的派生类,这四个基类分别是:
InputStream/OutputStream:处理输入/输出的字节流:
Reader/Writer: 处理输入/输出的字符流。
输入和输出是一个相对的概念,这里程序读数据是InputStream,向文件或者内存中输出/写入 数据是OutputStream
具体使用中需要和文件关联的又分为文件字节流和文件字符流:
FileInputStream 和 FileOutputStream,处理文件字节流
FileReader 和 FileWriter,处理文件字符流
缓冲流:
BufferedInputStream/BufferedOutStream,
BuffereredReader/BufferedWriter。
使用缓冲流注意使用flush方法,把数据从内存中刷出。
字节转换成字符的转换流:
InputStreamReader/OutputStreamWriter
字符比字节处理起来要 方便些,所以只提供了字节到字符的转换流,并没有提供字符向字节的转换流。 这种应用的情况比如需要设置读取文件的编码格式,FileInputStream 和 FileOutputStream 可以设置编码格式,但是字节处理起来比较麻烦,可以转 换成字符处理 InputStreamReader(new FileInputStream(file, charset))。
还有经常使用的字节输出流和字符输出流:
PrintStream,PrintWriter,
BufferedWriter和PrintWriter都可以写入数据,但 BufferedWriter没有相关的格式化的方法,而PrintWriter可以在写入同时 对写入的数据进行格式化。