【发布时间】:2011-12-12 13:36:41
【问题描述】:
我有一个方法可以使用此代码通过 TCP 套接字接收文件:
FileOutputStream fileStream = new FileOutputStream(filename.getName());
while (totalRead < size) {
if (size - totalRead > CHUNKSIZE) {
read = getInputStream().read(buffer, 0, CHUNKSIZE);
} else {
read = getInputStream().read(buffer, 0, size - totalRead);
}
totalRead += read;
fileStream.write(buffer, 0, 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 在接收大文件时需要很长时间,这是为什么呢?如您所见,我在每个收到的块处刷新流..
【问题讨论】:
-
“真的很长时间”有多长?如果在close()之前查看操作系统中的文件大小,它是什么样子的?
-
在收到 500Mb 文件时关闭大约需要 30 秒。收到文件时我可以看到文件“增长”,因此它在每次刷新时都写入磁盘。
-
但是在您调用 close 之前它是否正确地获得了最终大小?我的猜测是,它还没有真的在操作系统级别刷新它,但我不能肯定地说。
-
您的复制循环比必要的复杂得多。你所需要的只是'while ((count = in.read(buffer)) > 0) out,write(buffer, 0, count);'
标签: java fileoutputstream