上次我们使用的是字节流,还有一种方式就是字符流,上次说过如何分辨使用哪种流,如果记事本可以读懂则使用字符流,否则使用字节流。使用字符流就需要牵扯到编码的问题,下面给出一种转化流的格式。
OutputStreamWriter
OutputStreamWriter(OutputStream os):默认编码,GBK
OutputStreamWriter(OutputStream os,String charsetName):指定编码。
InputStreamReader
InputStreamReader(InputStream is):默认编码,GBK
InputStreamReader(InputStream is,String charsetName):指定编码
原则很简单,如果你是用了那种方式编码就使用哪种方式解码。java默认的应该是GBK,所以如果你发现用某些编辑器打开时乱码,那么一定是使用了不同的解码格式。
在转化流中我们也可以写入字节流。比如,ios.write(a),write(‘97‘),这样是错误的,因为我们的转化流是字符流,一个字符=两个字节,所以我们需要使用刷新来更新缓冲区。在上面的语句后面加上ios.flush就好了。总结,也就是说在我们使用字符流的时候,尽量多使用flush来刷新。当然我们也可以不适用flush,因为close方法执行的时候会自动的刷新一次。但是和flush相比,它执行后,它的流对象就不可以使用了。这点需要留意。
由于我们的常见操作使用本地默认的编码,所以java还给了一个简化版的子类:FileWriter and FileReader,方法基本上一样的,除非你对编码方式有着特别的要求。
总结
IO流
|--字节流
|--字节输入流
InputStream
int read():一次读取一个字节
int read(byte[] bys):一次读取一个字节数组
|--FileInputStream
|--BufferedInputStream
|--字节输出流
OutputStream
void write(int by):一次写一个字节
void write(byte[] bys,int index,int len):一次写一个字节数组的一部分
|--FileOutputStream
|--BufferedOutputStream
|--字符流
|--字符输入流
Reader
int read():一次读取一个字符
int read(char[] chs):一次读取一个字符数组
|--InputStreamReader
|--FileReader
|--BufferedReader
String readLine():一次读取一个字符串
|--字符输出流
Writer
void write(int ch):一次写一个字符
void write(char[] chs,int index,int len):一次写一个字符数组的一部分
|--OutputStreamWriter
|--FileWriter
|--BufferedWriter
void newLine():写一个换行符
void write(String line):一次写一个字符串