编码与解码方式必须是同一种方式,不然会解析错误,造成乱码。
使用InputStreamReader可以用指定方式如:UTF-8,GBK读取字符流。
使用OutputStreamReader可以用指定方式写入字符流。
如果写入的是中文,但是却用的GBK方式写入,那么文件中也会出现乱码,但是如果读取的时候依然使用GBK方式读出,那么也可以成功读出这个中文。
这个与FileOutputStream的write的区别在于,write写入的是字符的某个字符集的二进制编码。
而OutputStreamReader是可以直接写入某个字符,然后打开文件的时候,文件使用这个指定的方式编码展示这个字符。如:写入”中国“,”UTG-8",那么文件中存的就是UTF-8下的"中国"。
也可以写二进制编码,然后在文件中被转换为二进制编码对应编码集的那个字符,如osw.write(99) 写入的就是c
public class StringDemo {
public static void main(String[] args) throws IOException {
String s="中国";
// byte[] bys=s.getBytes();
byte[] bys=s.getBytes("UTF-8");
System.out.println(Arrays.toString(bys));
String ss=new String(bys,"UTF-8");
System.out.println(ss);
FileOutputStream fos=new FileOutputStream("ieda_test\\src\\IO\\fos.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos,"GBK");
osw.write("中国");
osw.close();
InputStreamReader isr=new InputStreamReader(new FileInputStream("ieda_test\\src\\IO\\fos.txt"),"GBK");
int ch;
while ((ch=isr.read())!=-1){
System.out.print((char)ch);
}
isr.close();
}
}
执行结果:
fos.txt中的内容:
public class OutputStreamDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("ieda_test\\src\\IO\\fos.txt");
OutputStreamWriter osw=new OutputStreamWriter(fos);
osw.write("中国!!");
}
}
fos.txt中:什么也没有写入
原因:采用字符流写数据不能直接写入到文件中,而是通过FileOutputStream才能写入,现在其实还是在一个缓冲区中,要让数据从缓冲区进入到文件中去,需要使用
ows.flush()或者ows.close()才行。
需要注意:这里的便捷类只是在写和读数据的时候可以使用,如果涉及编码与解码问题,那么还是只能使用InputStreamReader和OutputStreamReader.
和字节缓冲流一样,速度更快了。但是还是有以下区别
要换行,可以加换行符\r\n但不同操作系统的换行符都不一样,所以这样不太好,可以使用newLine()来分行
同样的,可以使用readLine( )来只读取一行内容。
新年快乐!!
补充总结: