【问题标题】:Fastest way to copy text from a File to a HttpServletResponse将文本从文件复制到 HttpServletResponse 的最快方法
【发布时间】:2010-11-25 11:51:49
【问题描述】:

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

实际上我是在一个循环中逐字节复制,从 bufferedReader 到 response.getWriter() 但我相信必须有一种更快、更直接的方法。

谢谢!

【问题讨论】:

  • 您可能想要编写一个单元测试来测试您的实现,并获得一些关于它需要多长时间的数字。然后,尝试一次读取几个字节并比较它所花费的时间。
  • 您是说这种方法(逐字节复制)确实可以接受吗?我以为我在做最慢的事情!
  • 我认为 James 是在重复不可或缺的建议:“衡量,然后优化,然后再衡量。”

标签: java file servlets stream


【解决方案1】:

我喜欢使用接受字节数组的 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();
}

【讨论】:

    【解决方案2】:

    没有必要自己做这些事情。存在开源、久经考验、优化的解决方案是一种常见的需求。

    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)

    【讨论】:

    • 感谢史蒂夫,我确信这是一个很好的解决方案,但我正在努力将外部引用保持在最低限度。
    【解决方案3】:

    这就是我在 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();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-07
      • 2017-06-29
      • 2021-07-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-02
      • 1970-01-01
      相关资源
      最近更新 更多