InputStream.transferTo 是 Java 9 引入的便捷方法,一行代码即可将输入流全部数据写入输出流,内部自动使用 8KB 缓冲、处理末尾判断与异常传播,不关闭流,适用于文件复制等场景。

InputStream.transferTo 是 Java 9 引入的便捷方法,可直接将输入流数据写入输出流,无需手动循环读写,一步完成流复制。
核心用法:一行代码完成复制
调用 transferTo(OutputStream) 即可把当前 InputStream 的全部数据写入目标 OutputStream,内部自动处理缓冲和异常传播:
- 自动使用 8KB 缓冲区,兼顾性能与内存占用
- 读取直到输入流末尾(-1),并确保所有字节写入目标流
- 不关闭任一端流,需自行管理生命周期
典型使用场景示例
比如从文件读取并写入网络响应、复制资源到临时文件等:
try (InputStream is = getClass().getResourceAsStream("/data.bin");
OutputStream os = Files.newOutputStream(Paths.get("copy.bin"))) {
is.transferTo(os); // ✅ 一步完成,无需 while 循环
}
注意:必须确保两个流都正确关闭(推荐 try-with-resources),transferTo 本身不负责关闭。
常见注意事项
该方法看似简单,但有几个关键点容易出错:
- 若目标 OutputStream 已部分写入或处于非空状态,
transferTo会追加数据,不会覆盖或重置 - 遇到 I/O 异常(如磁盘满、网络中断)时抛出
IOException,且已写入的字节数无法回滚 - 不适用于需要转换编码、过滤内容或计算校验和的场景——它只是原样搬运字节
- 对超大流(如 GB 级文件)仍安全,因内部采用分块读写,不会一次性加载全部内容到内存
替代方案对比(Java 8 及以前)
Java 8 需手动实现类似逻辑:
byte[] buffer = new byte[8192];
int length;
while ((length = is.read(buffer)) != -1) {
os.write(buffer, 0, length);
}
相比而言,transferTo 消除了样板代码,语义更清晰,且底层实现经过优化,通常性能略优。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











