zoukankan      html  css  js  c++  java
  • Java IO流:(十三)InputStreamReader & OutputStreamWriter

    一、InputStreamReader

      1、InputStreamReader 类概述

        实现将字节的输入流按指定字符集转换为字符的输入流。

        需要和InputStream“套接”,转换流 java.io.InputStreamReader ,是Reader的子类,是从字节流到字符流的桥梁。

        该类读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。 

      2、InputStreamReader 类结构

        

         

      3、InputStreamReader 构造器

    InputStreamReader(InputStream in) 创建一个使用默认字符集的 InputStreamReader。
    
    InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
    

        

        参数

         InputStream in:字节输入流,用来读取文件中保存的字节

         String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8

      4、常用方法

    int read() 读取单个字符并返回。
    int read(char[] cbuf)一次读取多个字符,将字符读入数组。
    void close() 关闭该流并释放与之关联的所有资源。
    

      

      5、使用步骤

        ① 创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称

        ② 使用InputStreamReader对象中的方法read读取文件

        ③ 释放资源

        注意:构造方法中指定的编码表名称要和文件的编码相同,否则会发生乱码

      6、案例

     1     @Test
     2     public void test() throws IOException {
     3 
     4         FileInputStream fis = new FileInputStream("dbcp.txt");
     5         //InputStreamReader isr = new InputStreamReader(fis);//使用系统默认的字符集
     6         //参数2指明了字符集,具体使用哪个字符集,取决于文件dbcp.txt保存时使用的字符集
     7         InputStreamReader isr = new InputStreamReader(fis,"UTF-8");//使用指定的字符集
     8 
     9         char[] cbuf = new char[20];
    10         int len;
    11         while((len = isr.read(cbuf)) != -1){
    12             String str = new String(cbuf,0,len);
    13             System.out.print(str);
    14         }
    15 
    16         isr.close();
    17 
    18     }

      7、

    二、OutputStreamWriter

      1、OutputStreamWriter 类概述

        实现将字符的输出流按指定字符集转换为字节的输出流。

        需要和OutputStream“套接”,转换流 java.io.OutputStreamWriter,是Writer的子类,是从字符流到字节流的桥梁。

        它使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。 

        

      2、OutputStreamWriter 类结构

        

         

      3、构造方法

    OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter。
    
    OutputStreamWriter(OutputStream out, String charsetName) 创建使用指定字符集的 OutputStreamWriter。
    

      

        参数:

         OutputStream out:字节输出流,可以用来写转换之后的字节到文件中

         String charsetName:指定的编码表名称,不区分大小写,可以是utf-8/UTF-8,gbk/GBK,...不指定默认使用UTF-8

      4、常用方法

    void write(int c) 写入单个字符。
    
    void write(char[] cbuf)写入字符数组。
    
    void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
    
    void write(String str)写入字符串。
    
    void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
    
    void flush()刷新该流的缓冲。
    
    void close() 关闭此流,但要先刷新它。
    

      

      5、使用步骤

        ① 创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称

        ② 使用OutputStreamWriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)

        ③ 使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)

        ④ 释放资源

      6、案例

     1 public static void main(String[] args) throws IOException {
     2     //1.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称
     3     //OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\utf_8.txt"),"utf-8");
     4     OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\utf_8.txt"));//不指定默认使用UTF-8
     5     //2.使用OutputStreamWriter对象中的方法write,把字符转换为字节存储缓冲区中(编码)
     6     osw.write("你好");
     7     //3.使用OutputStreamWriter对象中的方法flush,把内存缓冲区中的字节刷新到文件中(使用字节流写字节的过程)
     8     osw.flush();
     9     //4.释放资源
    10     osw.close();
    11 }

    三、应用案例

      1、转换文件编码

        要求:GBK编码的文本文件,转换为UTF-8编码的文本文件。 

     1 /*
     2     分析:
     3         1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称GBK
     4         2.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称UTF-8
     5         3.使用InputStreamReader对象中的方法read读取文件
     6         4.使用OutputStreamWriter对象中的方法write,把读取的数据写入到文件中
     7         5.释放资源
     8  */
     9  public static void main(String[] args) throws IOException {
    10         //1.创建InputStreamReader对象,构造方法中传递字节输入流和指定的编码表名称GBK
    11         InputStreamReader isr = new InputStreamReader(new FileInputStream("E:\我是GBK格式的文本.txt"),"GBK");
    12         //2.创建OutputStreamWriter对象,构造方法中传递字节输出流和指定的编码表名称UTF-8
    13         OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("E:\我是utf_8格式的文件.txt"),"UTF-8");
    14         //3.使用InputStreamReader对象中的方法read读取文件
    15         int len = 0;
    16         while((len = isr.read())!=-1){
    17             //4.使用OutputStreamWriter对象中的方法write,把读取的数据写入到文件中
    18             osw.write(len);
    19         }
    20         //5.释放资源
    21         osw.close();
    22         isr.close();
    23     }

       

     1     @Test
     2     public void test() throws Exception {
     3         //1.造文件、造流
     4         File file1 = new File("dbcp.txt");
     5         File file2 = new File("dbcp_gbk.txt");
     6 
     7         FileInputStream fis = new FileInputStream(file1);
     8         FileOutputStream fos = new FileOutputStream(file2);
     9 
    10         InputStreamReader isr = new InputStreamReader(fis,"utf-8");
    11         OutputStreamWriter osw = new OutputStreamWriter(fos,"gbk");
    12 
    13         //2.读写过程
    14         char[] cbuf = new char[20];
    15         int len;
    16         while((len = isr.read(cbuf)) != -1){
    17             osw.write(cbuf,0,len);
    18         }
    19 
    20         //3.关闭资源
    21         isr.close();
    22         osw.close();
    23 
    24 
    25     }
  • 相关阅读:
    git拉取代码命令
    zookeeper(version3.6.3)安装使用《一》
    kafka(version2.1.3)安装<一>
    linux安装jdk
    linux安装支持文件上传下载的命令
    mapstruct 再也不用set不同的属性而劳累了
    RabbitMq确认消费,与重复消费避免使用冥等
    java8之非重入锁StampedLock ,并发的另一种处理方式
    微信Jssdk
    Vue-Router 的params和query传参两种方式
  • 原文地址:https://www.cnblogs.com/niujifei/p/14855908.html
Copyright © 2011-2022 走看看