我正在编写一个程序,通过网络将文件从一台PC复制到另一台PC。在进行此文件复制时,我向用户显示进度以及动态复制了多少文件(在JSP中完成)。在服务器端我使用Java并且对于大多数文件来说效果很好但是如果我遇到一个50 MB的文件我遇到了一些墙壁而我的程序只是在那里停留了一段时间,它最终开始写入输出虽然流。这是因为只是将文件加载到输入流中吗?我知道文件有点大,所以不确定我能做些什么呢。下面是我用来将文件复制到服务器的代码。任何建议或帮助将不胜感激。完全重新设计这个东西我只是想让你轻松阅读复制过的文件进度。
FileInputStream fin = null;
FileOutputStream fout = null;
int length = (int)srcFile.length();
int counter = 0;
int r = 0;
byte[] b = new byte[4096];
try
{
fin = new FileInputStream(srcFile);
fout = new FileOutputStream(dd);
int progressVal = 0;
while((r = fin.read(b)) != - 1)
{
counter += r;
fout.write(b,0,r);
progressVal = (counter * 100/length);
if(progressVal > 0)
{
//communicate to JSP
WorkstationController.progressMade = progressVal;
}
}
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
fin.close();
fout.close();
}
答案 0 :(得分:0)
可能取决于很多因素。什么版本的java?根据版本,默认堆和permgen大小会有所不同。你可能会达到堆大小限制并导致jvm在垃圾收集中捶打以恢复空间。
您可以做的一件事就是尝试不同的大小来分块数据。另外,尝试包装流BufferedInput / OuputStreams。