在说字节流与字符流之前,我们需要先看一下输入流与输出流。实际上他们只是一对互为逆过程的行为,而这两个行为所操纵的具体内容,就是字符流与字节流。
从宏观上来说,程序可以直接通过字节流来操纵文件内容。但如果使用的是字符流,则需要先将字符流写入缓存,再通过缓存来修改文件。
具体表现在Java上:当你使用字节流来修改文件时,即使不关闭流,文件的内容一样会被修改。但当你使用字符流来对文件修改是,如果不关闭流,则文件不会被修改。
另外Java的网络编程中必须使用字节流来传输文件。
那么java中的常用的字节流与字符流的类都是哪些呢?
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
字节流与字符流的输入与输出全部由这四个抽象类来实现。
接下来是他们的实现
InputStream | OutputStream |
---|---|
FileInputStream、FilerInputStream、ObjectInputStream、ByteArrayInputStream | FileOutputStream、FilerOutputStream、ObjectOutputStream、ByteArrayOutputStream |
FilerInputStream有两个实现类:BufferInputStream、DataInputStream。
FilerOutputStream有三个实现类:BufferOutPutStream、DataOutputStream、PrintStream。
从命名可以看出来字节流的输出与输出所执行的功能都大致相同,那么字符流的类实现也就很显而易见了。
Reader | Writer |
---|---|
BufferedReader、 InputStreamReader->FileReader、StringReader | BufferedWriter、OutputStreamWriter->UFileWrite、PrintWriter、StringWriter |
文件输入输出流:FileInputStream、FileOutputStream
对象输入输出流:ObjectInputStream、ObjectOutputStream
文件输入输出流:FileReader FileWriter
缓存的文件输入输出流:BufferedReader BufferedWriter
接下来我们就可以想这样根据名字大概判断其用法,再通过API文档具体查找就行了。
只是这个缓存文件输入输出流,我们需要着重说一下。
我们可以通过名字看出来 InputStreamReader与OutputStreamWriter是可以将字节流与字符流进行转换的两个类,InputSreamReader用于将一个字节流中的字节解码成字符。
而BufferedReader BufferedWriter则是分别对两者进行了包装,如果将InputStream与OutputStreamWriter看做两条河流的话,那么我们可以将这两者理解为对河流的水进行加工的类。通过包装将会多出一些更易用的功能。