字符编码 和 文件读写
理解字符编码原理与常见编码
掌握字节流和字符流的使用
能实现文件的读写操作
核心讲解
(1)字符编码
计算机存的是二进制,文字和二进制的转换规则就是编码。
ASCII:英文,1 字节
GBK:国标,中文 2 字节
UTF-8:国际通用,中文 3 字节,推荐使用
乱码原因:编码和解码用的标准不一样
(2)IO 流分类
按方向:输入流(读)、输出流(写)
按单位:字节流(处理所有文件)、字符流(处理文本文件)
字节流基类:InputStream、OutputStream
字符流基类:Reader、Writer
(3)常用流类
文件字节流:
FileInputStream、FileOutputStream文件字符流:
FileReader、FileWriter缓冲流:
BufferedReader、BufferedWriter,带缓冲,效率高
(4)try-with-resources
Java 7+,自动关闭流,不用手动 finally 关流。
try (流对象) {
}
代码示例
import java.io.*;
import java.nio.charset.StandardCharsets;
public class IODemo {
public static void main(String[] args) {
String filePath = "test.txt";
// ===== 字符流写文件 =====
try (FileWriter writer = new FileWriter(filePath, StandardCharsets.UTF_8)) {
writer.write("第一行内容\n");
writer.write("第二行:Java文件读写\n");
} catch (IOException e) {
e.printStackTrace();
}
// ===== 字符流读文件 =====
try (BufferedReader reader = new BufferedReader(
new FileReader(filePath, StandardCharsets.UTF_8))) {
String line;
while ((line = reader.readLine()) != null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
}
// ===== 字节流复制文件 =====
try (FileInputStream fis = new FileInputStream("test.txt");
FileOutputStream fos = new FileOutputStream("copy.txt")) {
byte[] buffer = new byte[1024];
int len;
while ((len = fis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
}
System.out.println("文件复制完成");
} catch (IOException e) {
e.printStackTrace();
}
}
}
常见误区
不指定编码:默认用系统编码,不同系统不一样会乱码,显式指定 UTF-8
流用完不关闭:会占用资源,一定要关闭,推荐用 try-with-resources 自动关
字符流读二进制文件:图片、视频等二进制文件要用字节流,用字符流会损坏
read () 返回 - 1 还继续读:读到 - 1 就是结束了,循环条件要写对
课后练习
用字符流写一个文件,写入你的姓名、年龄、专业
用 BufferedReader 读取刚才的文件,逐行输出
用字节流实现一个文件的复制
说明字节流和字符流的区别和适用场景

