文章目录
- 转换流的理解
- **InputStreamReader**
- **OutputStreamWriter**
- 练习
引入情况1:
使用FileReader
读取项目中的文本文件。由于IDEA设置中针对项目设置了UTF-8编码,当读取Windows系统中创建的文本文件时,如果Windows系统默认的是GBK编码,则读入内存中会出现乱码。
import java.io.FileReader;
import java.io.IOException;public class Problem {public static void main(String[] args) throws IOException {FileReader fileReader = new FileReader("E:\\File_GBK.txt");int data;while ((data = fileReader.read()) != -1) {System.out.print((char)data);}fileReader.close();}
}输出结果:
���
那么如何读取GBK编码的文件呢?
引入情况2:
针对文本文件,现在使用一个字节流进行数据的读入,希望将数据显示在控制台上。此时针对包含中文的文本数据,可能会出现乱码。
转换流的理解
作用:转换流是字节与字符间的桥梁!
具体来说:
InputStreamReader
-
转换流
java.io.InputStreamReader
,是Reader的子类,是从字节流到字符流的桥梁。它读取字节,并使用指定的字符集将其解码为字符。它的字符集可以由名称指定,也可以接受平台的默认字符集。 -
构造器
InputStreamReader(InputStream in)
: 创建一个使用默认字符集的字符流。InputStreamReader(InputStream in, String charsetName)
: 创建一个指定字符集的字符流。
-
举例
//使用默认字符集
InputStreamReader isr1 = new InputStreamReader(new FileInputStream("in.txt"));
//使用指定字符集
InputStreamReader isr2 = new InputStreamReader(new FileInputStream("in.txt") , "GBK");
示例代码:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;public class InputStreamReaderDemo {public static void main(String[] args) throws IOException {// 定义文件路径,文件为gbk编码String fileName = "E:\\file_gbk.txt";//方式1:// 创建流对象,默认UTF8编码InputStreamReader isr1 = new InputStreamReader(new FileInputStream(fileName));// 定义变量,保存字符int charData;// 使用默认编码字符流读取,乱码while ((charData = isr1.read()) != -1) {System.out.print((char)charData); // ��Һ�}isr1.close();//方式2:// 创建流对象,指定GBK编码InputStreamReader isr2 = new InputStreamReader(new FileInputStream(fileName) , "GBK");// 使用指定编码字符流读取,正常解析while ((charData = isr2.read()) != -1) {System.out.print((char)charData);// 大家好}isr2.close();}
}
OutputStreamWriter
-
转换流
java.io.OutputStreamWriter
,是Writer的子类,是从字符流到字节流的桥梁。使用指定的字符集将字符编码为字节。它的字符集可以由名称指定,也可以接受平台的默认字符集。 -
构造器
OutputStreamWriter(OutputStream in)
: 创建一个使用默认字符集的字符流。OutputStreamWriter(OutputStream in,String charsetName)
: 创建一个指定字符集的字符流。
-
举例:
//使用默认字符集
OutputStreamWriter isr = new OutputStreamWriter(new FileOutputStream("out.txt"));
//使用指定的字符集
OutputStreamWriter isr2 = new OutputStreamWriter(new FileOutputStream("out.txt") , "GBK");
示例代码:
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;public class OutputStreamWriterDemo {public static void main(String[] args) throws IOException {// 定义文件路径String FileName = "E:\\out_utf8.txt";// 创建流对象,默认UTF8编码OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(FileName));// 写出数据osw.write("你好"); // 保存为6个字节osw.close();// 定义文件路径String FileName2 = "E:\\out_gbk.txt";// 创建流对象,指定GBK编码OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream(FileName2),"GBK");// 写出数据osw2.write("你好");// 保存为4个字节osw2.close();}
}
练习
把当前module下的《好好学习.txt》字符编码为GBK,复制到电脑桌面目录下的《寄语.txt》,
字符编码为UTF-8。
在当前module下的文本内容:
六项精进:
(一)付出不亚于任何人的努力
(二)要谦虚,不要骄傲
(三)要每天反省
(四)活着,就要感谢
(五)积善行、思利他
(六)不要有感性的烦恼
代码:
public class InputStreamReaderDemo {@Testpublic void test() {InputStreamReader isr = null;OutputStreamWriter osw = null;try {isr = new InputStreamReader(new FileInputStream("好好学习.txt"),"gbk");osw = new OutputStreamWriter(new FileOutputStream("C:\\Users\\Desktop\\寄语.txt"),"utf-8");char[] cbuf = new char[1024];int len;while ((len = isr.read(cbuf)) != -1) {osw.write(cbuf, 0, len);osw.flush();}System.out.println("文件复制完成");} catch (IOException e) {e.printStackTrace();} finally {try {if (isr != null)isr.close();} catch (IOException e) {e.printStackTrace();}try {if (osw != null)osw.close();} catch (IOException e) {e.printStackTrace();}}}}