下载文件时使用PrintWriter

时间:2011-04-14 21:07:25

标签: java jsp servlets

我有一个要求,我需要处理一组文件并从中创建一个压缩的zip文件,然后使用它进行下载。我使用Servlet下载该文件,但下载需要很长时间。因此,我希望用户知道servlet正在通过打印编写器输出消息来处理请求,而不是向他显示一个空白屏幕。但每次我使用打印编写器向屏幕写入内容时,消息需要花费大量时间来显示在屏幕上,文件没有下载。 我怎样才能实现这一目标?任何想法? 感谢。

这是我的代码

OutputStream oStream = null;
    DataInputStream dInput = null;
    File file = new File(("PATH"));
    int length = 0;
    try{
        DownloadServerLogs.processLogs();
        oStream = res.getOutputStream();
        res.setContentType("application/zip");
        res.setContentLength((int)file.length());
        res.setHeader("Content-Disposition",
                         "attachment;filename=\"" + file.getName() + "\"" );
        byte[] bbuf = new byte[BYTES_DOWNLOAD];
        dInput = new DataInputStream(new FileInputStream(file));

        while ((dInput != null) && ((length = dInput.read(bbuf)) != -1))
        {
            oStream.write(bbuf,0,length);
        }
        dInput.close();
        oStream.flush();
        oStream.close();
    }catch(Exception e){
        Utility.getLogger().error(e.getMessage(), e);
    }

2 个答案:

答案 0 :(得分:0)

我想通过使用类似Javascript(假设您使用AJAX调用servlet)来向客户端显示消息更好。

答案 1 :(得分:0)

嗯,这样做可能不那么安全。我看看下面的答案。这不是你的确切问题,但可能类似。

Most efficient way to create InputStream from OutputStream

实际上,你正在同一个线程上阅读和写作,我的猜测是,随着PrintWriter的加入,你在某个地方陷入僵局。