快速java输入\输出流

快速java输入\输出流,java,inputstream,outputstream,java-io,Java,Inputstream,Outputstream,Java Io,我有一个servlet,它使用响应输出流将pdf文件复制到客户端 private boolean copyStreamToStream(InputStream in, OutputStream target) { logger.info("start copy file to stream"); try { byte[] buffer = new byte[1024 * 8]; int len = in.read(buffer);

我有一个servlet,它使用响应输出流将pdf文件复制到客户端

private boolean copyStreamToStream(InputStream in, OutputStream target) {

    logger.info("start copy file to stream");
    try {

        byte[] buffer = new byte[1024 * 8];
        int len = in.read(buffer);
        while (len != -1) {
            target.write(buffer, 0, len);
            len = in.read(buffer);
        }
        in.close();
        target.flush();
        target.close();
        logger.info("end copy file to stream");

    } catch (Exception ex) {

        logger.error("Error: ", ex);
        return false;
    }
    return true;

}
磁盘上pdf文件的InputStream和response.getOutputStream()的OutputStream


问题是PDF文件是一个大文件,需要很长时间才能加载到客户端。是否有任何方法可以加快加载速度?

发送文件供下载,而不是将其作为直接响应对象传回

// Set the headers.
response.setContentType("application/x-download");
response.setHeader("Content-Disposition", "attachment; filename=" + filename);

// Send the file for download.
OutputStream out = response.getOutputStream(  );

已编辑。

是否使用了BufferedInputStream?这是从FileInputStream执行的第一件事。6个问题中有0个问题的答案是可接受的。。。嗯,您可能想处理这个问题。@dystroy BufferedInputStream默认使用8 KB的缓冲区。OP已经在使用一个8 KB的缓冲区。您需要确定延迟在哪里,以及客户端速度慢是什么意思。仅使用
wget
下载需要多长时间?你有多少带宽?一个不相关的注意事项是将
close()
调用放入
finally
块,因为如果前面的任何方法抛出异常,流将不会关闭。这不会发送“下载文件”。只发送两次文件名。修订版假定文件为文本。如果您使用
InputStream
OutputStream
则没有假设。当然!我已经删除了noice,使他能够使用代码中描述的origal
InputStream
,以避免混淆。