一、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     }

 

posted on 2021-06-06 17:49  格物致知_Tony  阅读(179)  评论(0编辑  收藏  举报

目录导航