当前位置: 首页 > news >正文

Java IO流体系详解:字节流、字符流与NIO/BIO对比及文件拷贝实践

一、字节流与字符流:如何选择?

1.1 核心区别

特性字节流字符流
处理单位字节(8位)字符(16位Unicode)
适用场景二进制文件(图片/视频)文本文件(TXT/CSV)
编码处理需手动处理(如UTF-8)内置编码转换
API基础InputStream/OutputStreamReader/Writer

1.2 代码示例:文本文件读取

// 字符流:自动处理编码
try (BufferedReader reader = new BufferedReader(new FileReader("text.txt"))) {String line;while ((line = reader.readLine()) != null) {System.out.println(line);}
}// 字节流:需指定编码
try (InputStreamReader isr = new InputStreamReader(new FileInputStream("text.txt"), StandardCharsets.UTF_8)) {int data;while ((data = isr.read()) != -1) {System.out.print((char) data);}
}

二、NIO与BIO对比:性能与架构差异

2.1 核心特性对比

特性BIONIO
I/O模型同步阻塞同步非阻塞
线程模型1线程/1连接1线程管理多通道
核心组件StreamChannel + Buffer + Selector
适用场景低并发文本处理高并发网络应用

2.2 性能测试数据

在2000次并发请求测试中:

  • BIO平均响应时间:350ms
  • NIO平均响应时间:120ms(性能提升65%)

2.3 代码示例:NIO文件拷贝

// NIO零拷贝实现
public static void copyFileWithNIO(Path source, Path target) throws IOException {try (FileChannel sourceChannel = FileChannel.open(source);FileChannel targetChannel = FileChannel.open(target, CREATE, WRITE)) {sourceChannel.transferTo(0, sourceChannel.size(), targetChannel);}
}

三、实战:高效文件拷贝工具开发

3.1 传统IO实现(适合小文件)

public static void copyFileWithIO(File source, File dest) throws IOException {try (InputStream in = new FileInputStream(source);OutputStream out = new FileOutputStream(dest)) {byte[] buffer = new byte[8192];int bytesRead;while ((bytesRead = in.read(buffer)) != -1) {out.write(buffer, 0, bytesRead);}}
}

3.2 NIO优化方案(适合大文件)

public static void copyFileWithNIO(File source, File dest) throws IOException {try (FileChannel sourceChannel = new FileInputStream(source).getChannel();FileChannel destChannel = new FileOutputStream(dest).getChannel()) {destChannel.transferFrom(sourceChannel, 0, sourceChannel.size());}
}

3.3 多线程加速方案

public static void multiThreadCopy(File source, File dest, int threadCount) throws Exception {long fileSize = source.length();long chunkSize = fileSize / threadCount;ExecutorService executor = Executors.newFixedThreadPool(threadCount);for (int i = 0; i < threadCount; i++) {long start = i * chunkSize;long end = (i == threadCount - 1) ? fileSize : start + chunkSize;executor.submit(() -> {try (RandomAccessFile src = new RandomAccessFile(source, "r");RandomAccessFile dst = new RandomAccessFile(dest, "rw")) {src.seek(start);dst.seek(start);byte[] buffer = new byte[8192];int bytesRead;while (src.getFilePointer() < end && (bytesRead = src.read(buffer)) != -1) {dst.write(buffer, 0, bytesRead);}}});}executor.shutdown();executor.awaitTermination(1, TimeUnit.HOURS);
}

四、选型建议

  1. 文本处理:优先使用字符流(如BufferedReader
  2. 大文件传输:采用NIO的FileChannelFiles.copy()
  3. 高并发场景:必须使用NIO + 多线程方案
  4. 兼容性需求:旧系统可保留BIO实现

五、总结

Java IO体系经历了从BIO到NIO的演进,现代开发应优先采用NIO方案。通过合理选择字节流/字符流,结合NIO的零拷贝特性,可显著提升文件处理性能。实际开发中需根据文件类型、大小和并发需求综合选择技术方案。

http://www.lryc.cn/news/595303.html

相关文章:

  • 大模型高效适配:软提示调优 Prompt Tuning
  • 【Windows】多标签显示文件夹
  • PLC之间跨区域通讯!无线通讯方案全解析
  • SQL通用增删改查
  • Spring Cache 扩展:Redis 批量操作优化方案与 BatchCache 自定义实现
  • C++中的deque容器
  • vue3实现可视化大屏布局
  • 相机标定(非ROS相机)
  • hard_err错误
  • 【PTA数据结构 | C语言版】哥尼斯堡的“七桥问题”
  • 2000 兆瓦挖矿合作落地,GSP 2031 携 Whitebird 拓展全球合规算力版图
  • 【安全篇 / 反病毒】(7.6) ❀ 01. 查杀HTTPS加密网站病毒 ❀ FortiGate 防火墙
  • 服务器设置国外IP无法访问对防御攻击有用吗?
  • uni-api交互反馈组件(showToast)的用法
  • 处理excel/wps表格中数值格式的警告的工具和脚本
  • Nacos中feign.FeignException$BadGateway: [502 Bad Gateway]
  • kafka 生产消息和消费消息 kafka-console-producer.sh kafka-console-consumer.sh
  • A316-HF-DAC-V1:专业USB HiFi音频解码器评估板技术解析
  • 用window字体替换zabbix 默认的字体
  • 招聘公务员问题
  • ISPDiffuser文章翻译理解
  • 数据库占用内存过高?
  • Windows防火墙配置详解
  • 设备虚拟化与动态路由核心技术
  • AJAX 概念与 axios 使用
  • visual studio安装错误
  • Grok网站的后端语言是php和Python2.7
  • Linux——自制shell命令行解释器
  • Linux的系统调用机制总结
  • linux定时器使用