下载大文件太慢了

时间:2015-12-07 09:44:33

标签: java perl download outputstream

我遇到了这样的情景。

我的项目收到来自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是如何写的,为什么需要这么长时间呢?或者我犯了一些错误?

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

1 个答案:

答案 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);            
 }

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

除了这个问题,速度还会受到很多其他因素的影响,比如互联网速度或其他程序的实现。