InputStream.transferTo是Java 9引入的高效流传输方法,自动将输入流全部数据写入输出流,支持零拷贝优化,不自动关闭流,需异常处理和显式资源管理。

InputStream.transferTo 是 Java 9 引入的便捷方法,用于将输入流中的全部数据**高效、自动地写入**到指定的 OutputStream,无需手动循环读写。它内部使用 NIO 的 FileChannel(如底层支持)或优化的缓冲区复制,性能优于传统 while 循环 + byte[] 数组方式。
基本用法:一行完成流传输
只要两个流都未关闭且可访问,调用非常简单:
inputStream.transferTo(outputStream);
该方法会持续读取 inputStream 直到 EOF,并把所有字节写入 outputStream。执行完成后,inputStream 被完全读空(但不会自动关闭),outputStream 保持打开状态,可继续写入。
注意事项与常见场景
-
流必须支持跳过/标记(非必需但影响性能):虽然大多数
InputStream(如FileInputStream、ByteArrayInputStream)都能用,但若底层是BufferedInputStream包装的网络流,实际仍走缓冲复制;只有像FileInputStream这类能转为FileChannel的,才可能触发零拷贝优化。 -
不自动关闭流:必须显式调用
close()或使用 try-with-resources,否则资源泄漏。例如:
try (InputStream is = Files.newInputStream(Paths.get("in.txt"));
OutputStream os = Files.newOutputStream(Paths.get("out.txt"))) {
is.transferTo(os); // ✅ 安全:自动关闭
}
错误处理与边界情况
该方法声明抛出 IOException,需捕获或声明。典型异常包括:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
-
IOException:读取失败(如文件被删除)、写入失败(如磁盘满、目标流已关闭) -
NullPointerException:传入的OutputStream为null -
SecurityException:在安全管理器环境下无对应权限(较少见)
注意:如果传输中途发生 I/O 错误,outputStream 可能已写入部分数据,但不会回滚——应用需自行处理一致性逻辑。
和传统 while 循环对比
等效的手动实现大致如下(简化版):
byte[] buffer = new byte[8192];
int n;
while ((n = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, n);
}
transferTo 不仅代码更简洁,而且:
- 避免了手动管理缓冲区大小
- 在适配场景下减少用户态内存拷贝次数
- 减少因忘记 flush 或异常导致写入不完整的风险(但仍需关注流关闭)

















