IO 硬核实践:字节/字符、缓冲策略、NIO/内存映射与编码治理
大约 2 分钟
IO 硬核实践:字节/字符、缓冲策略、NIO/内存映射与编码治理
新手先看 · 一屏速览
- 字节流处理原始字节;字符流配合 Charset;外部交互统一 UTF-8
- 总是用缓冲(BufferedInputStream/BufferedReader);总是用 try-with-resources
- 目录操作优先
java.nio.file.Files与PathAPI
1. 字节 vs 字符:编码边界清晰化
try (var in = new FileInputStream(p); var reader = new InputStreamReader(in, StandardCharsets.UTF_8)) {
int ch = reader.read();
}- 字节流不涉字符编码;字符流与 Charset 有关,避免平台默认(保证跨平台一致)
- 日志/网络/持久化统一 UTF-8;边界层完成字节↔字符的转换
2. 缓冲与性能:系统调用与吞吐
try (var in = new BufferedInputStream(new FileInputStream(p))) {
byte[] buf = new byte[8192];
while (in.read(buf) != -1) {}
}- 8K 或更大缓冲常见;减少系统调用次数、充分利用页缓存
- 小对象频繁 read/write → 合并批量操作;使用
Buffered*/批量read(byte[])
3. NIO 与文件操作:Channel/Path/遍历
Files.walk(path).filter(Files::isRegularFile).forEach(System.out::println);Files与Path提供丰富操作:遍历、复制、移动、删除、匹配(glob)FileChannel支持位置读写、transferTo/From零拷贝;适合大文件复制
4. 内存映射与异步 IO
最近建一些几十个工作内推群,各大城市都有,群里目前已经收集了很多内推岗位,大厂、中厂、小厂、外包都有。 欢迎HR、开发、测试、运维和产品加入。

扫描下方微信,备注:网站+所在城市,即可拉你进工作内推群。

try (var ch = FileChannel.open(p, StandardOpenOption.READ)) {
MappedByteBuffer map = ch.map(FileChannel.MapMode.READ_ONLY, 0, ch.size());
// 直接在内核页缓存上映射的内存读
}- MappedByteBuffer 适合超大文件随机读;注意释放时机与平台差异
AsynchronousFileChannel支持异步读写,结合回调/CompletableFuture
5. 资源管理与抑制异常
- try-with-resources 自动关闭;关闭异常可通过
getSuppressed()获取
6. 实战清单与反模式
- 清单:统一 UTF-8;缓冲优先;
FilesAPI;明确异常处理 - 反模式:忘关流;平台默认编码;每次 read 一个字节;自己拼路径字符串
7. 练习
- 实现文件树遍历并按后缀过滤,统计大小与数量
- 读取大文件并计算行数、字符数,控制内存占用
