今天说的这两个流说白了就是解决字符与字节之间的转换的。
OutputStreamWriter和InputStreamReader是什么?
1.InputStreamReader是字节流转换字符流的桥梁
2.OutputStreamWriter是字符流转换字节流的桥梁
InputStreamReader怎么用?
从构造方法中看出需要传入一个InputStream对象,指定路径文件。即从指定文件以字节形式读入到内存中,CharsetDecoder表示需要指定编码 例如:utf-8
从方法中看出,方法与其他流并无太大差别,直接上代码,写个小栗子!
public static void main(String[] args) throws IOException {
//演示字节转字符流的转换流
readCN();
}
public static void readCN() throws IOException{
//创建读取文件的字节流对象
InputStream in = new FileInputStream("a.txt");
//创建转换流对象
//InputStreamReader isr = new InputStreamReader(in);这样创建对象,会用本地默认码表读取,将会发生错误解码的错误
InputStreamReader isr = new InputStreamReader(in,"utf-8");
//使用转换流去读字节流中的字节
int ch = 0;
while((ch = isr.read())!=-1){
System.out.println((char)ch);
}
//关闭流
isr.close();
}
}
OutputStreamWriter怎么用?
OutputStreamWriter的构造方法和方法与InputStreamReader可以从图中看出基本都有相互对比的方法。
从构造方法中看出需要传入一个OutputStream对象,指定路径文件。即从内存以字符形式写入到指定文件中,CharsetDecoder表示需要指定编码 例如:utf-8
栗子:
public static void writeCN() throws Exception {
//创建与文件关联的字节输出流对象
FileOutputStream fos = new FileOutputStream("b.txt");
//创建可以把字符转成字节的转换流对象,并指定编码
OutputStreamWriter osw = new OutputStreamWriter(fos,"utf-8");
//调用转换流,把文字写出去,其实是写到转换流的高效区中
osw.write("你好");//写入高效区。
osw.close();
}
OutputStreamWriter流对象,它到底如何把字符转成字节输出的呢?
其实在OutputStreamWriter流中维护自己的高效区,当我们调用OutputStreamWriter对象的write方法时,会拿着字符到指定的码表中进行查询,把查到的字符编码值转成字节数存放到OutputStreamWriter高效区中。然后再调用刷新功能,或者关闭流,或者高效区存满后会把高效区中的字节数据使用字节流写到指定的文件中。
注意:
就是在使用转换流的时候,需要注意CharsetDecoder参数,当你调用一个参数的构造方法时,默认为系统的gbk;而假如要读取得文件或者是要入时文件格式是utf-8时,你就必须要制定编码,也就是说编码要保持一致,不然就是出现乱码!