我遇到了这样的情景。
我的项目收到来自perl的下载请求
void downloadRequest(FileItemIterator items,
HttpServletResponse response) throws Exception
{
log.info("Start downloadRequest.......");
OutputStream os = response.getOutputStream();
File file = new File("D:\\clip.mp4");
FileInputStream fileIn = new FileInputStream(file);
//while ((datablock = dataOutputStreamServiceImpl.readBlock()) != null)
byte[] outputByte = new byte[ONE_MEGABYE];
while (fileIn.read(outputByte) != -1)
{
System.out.println("--------" + (i = i + 1) + "--------");
System.out.println(new Date());
//dataContent = datablock.getContent();
System.out.println("Start write " + new Date());
os.write(outputByte);
System.out.println("End write " + new Date());
//System.out.println("----------------------");
}
os.close();
}
}
我尝试从文件中读取和写入1MB的块。但是,下载整个文件需要很长时间。 (我的情况是20分钟,文件为100MB)
我尝试使用sysout,我看到了这样的结果:
前几个块可以快速读取,写入数据:
--------1--------
Mon Dec 07 16:24:20 ICT 2015
Start write Mon Dec 07 16:24:20 ICT 2015
End write Mon Dec 07 16:24:21 ICT 2015
--------2--------
Mon Dec 07 16:24:21 ICT 2015
Start write Mon Dec 07 16:24:21 ICT 2015
End write Mon Dec 07 16:24:21 ICT 2015
--------3--------
Mon Dec 07 16:24:21 ICT 2015
Start write Mon Dec 07 16:24:21 ICT 2015
End write Mon Dec 07 16:24:21 ICT 2015
但是下一个块比前一个块慢
--------72--------
Mon Dec 07 16:29:22 ICT 2015
Start write Mon Dec 07 16:29:22 ICT 2015
End write Mon Dec 07 16:29:29 ICT 2015
--------73--------
Mon Dec 07 16:29:29 ICT 2015
Start write Mon Dec 07 16:29:29 ICT 2015
End write Mon Dec 07 16:29:37 ICT 2015
--------124--------
Mon Dec 07 16:38:22 ICT 2015
Start write Mon Dec 07 16:38:22 ICT 2015
End write Mon Dec 07 16:38:35 ICT 2015
--------125--------
Mon Dec 07 16:38:35 ICT 2015
Start write Mon Dec 07 16:38:35 ICT 2015
End write Mon Dec 07 16:38:48 ICT 2015
我真的无法理解outputStream是如何写的,为什么需要这么长时间呢?或者我犯了一些错误?
抱歉我的英语不好。我真的需要你的支持。提前谢谢!
答案 0 :(得分:0)
无法保证read(byte[] b)方法将从文件中读取b.length
个字节数,这意味着您的代码可能会发送更多字节,然后该文件实际存在。
例如,如果您正在处理10 MB文件且read(byte[] b)
始终从文件中读取b.length/2
,则您将发送20 MB。
要解决这个问题,你可以这样做。
byte[] outputByte = new byte[ONE_MEGABYE];
int r = -1;
while ((r = fileIn.read(outputByte)) != -1){
os.write(outputByte,0,r);
}
这将确保您只发送与从文件中读取的字节数相同的字节数。
除了这个问题,速度还会受到很多其他因素的影响,比如互联网速度或其他程序的实现。