设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 创业者 数据 手机
当前位置: 首页 > 综合聚焦 > 编程要点 > 语言 > 正文

Java转换流 InputStreamReader和OutputStreamWriter

发布时间:2022-07-15 11:04 所属栏目:51 来源:互联网
导读:正常情况下,字节流可以对所有的数据进行操作,但是有些时候在处理一些文本时我们要用到字符流,比如,查看文本的中文时就是需要采用字符流更为方便。所以 Java IO 流中提供了两种用于将字节流转换为字符流的转换流。 InputStreamReader 用于将字节输入流转
  正常情况下,字节流可以对所有的数据进行操作,但是有些时候在处理一些文本时我们要用到字符流,比如,查看文本的中文时就是需要采用字符流更为方便。所以 Java IO 流中提供了两种用于将字节流转换为字符流的转换流。
 
  InputStreamReader 用于将字节输入流转换为字符输入流,其中 OutputStreamWriter 用于将字节输出流转换为字符输出流。使用转换流可以在一定程度上避免乱码,还可以指定输入输出所使用的字符集。
  例 1
  在 java.txt 中输出“C语言中文网”这 6 个字,将 java.txt 保存为“UTF-8”的格式,然后通过字节流的方式读取,代码如下:
  public static void main(String[] args) {
      try {
          FileInputStream fis = new FileInputStream("D://java.txt");
          int b = 0;
          while ((b = fis.read()) != -1) {
              System.out.print((char) b);
          }
      } catch (FileNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  }
  输出结果为 C??????????,我们发现中文都是乱码。下面用字节数组,并通过字符串设定编码格式来显式内容,代码如下:
  public static void main(String[] args) {
      try {
          FileInputStream fis = new FileInputStream("D://java.txt");
          byte b[] = new byte[1024];
          int len = 0;
          while ((len = fis.read(b)) != -1) {
              System.out.print(new String(b, 0, len, "UTF-8"));
          }
      } catch (FileNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  }
  这时输出结果为 C语言中文网,但是当存储的文字较多时,会出现解码不正确的问题,且字节长度无法根据解码内容自动设定,此时就需要转换流来完成。代码如下:
  public static void main(String[] args) {
      try {
          FileInputStream fis = new FileInputStream("D://java.txt");
          InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
          int b = 0;
          while ((b = isr.read()) != -1) {
              System.out.print((char) b);    // 输出结果为“C语言中文网”
          }
      } catch (FileNotFoundException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  }
  例 2
  下面以获取键盘输入为例来介绍转换流的用法。Java 使用 System.in 代表标准输出,即键盘输入,但这个标准输入流是 InputStream 类的实例,使用不太方便,而且键盘输入内容都是文本内容,所以可以使用 InputStreamReader 将其转换成字符输入流,普通的 Reader 读取输入内容时依然不太方便,可以将普通的 Reader 再次包装成 BufferedReader,利用 BufferedReader 的 readLine() 方法可以一次读取一行内容。程序如下所示。
  public static void main(String[] args) {
      try {
          // 将 System.in 对象转换成 Reader 对象
          InputStreamReader reader = new InputStreamReader(System.in);
          // 将普通的Reader 包装成 BufferedReader
          BufferedReader br = new BufferedReader(reader);
          String line = null;
          // 利用循环方式来逐行的读取
          while ((line = br.readLine()) != null) {
              // 如果读取的字符串为“exit”,则程序退出
              if (line.equals("exit")) {
                  System.exit(1);
              }
              // 打印读取的内容
              System.out.println("输入内容为:" + line);
          }
      } catch (IOException e) {
          // TODO Auto-generated catch block
          e.printStackTrace();
      }
  }
  上面代码第 4 行和第 6 行将 System.in 包装成 BufferedReader,BufferReader 流具有缓冲功能,它可以一次读取一行文本,以换行符为标志,如果它没有读到换行符,则程序堵塞,等到读到换行符为止。运行上面程序可以发现这个特征,在控制台执行输入时,只有按下回车键,程序才会打印出刚刚输入的内容。
 
  由于 BufferedReader 具有一个 readLine() 方法,可以非常方便地进行一次读入一行内容,所以经常把读入文本内容地输入流包装成 BufferedReader,用来方便地读取输入流的文本内容。
 
  学到这里,大家可能有一个疑问:既然有字节流转字符流的转换流,那么为什么没有字符流转字节流的转换流呢?
 
  这个问题一语指出了 Java 设计的遗漏之处,想一想字符流和字节流的差别。字节流比字符流的使用范围要更广,但字符流比字节流操作方便。如果有一个流已经是字符流了,也就是说,是一个用起来更方便的流,为什么要转换成字节流呢?反之,如果现在有一个字节流,但可以确定这个字节流的内容都是文本内容,那么把它转换成字符流来处理就会更方便一些,所以 Java 只提供了将字节流转换成字符流的转换流,没有提供将字符流转换成字节流的转换流。

(编辑:ASP站长网)

    网友评论
    推荐文章
      热点阅读