转换流的用法

/*
 * 转换流: 
 * 1)数据转换
     InputStreamReader: 该类本身是字符(Reader)系列, 功能:能够把字节输入流转换成字符输入流
     OutputStreamWriter: 该类本身是字符(Writer)系列, 功能:能够把字符输出流转换成字节输出流
   2)编码转换
          能够对流数据进行字符编码转换
 */
public class TranferedStreamDemo {


/* 需求:模拟英文聊天程序,要求:
     (1) 从键盘录入英文字符,每录一行就把它转成大写输出到控制台;
     (2) 保存聊天记录到字节流文件。   */
@Test
public void demo1() throws IOException{
//需求1分析:
//键盘输入: System.in ---字节流
//处理字符数据,最好用字符流
//综上,把字节流转换成字符流处理比较好
//另外,要把字符按行处理,用缓冲流比较好。又因为已经转换成字符流,所以用字符缓冲流

//需求2分析:
//程序中目前的数据是字符数据,用字符流处理比较好
//同时,题目要求写到字节流文件,最终得用字节流写
//综上,把字符流转换成字节流处理比较好
//同理,想操作方便又速度快点,加字符流的缓冲

InputStreamReader isr = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(isr);

BufferedWriter bw = new BufferedWriter(
               new OutputStreamWriter(
                new FileOutputStream("chat.txt")
               )
           );

String str=null;
while((str=br.readLine())!=null){
str = str.toUpperCase();
if(str.equals("OVER")){
break;
}
System.out.println(str);
//bw.write(str+"\n");//Linux方式。该方式用记事本不是换行显示,但写字板是
//bw.write(str+"\r\n");//windows方式。该方式用记事本和写字板都是换行显示
bw.write(str);
bw.newLine();//根据系统平台,自动添加(回车)换行
}
bw.close();//凡是字符流,都要记得刷缓存---close()方法在关注的同时会刷一次缓存
}

/*字符编码转换演示:读、写
*/
@Test //采用默认编码(当前MyEclipse中设置的是utf-8)
public void readDemo1() throws IOException{
//BufferedReader br = new BufferedReader(new FileReader("test_utf8.txt"));//正常显示
BufferedReader br = new BufferedReader(new FileReader("test_gbk.txt"));//乱码
String str=null;
while( (str=br.readLine())!=null ){
System.out.println(str);
}
br.close();
}

@Test //采用我们指定的编码来读---使用InputStreamReader
public void readDemo2() throws IOException{
//BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test_gbk.txt")) ); //默认编码,乱码
//BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test_utf8.txt"),"utf-8") ); //解决乱码
BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("test_gbk.txt"),"gbk") ); //解决乱码
String str=null;
while( (str=br.readLine())!=null ){
System.out.println(str);
}
br.close();
}

@Test //采用默认编码(当前MyEclipse中设置的是utf-8)
public void writeDemo1() throws IOException{
BufferedWriter bw = new BufferedWriter(new FileWriter("test_0.txt"));//以默认编码写(当前MyEclipse设置的是utf-8)
String str = "湖南城市大学";
bw.write(str);
bw.close();
}

@Test //以指定的编码进行(和系统的默认编码无关)
public void writeDemo2() throws IOException{
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test_1.txt")) );//以系统默认的编码写
//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test1_gbk.txt"),"GBK") );//指定以GBK编码写  ----"gbk"和"GBK"等效
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("test1_utf8.txt"),"UTF-8") );//指定以GBK编码写

String str = "湖南城市大学";
bw.write(str);
bw.close();
}


//总之,如果字符文件写入的编码和读取的编码相同则不会出现中文乱码,否则会出现乱码!
}

你可能感兴趣的:(io流)