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