从文件复制文本到HttpServletResponse的最快方法

3

我需要一种非常快速的方法,将文件中的文本复制到HttpServletResponse的正文中。

实际上,我正在通过循环逐字节地从BufferedReader复制到response.getWriter(),但我相信必须有一种更快捷和更直接的方法来完成此操作。

谢谢!


你可能想编写一个单元测试来测试你的实现,并获取一些执行时间的数字。然后,尝试一次读取几个字节并比较所需时间。 - James Black
你是说这个方法(逐字节复制)确实是可以接受的吗?我还以为我正在做最慢的事情呢! - Pablo Fernandez
我认为詹姆斯正在重复不可或缺的建议:“测量,然后优化,再次测量。” - Steve McLeod
3个回答

5

我喜欢使用接受字节数组的read()方法,因为您可以调整大小并改变性能。

public static void copy(InputStream is, OutputStream os) throws IOException {
      byte buffer[] = new byte[8192];
      int bytesRead;

      BufferedInputStream bis = new BufferedInputStream(is);
      while ((bytesRead = bis.read(buffer)) != -1) {
              os.write(buffer, 0, bytesRead);
      }
      is.close();
      os.flush();
      os.close();
}

4

您没有必要自己处理这些事情。这是一个常见的需求,已经存在经过实战检验和优化的开源解决方案。

Apache Commons IO有一个IOUtils类,其中包含一系列静态复制方法。也许您可以使用:

IOUtils.copy(reader, writer);

http://commons.apache.org/io/api-1.4/org/apache/commons/io/IOUtils.html#copy(java.io.Reader, java.io.Writer)

的意思是将一个输入流(Reader)中的内容复制到一个输出流(Writer)中。这个方法在IT技术中被广泛使用。

谢谢Steve,我相信那是一个很好的解决方案,但我正在尽量将外部引用保持到最少。 - Pablo Fernandez

2
这是我在Servlet中使用4K缓冲区的方法:
   // Send the file.
    OutputStream out = response.getOutputStream();
    BufferedInputStream is = new BufferedInputStream(new FileInputStream(file));
    byte[] buf = new byte[4 * 1024]; // 4K buffer
    int bytesRead;
    while ((bytesRead = is.read(buf)) != -1) {
        out.write(buf, 0, bytesRead);
    }
    is.close();
    out.flush();
    out.close();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接