IO流加强之转换流字符编码转换演示(读,写)

来源:互联网 发布:软件开发和软件研发 编辑:程序博客网 时间:2024/06/05 17:41

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;


import org.junit.Test;


/*
 * 
/*字符流的编码与解码方案
* 1.采用filewriter以默认方式编码  
 FileOutputStream+默认编码表
* 2采用转换流以默认方式编码
    OutputStreamWriter + FileOutputStream + 默认编码表
*3采用转换流以指定编码方式编码
    OutputStreamWriter + FileOutputStream +指定编码表
*4采用转换流以指定编码方式解码
    InputStreamReader + FileInputStream +指定编码
  * 转换流: 
  * 1)数据转换
     InputStreamReader: 该类本身是字符(Reader)系列, 功能:能够把字节输入流转换成字符输入流
     OutputStreamWriter: 该类本身是字符(Writer)系列, 功能:能够把字符输出流转换成字节输出流
   2)编码转换
          能够对流数据进行字符编码转换
 */
public class TranfererStreamDemo {
/* 需求:模拟英文聊天程序,要求:
    (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") );//指定以utf-8编码写

String str = "好好学习";
bw.write(str);
bw.close();
}


}








1 0
原创粉丝点击