转换流
转换流 主要用于处理字符数据的输入和输出。与字节流(InputStream和OutputStream)不同,转换流是基于字符的流,能够自动处理字符编码和解码。
字符编码
字符编码 就是一套自然语言的字符与二进制数之间的对应规则。
编码:按照某种规则,将字符存储到计算机中,称为编码。
解码:将存储在计算机中的二进制数按某种规则解析显示出来,称为解码。
字符集
字符集也叫编码表,是一个系统支持的所有字符的集合,包括各国文字、标点符号、图形符号、数字等。
计算机要准确的存储和识别各种字符集符号,需要进行字符编码,一套字符集必然至少有一套字符编码。常见字符集有 ASCII字符集、GBK字符集、Unicode字符集。
InputStreamReader
InputStreamReader
继承自 Reader类,作用是将字节流转换为字符流。它是字符流和字节流之间的桥梁,允许你将字节数据(如文件或网络数据)读取并转换为字符数据。
构造函数:
构造函数 | 描述 |
---|---|
InputStreamReader(InputStream in) | 创建字符输入流,默认编码 UTF-8 |
InputStreamReader(InputStream in, String charsetName) | 创建字符输入流,指定字符串格式编码(如UTF-8,GBK),可忽略大小写 |
InputStreamReader(InputStream in, Charset cs) | 创建字符输入流,使用 Charset 字符集指定编码 |
由于其继承自 Reader 类,所以常用方法和 Reader 类一致。
java
public static void main(String[] args) throws IOException {
// 默认编码是UTF-8
InputStreamReader isr
= new InputStreamReader(new FileInputStream("E:\\StudyCode\\1.txt"));
// 可以手动写入字符串编码"UTF-8",但是编辑器会有更好的提示,使用 StandardCharsets.UTF_8
InputStreamReader isr
= new InputStreamReader(new FileInputStream("E:\\StudyCode\\1.txt"), StandardCharsets.UTF_8);
int read = isr.read();
System.out.println((char) read);
isr.close();
}
但是,为了能够有更好的效率,推荐将 InputStreamReader 包装在 BufferedReader 中,如:
java
@Test
public void test1() throws IOException {
FileInputStream fis = new FileInputStream("E:\\StudyCode\\1.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis, StandardCharsets.UTF_8));
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
br.close();
}
OutputStreamWriter
OutputStreamWriter
继承自 Writer 类,作用是将字符流转换为字节流。它允许将字符数据转换为字节数据,并手动指定编码类型。
构造函数:
构造函数 | 描述 |
---|---|
OutputStreamWriter(OutputStream out) | 创建字符输出流,默认编码为 UTF-8 |
OutputStreamWriter(OutputStream out, String charsetName) | 创建字符输出流,指定字符串格式编码(如UTF-8,GBK),可忽略大小写 |
OutputStreamWriter(OutputStream out, Charset cs) | 创建字符输出流,使用 Charset 字符集指定编码 |
由于其继承自 Writer 类,所以常用方法与 Writer 类一致。
java
@Test
public void test() throws IOException {
// 默认编码UTF-8
OutputStreamWriter osw
= new OutputStreamWriter(new FileOutputStream("E:\\StudyCode\\1.txt"));
// 使用编码为"GBK"
OutputStreamWriter osw
= new OutputStreamWriter(new FileOutputStream("E:\\StudyCode\\1.txt"), "GBK");
osw.write("落霞与孤鹜齐飞,\n");
osw.write("秋水共长天一色。");
osw.close();
}
但是,为了能够有更好的性能,推荐将 OutputStreamWriter 包装在 BufferedReader 中,如:
java
@Test
public void test1() throws IOException {
FileOutputStream fos = new FileOutputStream("E:\\StudyCode\\1.txt");
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(fos, StandardCharsets.UTF_8));
bw.write("斯是陋室,\n");
bw.write("为吾德馨。");
bw.close();
}