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

Java 输入流到输出流

Java 输入流到输出流的复制方法主要有以下六种实现方式,根据性能、适用场景和实现原理可分为不同类别:

一、基础字节流方式

实现原理:通过 FileInputStreamFileOutputStream 逐字节或块读取数据并写入。
代码示例

try (InputStream in = new FileInputStream("source.txt");
     OutputStream out = new FileOutputStream("dest.txt")) {
    byte[] buffer = new byte[1024];
    int len;
    while ((len = in.read(buffer)) != -1) {
        out.write(buffer, 0, len);
    }
}

特点:实现简单但效率较低,适用于小文件。

二、缓冲流优化

实现原理:通过 BufferedInputStreamBufferedOutputStream 包装基础流,利用内存缓冲区减少 I/O 操作次数。
代码示例

try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("source.txt"));
     BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("dest.txt"))) {
    byte[] buffer = new byte[8192];
    int len;
    while ((len = bis.read(buffer)) != -1) {
        bos.write(buffer, 0, len);
    }
}

特点:缓冲区(通常设为 8KB 以上)可提升 2-5 倍性能,适合中小文件。

三、NIO 通道零拷贝

实现原理:使用 FileChannel.transferTo()transferFrom() 方法,直接调用操作系统的零拷贝技术(如 Linux 的 sendfile)。
代码示例

try (FileChannel inChannel = new FileInputStream("source.txt").getChannel();
     FileChannel outChannel = new FileOutputStream("dest.txt").getChannel()) {
    inChannel.transferTo(0, inChannel.size(), outChannel);
}

特点:数据在内核态直接传输,避免用户态内存拷贝,适合大文件(>100MB)。

四、Files.copy 工具方法

实现原理:通过 java.nio.file.Files 类的静态方法 copy() 实现,底层可能使用用户态循环或优化策略。
代码示例

Path source = Paths.get("source.txt");
Path dest = Paths.get("dest.txt");
Files.copy(source, dest, StandardCopyOption.REPLACE_EXISTING);

特点:代码简洁,但性能略低于零拷贝,适合快速开发场景。

五、内存映射文件(MappedByteBuffer)

实现原理:通过 FileChannel.map() 将文件映射到内存地址,直接操作内存实现高效读写。
代码示例

try (RandomAccessFile raf = new RandomAccessFile("source.txt", "r");
     FileChannel channel = raf.getChannel()) {
    MappedByteBuffer buffer = channel.map(FileChannel.MapMode.READ_ONLY, 0, channel.size());
    // 直接通过 buffer 操作数据并写入输出流
}

特点:适合超大文件(>1GB)的随机访问,但需注意内存管理风险。

六、第三方工具库

实现原理:使用 Apache Commons IO 的 FileUtils.copyFile() 封装底层流操作。
代码示例

File source = new File("source.txt");
File dest = new File("dest.txt");
FileUtils.copyFile(source, dest);

特点:简化代码,但依赖外部库。


性能对比与选型建议

方法性能排序适用场景引用来源
NIO 通道零拷贝★★★★★大文件传输(>100MB)
内存映射文件★★★★☆超大文件随机访问
缓冲流★★★☆☆中小文件通用场景
Files.copy()★★☆☆☆快速开发、小文件
基础字节流★☆☆☆☆学习或极小型文件

扩展知识

  1. 零拷贝技术原理:通过 transferTo() 调用系统级函数(如 sendfile),跳过用户态缓冲区,减少 CPU 上下文切换。
  2. 缓冲区大小优化:建议缓冲区设为 8KB~1MB,过小会导致频繁系统调用,过大可能浪费内存。
  3. 堆外内存管理:使用 DirectByteBuffer 时需手动释放或依赖 JVM 的 Cleaner 机制,避免内存泄漏。

实际开发中,优先选择 NIO 通道或缓冲流方案,第三方库可简化代码但需权衡依赖。

http://www.dtcms.com/a/98250.html

相关文章:

  • 开发过程中需要安装的浏览器插件
  • 【学Rust写CAD】17 通用2D仿射变换矩阵结构体(matrix/generic.rs)
  • keil中文注释出现乱码怎么解决
  • Selenium自动化测试中常见报错类型及解决方案
  • 【Qt】三种操作sqlite3的方式及其三种多表连接
  • 总结PostgreSQL创建数据库失败的解决办法
  • SQL语句及其应用(中)(DQL语句之单表查询)
  • 机器学习的一百个概念(1)单位归一化
  • java项目之基于ssm的乡镇自来水收费系统(源码+文档)
  • 签名计算:对所有传入参数按照字段名的 ASCII 码从小到大排序(字典序)【java版本、JS(Vue)、iOS版本的实现】
  • LocalDateTime序列化总结
  • 接龙数列(最长上升 动规)
  • 第十六章 常用算法
  • 自动化与智能化的认知差异
  • 【即插即用涨点模块-卷积】SPDConv空间深度卷积,助力小目标与低分辨有效涨点【附源码+注释】
  • 28_跨域
  • Android设计模式之模板方法模式
  • 如何在 AI 搜索引擎(GEO)霸屏曝光,快速提升知名度?
  • RabbitMQ高级特性--重试特性
  • 【C++初阶】第12课—list
  • 人工智能入门(1)
  • 字符和字符串的输入方式
  • 安当SLAc操作系统安全登录解决方案:破解设备供应商Windows权限失控困局
  • 全自动数字网络机器人:重塑未来的无形引擎 ——从金融量化到万物互联,为何必须“ALL IN”?
  • MySQL 中的表连接(JOIN)详解
  • 六十天前端强化训练之第三十五天之Jest单元测试大师课:从入门到实战
  • 【C++20】format格式化输出
  • 每日一题 == 674. 最长连续递增序列
  • 26_ajax
  • qgis点从面图层上拾取属性