java 将文件写入ServletOutputStream的最有效的方式

irtuqstp  于 2024-01-05  发布在  Java
关注(0)|答案(5)|浏览(268)
  1. ServletOutputStream output = response.getOutputStream();
  2. output.write(byte[]);

字符串
将文件写入javax.servlet.ServletOutputStream的最有效的方法是什么?

编辑:

使用NIO不是更有效吗?

7jmck4yq

7jmck4yq1#

  1. IOUtils.copy(in, out);
  2. out.flush();
  3. //...........
  4. out.close(); // depends on your application

字符串
其中inFileInputStreamoutSocketOutputStreamIOUtilsApache CommonsCommons IO模块的实用程序。

6kkfgxo0

6kkfgxo02#

您有一个ServletOutputStream。您可以写入它的唯一方法是通过java.io.*。您根本不能在它上面使用NIO(除了通过使用Channels Package 之外,这是毫无意义的:下面仍然是OutputStream,您只是在上面添加处理)。实际的I/O是网络绑定的,并且您的写入无论如何都会被servlet容器缓冲(以便它可以设置Content-Length)头,因此在这里寻找性能调整是毫无意义的。

ff29svar

ff29svar3#

首先,这与servlet无关。这通常适用于Java IO。毕竟你只有一个InputStream和一个OutputStream
至于答案,你不是唯一一个想知道这个问题的人。在互联网上,你可以找到其他人想知道同样的问题,但他们自己努力测试/基准测试:

一般来说,FileChannel和256 K字节数组是最快的方式,通过 Package 的ByteBuffer读取并直接从字节数组写入。

  1. FileInputStream input = new FileInputStream("/path/to/file.ext");
  2. FileChannel channel = input.getChannel();
  3. byte[] buffer = new byte[256 * 1024];
  4. ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);
  5. try {
  6. for (int length = 0; (length = channel.read(byteBuffer)) != -1;) {
  7. System.out.write(buffer, 0, length);
  8. byteBuffer.clear();
  9. }
  10. } finally {
  11. input.close();
  12. }

字符串

展开查看全部
inn6fuwd

inn6fuwd4#

我相信如果你使用Java 9或更高版本,你可以直接使用InputStream.transferTo方法:

  1. inputStream.transferTo(outputStream);

字符串
这个方法看起来很简单,但是在Java 8(1.8)中是不可用的。

vh0rcniy

vh0rcniy5#

如果你不想把这个jar文件添加到你的应用程序中,那么你必须手工复制它。从这里复制方法实现:http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java?revision=1004358&view=markup

  1. private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;
  2. public static int copy(InputStream input, OutputStream output) throws IOException {
  3. long count = copyLarge(input, output);
  4. if (count > Integer.MAX_VALUE) {
  5. return -1;
  6. }
  7. return (int) count;
  8. }
  9. public static long copyLarge(InputStream input, OutputStream output)
  10. throws IOException {
  11. byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
  12. long count = 0;
  13. int n = 0;
  14. while (-1 != (n = input.read(buffer))) {
  15. output.write(buffer, 0, n);
  16. count += n;
  17. }
  18. return count;
  19. }

字符串
把这两个方法放在你的助手类中,你就可以开始了。

展开查看全部

相关问题