FileInput / OutputStream与FileChannels - 提供更好的性能

时间:2011-07-05 20:21:31

标签: java performance file filestream filechannel

我正在编写一个程序,必须从文件夹到文件夹复制一个相当大但不是很大量的数据(一次只能打印几十张照片)。最初我使用java.io.FileOutputStream来简单地读取缓冲区和写出来,但后来我听说使用java.nio.FileChannel可能会提高性能。

我没有资源使用我拥有的数据进行严格的,受控制的测试,但似乎没有就每个数据的优点达成共识(除了FileChannel是线程安全的)。一些用户报告FileChannel对于较小的文件非常有用,而另一些用户则报告说文件较大时会有很大的速度提升。

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

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

3 个答案:

答案 0 :(得分:2)

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

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

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


FileChannel不是非阻止的,并且不可选择。不确定他们将来是否会添加这些功能。 Java 7虽然有AsynchronousFileChannel

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

您是否看过commons-io

FileUtils.copyFileToDirectory(srcFile, destDir);