加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

java – FileOutputStream.close在写大文件时非常慢

发布时间:2020-12-14 19:16:28 所属栏目:Java 来源:网络整理
导读:我有一个方法,使用此代码通过TCP套接字接收文件: FileOutputStream fileStream = new FileOutputStream(filename.getName());while (totalRead FileOutputStream.close在接收大文件时花了很长时间,为什么呢?正如你所看到的那样,我正在每个收到的大块上冲洗

我有一个方法,使用此代码通过TCP套接字接收文件:

FileOutputStream fileStream = new FileOutputStream(filename.getName());
while (totalRead < size) {
    if (size - totalRead > CHUNKSIZE) {
        read = getInputStream().read(buffer,CHUNKSIZE);
    } else {
        read = getInputStream().read(buffer,size - totalRead);
    }
    totalRead += read;
    fileStream.write(buffer,read);
    fileStream.flush();

    if (System.currentTimeMillis() > nextPrint) {
        nextPrint += 1000;
        int speed = (int) (totalRead / (System.currentTimeMillis() - startTime));
        double procent = ((double)totalRead / size) * 100;
        gui.setStatus("Reciving: " + filename + " at " + speed + " kb/s," + procent + "% complete");
    }
}
gui.setStatus("Reciving: " + filename + " complete.");
fileStream.close();

FileOutputStream.close在接收大文件时花了很长时间,为什么呢?正如你所看到的那样,我正在每个收到的大块上冲洗流.

最佳答案
根据操作系统的不同,flush()不再强制将数据写入操作系统.在FileOutputStream的情况下,write()将所有数据传递给OS,因此flush()不执行任何操作.其中close()可以确保文件实际写入磁盘(或不依赖于操作系统).您可以在写入数据时查看磁盘是否仍处于忙碌状态.

一个500 MB的文件需要30秒,这意味着你写的是17 MB / s.这听起来像一个非常慢的磁盘或网络共享/驱动器中的文件.

你可以试试这个

File file = File.createTempFile("deleteme","dat"); // put your file here.
FileOutputStream fos = new FileOutputStream(file);
long start = System.nanoTime();
byte[] bytes = new byte[32 * 1024];
for (long l = 0; l < 500 * 1000 * 1000; l += bytes.length)
    fos.write(bytes);
long mid = System.nanoTime();
System.out.printf("Took %.3f seconds to write %,d bytes%n",(mid - start) / 1e9,file.length());
fos.close();
long end = System.nanoTime();
System.out.printf("Took %.3f seconds to close%n",(end - mid) / 1e9);

版画

Took 0.116 seconds to write 500,006,912 bytes
Took 0.002 seconds to close

你可以从速度上看到,即使在收盘时,它也不会写入数据.即驱动器不是那么快.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读