为了账号安全,请及时绑定邮箱和手机立即绑定

Java NIO FileChannel与FileOutputStream的性能/有用性

Java NIO FileChannel与FileOutputStream的性能/有用性

浮云间 2019-07-22 10:42:27
Java NIO FileChannel与FileOutputStream的性能/有用性我想弄清楚当我们使用nio时,在性能(或优势)上是否有什么不同。FileChannel与正常FileInputStream/FileOuputStream将文件读写到文件系统。我观察到,在我的机器上,两台机器的性能都是相同的,而且很多次FileChannel路慢了。我能知道更多比较这两种方法的细节吗?下面是我使用的代码,我正在测试的文件就在附近。350MB..如果我不考虑随机访问或其他高级特性,那么使用基于NIO的类进行文件I/O是一个很好的选择吗?package trialjavaprograms;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.InputStream;import java.nio.ByteBuffer;import java.nio.channels.FileChannel;public class JavaNIOTest {     public static void main(String[] args) throws Exception {         useNormalIO();         useFileChannel();     }     private static void useNormalIO() throws Exception {         File file = new File("/home/developer/test.iso");         File oFile = new File("/home/developer/test2");         long time1 = System.currentTimeMillis();         InputStream is = new FileInputStream(file);         FileOutputStream fos = new FileOutputStream(oFile);         byte[] buf = new byte[64 * 1024];         int len = 0;         while((len = is.read(buf)) != -1) {             fos.write(buf, 0, len);         }         fos.flush();         fos.close();         is.close();         long time2 = System.currentTimeMillis();         System.out.println("Time taken: "+(time2-time1)+" ms");     }
查看完整描述

3 回答

?
守候你守候我

TA贡献1802条经验 获得超10个赞

如果要比较的是文件复制的性能,那么对于通道测试,您应该这样做:

final FileInputStream inputStream = new FileInputStream(src);final FileOutputStream outputStream = new FileOutputStream(dest);final FileChannel inChannel = inputStream.getChannel();final FileChannel outChannel = outputStream.getChannel();inChannel.transferTo(0, inChannel.size(), outChannel);inChannel.close();outChannel.close();inputStream.close();outputStream.close();

这不会比将自己从一个通道缓冲到另一个通道更慢,而且可能会大大加快速度。根据Javadocs:

许多操作系统可以直接将字节从文件系统缓存传输到目标通道,而无需实际复制它们。


查看完整回答
反对 回复 2019-07-22
?
慕哥6287543

TA贡献1831条经验 获得超10个赞

根据我的测试(Win 7 64位,6GB RAM,Java 6),NIO传输的速度非常快,只有小文件,并且在较大的文件上变得非常慢。NiO数据库触发器的性能总是优于标准IO。

  • 复制1000 x2MB

  1. NiO(传输)~2300 ms
  2. NiO(直接数据库5000 b翻转)~3500 ms
  3. 标准IO(缓冲器5000 b)~6000 ms

复制100x20MB

  1. NiO(直接数据库5000 b翻转)~4000毫秒
  2. NiO(转移自)~5000 ms
  3. 标准IO(缓冲器5000 b)~6500 ms

复制1x1000mb

  1. NiO(直接数据库5000 b翻转)~4500 s
  2. 标准IO(缓冲器5000 b)~7000毫秒
  3. NiO(转移自)~8000 ms

TransferTo()方法在文件块上工作;它不是作为一个高级文件副本方法使用的


查看完整回答
反对 回复 2019-07-22
  • 3 回答
  • 0 关注
  • 1929 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信