JavaI/O流你需要熟练掌握的字符转换流(功能、代码实现、图文)

说明:
在JDK中,提供了两个类用于实现将字节流转换为字符流,它们分别是InputStreamReader和OutputStreamWriter。

InputStreamReader是Reader的子类,它可以将一个字节输入流转换成字符输入流,方便直接读取字符。
OutputStreamWriter是Writer的子类,它可以将一个字节输出流转换成字符输出流,方便直接写入字符。
转换流操作文件示意图:
在这里插入图片描述
示例(使用转换流拷贝文件):

    FileInputStream in = new FileInputStream("reader.txt");
    InputStreamReader isr = new InputStreamReader(in);
    BufferedReader br = new BufferedReader(isr); 
    FileOutputStream out = new FileOutputStream("writer.txt");
    OutputStreamWriter osw = new OutputStreamWriter(out);
    BufferedWriter bw = new BufferedWriter(osw); 
    String line = null;
    while ((line = br.readLine()) != null) {
          bw.write(line); 
          bw.newLine();
    }
    br.close();
    bw.close();
这代码不是很平凡?为什么还要学字符转换流?
因为在学习I/O流的过程中很容易出现文本乱码现象
这个时候就需要使用转换流进行修改,使其编码一致。
package liu;
import java.io.*;
//转换流只适合文本文件
public class ZhuanHuanLiu {
  public static void main(String[] args) throws IOException {
   //转换流可以在写的时候就设置相同的编码,防止拷贝时出现乱码
   FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
   OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
   osw.write("但是我还是一个孩子");
   osw.flush();
   osw.close();
   FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
   InputStreamReader isr = new InputStreamReader(fis,"UTF-8");
   int len= 0 ;
   char [] c = new char[1024];
   while((len = isr.read())!=-1) {
    System.out.print((char)len+" ");
   }
  }
}

在这里插入图片描述
上面的代码是通过参数都使用UTF-8格式,确保输入输出的格式相同,所以不会出现乱码的现象

package liu;
import java.io.*;
public class ZhuanHuanLiu2 {
  public static void main(String[] args) throws IOException {
   //转换流可以在写的时候就设置相同的编码,防止拷贝时出现乱码
   FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
   OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
   //BufferedWriter bw = new BufferedWriter(osw);
   String str = "但是我还是一个孩子" ;
   osw.write(str.toCharArray());
   osw.flush();
   osw.close();
   FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
   InputStreamReader isr = new InputStreamReader(fis,"gbk");
   int len= 0 ;
   char [] c = new char[1024];
   while((len = isr.read(c))!=-1) {
    System.out.print(new String(c,0,len));
   }
   isr.close();
  }
}

在这里插入图片描述
上面的代码先写,再读,使用的都是gbk格式,保证编码格式的一致性

package liu;
import java.io.*;
public class ZhuanHuanLiu3 {
  public static void main(String[] args) throws IOException {
   //转换流可以在写的时候就设置相同的编码,防止拷贝时出现乱码
   FileOutputStream fos = new FileOutputStream("c:\\javas\\b.txt");
   OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
   BufferedWriter bw = new BufferedWriter(osw);
   String str = "但是我还是一个孩子" ;
   bw.write(str);
   bw.flush();
   bw.close();
   FileInputStream fis = new FileInputStream("c:\\javas\\b.txt");
   InputStreamReader isr = new InputStreamReader(fis,"gbk");
   BufferedReader br = new BufferedReader(isr);
   String len= null ;
   while( (len = br.readLine()) !=null) {
    System.out.println(len);
   }
   br.close();
  }
}

在这里插入图片描述
上面的代码使用了缓冲流的原理,更加方便(可以使用readline()方法)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱睡觉的小馨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值