gpt4 book ai didi

java - 下载大文件太慢

转载 作者:行者123 更新时间:2023-12-01 10:46:56 30 4
gpt4 key购买 nike

我遇到了这样的场景。

我的项目收到来自 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 的 block 。但是,下载整个文件需要很长时间。 (我的情况是100MB文件20分钟)

我尝试 sysout,看到了这样的结果:

前几个 block 可以非常快地读取、写入数据:

--------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

但是下一个 block 比前一个 block 慢

--------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是怎么写的,为什么要花这么长时间?或者我犯了一些错误?

抱歉我的英语不好。我真的需要你的支持。提前致谢!

最佳答案

无法保证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);
}

这将确保您仅发送与从文件中读取的字节数相同的字节数。

除了这个问题之外,速度还可能受到许多其他因素的影响,例如互联网速度或其他程序的实现。

关于java - 下载大文件太慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34130518/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com