3

我正在编写一个程序,该程序必须从一个文件夹复制大量但不是大量的数据(一次在几十张照片的范围内)。最初我是java.io.FileOutputStream用来简单地读取以缓冲和写出,但后来我听说使用java.nio.FileChannel.

我没有资源来使用我拥有的数据运行一个严肃的、受控的测试,但似乎没有就每种方法的优势达成共识(除了 FileChannel 是线程安全的)。一些用户报告说FileChannel非常适合较小的文件,另一些用户报告说较大的文件速度会大大提高。

我想知道是否有人确切地知道创建的初衷是什么FileChannel:它是为了更好的性能而设计的吗?在什么情况下?对于一般类型的数据是否有明确的性能提升,或者我应该期望看到的差异是微不足道的,因为我没有使用足够专业的数据?

编辑:假设我的数据不需要是线程安全的。

4

3 回答 3

2

FileChannel.transferFrom/To文件复制应该比 IO 流更快。

或者您可以简单地使用 Java 7 的java.nio.file.Files.copy(source, target). 这应该尽可能快。

然而,最终,性能不会有明显的不同——硬盘速度是瓶颈。


FileChannel不是非阻塞的,也不是可选的。不确定他们将来是否会添加这些功能。Java 7 有AsynchronousFileChannel

于 2011-07-05T21:20:44.527 回答
1

输入和输出流假定以流样式访问文件或资源。有一些额外的项目可以帮助(数组读取),但基本思想是一次读取一个或多个字符的流(可能会阻塞,直到有更多可用字符)。

通道是将信息复制到缓冲区的方法。这提供了对输入和输出例程的较低级别的访问。通过深思熟虑的缓冲区大小,速度提升可能令人印象深刻。围绕缓冲区构建代码可以减少读取循环所花费的时间(也可以提高性能)。最后,虽然可以对输入流状态进行预检查以避免阻塞,但 Channels 和 Buffers 允许操作以非阻塞方式执行(即使在最坏的条件下)。

于 2011-07-05T20:39:54.463 回答
0

你看了commons-io吗?

FileUtils.copyFileToDirectory(srcFile, destDir);
于 2011-07-05T20:32:59.437 回答