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

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

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

编辑:

使用NIO不是更有效吗?

7jmck4yq

7jmck4yq1#

IOUtils.copy(in, out);
out.flush();
//...........
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读取并直接从字节数组写入。

FileInputStream input = new FileInputStream("/path/to/file.ext");
FileChannel channel = input.getChannel();
byte[] buffer = new byte[256 * 1024];
ByteBuffer byteBuffer = ByteBuffer.wrap(buffer);

try {
    for (int length = 0; (length = channel.read(byteBuffer)) != -1;) {
        System.out.write(buffer, 0, length);
        byteBuffer.clear();
    }
} finally {
    input.close();
}

字符串

inn6fuwd

inn6fuwd4#

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

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

private static final int DEFAULT_BUFFER_SIZE = 1024 * 4;

public static int copy(InputStream input, OutputStream output) throws IOException {
  long count = copyLarge(input, output);
  if (count > Integer.MAX_VALUE) {
    return -1;
  }
  return (int) count;
}

public static long copyLarge(InputStream input, OutputStream output)
    throws IOException {
   byte[] buffer = new byte[DEFAULT_BUFFER_SIZE];
   long count = 0;
   int n = 0;
   while (-1 != (n = input.read(buffer))) {
     output.write(buffer, 0, n);
     count += n;
   }
   return count;
}

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

相关问题