Java IO流主要可以从两个最重要的维度进行分类:流向 和 操作的数据类型。
- 按流向分(以内存为参照物):
输入流(Input Stream): 将数据从外部(如文件、网络、键盘)读入到内存中。InputStream 和 Reader 是基类。
输出流(Output Stream): 将数据从内存 写出到外部(如文件、网络、控制台)。OutputStream 和 Writer 是基类。
- 按操作的数据类型分:
字节流(Byte Stream): 以字节(byte,8位) 为基本单位(0,1二进制数据),可以处理所有类型的数据,例如图片、视频、音频、可执行文件等。基类是 InputStream 和 OutputStream。
字符流(Character Stream): 以字符(char,16位Unicode) 为基本单位,专门用于处理文本数据。它底层会自动进行字符编码和解码,避免了乱码问题。基类是 Reader 和 Writer。
区别:
字节流的基本单位:字节(byte),1字节,处理所有类型的文件(二进制文件),如图片(jpg,png)、视频(avi)、音频(mp3)、压缩包、可执行文件等。基类是InputStream,OutputStream,优势是万能,什么都能读能写。常见类是FileInputStream, FileOutputStream, BufferedInputStream, ObjectOutputStream,例如:用字节流读一个文本文件,你得到的是原始的字节。如果文件是UTF-8编码,一个中文字符可能是3个字节,直接输出可能会是乱码。
字符流的基本单位是:字符(char),2字节(Unicode),专门处理文本文件(txt,java,xml,csv,html等)。基类是Reader, Writer,优势是处理文本时更高效,能自动处理字符编码(如UTF-8,GBK),解决乱码问题。常见类是FileReader, FileWriter, BufferedReader, PrintWriter。例如:用字符流读同一个文本文件,它会帮你把字节按指定的编码转换成字符,你看到的就是正确的文字。 |