字符输出流与序列化( 六 )


public static void main(String[] args) {//1.将System.in字节输入流转成Reader字符流Reader reader = new InputStreamReader(System.in);// 再将普通的Reader字符流转成带缓冲区功能的BufferReader流BufferedReader br = new BufferedReader( reader );try {//2.读取用户通过键盘输入的一行文本//String line1 = br.readLine();//String line2 = br.readLine();//System.out.println( line1 );//System.out.println( line2 ); //3.使用循环来逐行读取用户通过键盘输入的每一行文本String line;while( (line=br.readLine()) != null ) {System.out.println( "输入的内容为: "+line );//如果读取的内容为exit, 则结束循环if( line.equals( "exit" ) ) {break;}}//4.关闭流br.close(); } catch (Exception e) {e.printStackTrace();}}
之所以将.in字节流包装成,因为流具有缓冲功能,它可以一次读取一行文本——以换行符为标志,如果它没有读到换行符,则程序阻塞,等到读到换行符为止 。运行上面程序可以发现这个特征,在控制台执行输入时,只有按下回车键,程序才会打印出刚刚输入的内容
7.4.案例
OutputStreamWriter负责将字节输出流转成字符输出流(转换时可以指定编码)OutputStreamWriter(OutputStream out)-- 创建一个 OutputStreamWriter 字符输出流对象, 该对象负责将 字节输出流 转成字符输出流-- 在将字节流转成字符流时, 默认使用系统默认字符集(win中, GBK)OutputStreamWriter(OutputStream out, String charsetName)-- 创建一个 OutputStreamWriter 字符输出流对象, 该对象负责将 字节输出流 转成字符输出流-- 在将字节流转成字符流时, 将会使用charsetName指定的字符集
通过字符输出流往文件中写数据时, 默认使用的是系统平台(GBK)
但如果要写入的文件中有数据,并且该文件使用的编码不是GBK, 而是utf-8, 那么此时将GBK编码的数据写入到utf-8的文件中, 就可能会出现乱码问题!
e.txt: 你好, utf-8
e.txt: 追加数据, 韩少云, , GBK
下面测试字符流写数据时可能出现的乱码问题!
public static void main(String[] args) {try {/* * 通过FileWriter字符输出流往文件中写数据时, 默认使用的是系统平台码(GBK)* 但如果e.txt文件中有数据,并且该文件使用的编码不是GBK,而是utf-8*那么此时将GBK编码数据写入到utf-8的文件中,就可能会出现乱码问题!*///1.创建FileWriter字符输出流对象,将数据写入到d:/demoout/e.txt文件中FileWriter writer=new FileWriter( "d:/demoout/e.txt", true );System.out.println( writer.getEncoding() );// 2.输出数据writer.write( "你好,马云\r\n" );// 3.关闭流writer.close();System.out.println( "写入成功!" );} catch (Exception e) {e.printStackTrace();}}
将字符流替换为字节流, 再通过将字节流转成字符流, 还可以指定编码, 修改后的代码如下
【字符输出流与序列化】public static void main(String[] args) {try {// 1.创建FileOutputStream字节输出流对象, 将数据写入到 d:/demoout/e.txt 文件中FileOutputStream out = new FileOutputStream( "d:/demoout/e.txt", true );// 2.通过OutputStreamWriter将字节流转成字符流, 并可以指定编码OutputStreamWriter writer = new OutputStreamWriter(out, "UTF-8");//System.out.println( writer.getEncoding() );// 3.输出数据writer.write( "你好,马云!\r\n" );// 4.关闭流writer.close();System.out.println( "写入成功!" );} catch (Exception e) {e.printStackTrace();}}