转换流 InputStreamReader和InputStreamWriter完成字符与字符编码字节的转换,在字节流和字符流间架起了一道桥梁。类FileReader和FileWriter分别是两个转换流的子类,实现文件读写访问

1、转换输入流 InputStreamReader

BufferedReader in=new BufferedReader( new InputStreamReader(System.in));
String x=in.readLine();
【说明】 标准输入(键盘)提供的数据是字节形式的,实际上,从键盘输入的数据是字符系列,转换成字符流更符合应用的特点,因此使用InputStreamReader将字节流转换为字符流,又为了能一次性从键盘输入一 行字符串,再用BufferedReader对字符流进行包装处理,如图,进而用BufferedReader 的readLine()方法读取一行字符串。
image.png

类InputStreamReader的常用构造方法

  • public InputStreamReader(InputStream in):

创建转换输入流,按默认字符集的编码从输入流读数据;

  • public InputStreamReader(InputStream in,Charset c):

创建转换输入流,按指定字符集的编码从输入流读数据;

  • public InputStreamReader(InputStream in, String enc)throws UnsupportedEncodingException

创建转换输入流,按名称所指字符集的编码从输入流读数据。
例:
InputStream filein = new FileInputStream(file);
Reader in = new InputStreamReader(filein, “ISO-8859-1”);
按“ISO-8859-1”字符集编码从文件读数据,并将字节数据转换为相应的UTF-16字符。中文字符会变成“??”,也就是出现乱码。
支持汉字的编码字符集有GB2312、GBK、UTF-8、UTF-16。其中GBK是GB2312的扩展,它们均是双字节编码,UTF-16采用定长的双字节,而UTF-8采用变长字节表示不同字符。

  1. InputStreamReader isr=null;
  2. try {
  3. isr=new InputStreamReader(new FileInputStream(“paper.txt”), "gbk"); //gbk,utf-8
  4. }catch(FileNotFoundException e) {
  5. System.out.println("file not found");
  6. }
  7. BufferedReader in=new BufferedReader(isr);
  8. String x=in.readLine();
  9. while(x!=null)
  10. {
  11. System.out.println(x);
  12. x=in.readLine();
  13. }

2、转换输出流OutputStreamWriter

类OutputStreamWriter是Writer的子类。将UTF-16字符转换为指定的字符编码形式写入到字节输出流。

  • 构造方法有:public OutputStreamWriter (OutputStream out):

创建转换输出流,按默认字符集的编码往输出流写数据。

  • public OutputStreamWriter (OutputStream out,Charset c):

创建转换输出流,按指定字符集的编码往输出流写数据。

  • public OutputStreamWriter (OutputStream out,String enc) throws UnsupportedEncodingException :

创建转换输出流,按名称所指字符集的编码往输出流写数据。

  1. String s="hello,大家好";
  2. OutputStreamWriter osw=null;
  3. try {
  4. osw=new InputStreamReader(new FileOutputStream("x.txt"),"utf-8");
  5. }catch(FileNotFoundException e){
  6. System.out.println("file not found");
  7. }
  8. try {
  9. osw.write(s);
  10. osw.close();
  11. }catch(IOException e){}