ServletOutputStream output = response.getOutputStream(); output.write(byte[]);
字符串将文件写入javax.servlet.ServletOutputStream的最有效的方法是什么?
编辑:
使用NIO不是更有效吗?
7jmck4yq1#
IOUtils.copy(in, out); out.flush(); //........... out.close(); // depends on your application
字符串其中in是FileInputStream,out是SocketOutputStream。IOUtils是Apache Commons中Commons IO模块的实用程序。
in
out
SocketOutputStream
6kkfgxo02#
您有一个ServletOutputStream。您可以写入它的唯一方法是通过java.io.*。您根本不能在它上面使用NIO(除了通过使用Channels Package 之外,这是毫无意义的:下面仍然是OutputStream,您只是在上面添加处理)。实际的I/O是网络绑定的,并且您的写入无论如何都会被servlet容器缓冲(以便它可以设置Content-Length)头,因此在这里寻找性能调整是毫无意义的。
Channels
OutputStream
ff29svar3#
首先,这与servlet无关。这通常适用于Java IO。毕竟你只有一个InputStream和一个OutputStream。至于答案,你不是唯一一个想知道这个问题的人。在互联网上,你可以找到其他人想知道同样的问题,但他们自己努力测试/基准测试:
InputStream
一般来说,FileChannel和256 K字节数组是最快的方式,通过 Package 的ByteBuffer读取并直接从字节数组写入。
FileChannel
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(); }
字符串
inn6fuwd4#
我相信如果你使用Java 9或更高版本,你可以直接使用InputStream.transferTo方法:
InputStream.transferTo
inputStream.transferTo(outputStream);
字符串这个方法看起来很简单,但是在Java 8(1.8)中是不可用的。
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; }
字符串把这两个方法放在你的助手类中,你就可以开始了。
5条答案
按热度按时间7jmck4yq1#
字符串
其中
in
是FileInputStream,out
是SocketOutputStream
。IOUtils是Apache Commons中Commons IO模块的实用程序。6kkfgxo02#
您有一个ServletOutputStream。您可以写入它的唯一方法是通过java.io.*。您根本不能在它上面使用NIO(除了通过使用
Channels
Package 之外,这是毫无意义的:下面仍然是OutputStream
,您只是在上面添加处理)。实际的I/O是网络绑定的,并且您的写入无论如何都会被servlet容器缓冲(以便它可以设置Content-Length)头,因此在这里寻找性能调整是毫无意义的。ff29svar3#
首先,这与servlet无关。这通常适用于Java IO。毕竟你只有一个
InputStream
和一个OutputStream
。至于答案,你不是唯一一个想知道这个问题的人。在互联网上,你可以找到其他人想知道同样的问题,但他们自己努力测试/基准测试:
一般来说,
FileChannel
和256 K字节数组是最快的方式,通过 Package 的ByteBuffer
读取并直接从字节数组写入。字符串
inn6fuwd4#
我相信如果你使用Java 9或更高版本,你可以直接使用
InputStream.transferTo
方法:字符串
这个方法看起来很简单,但是在Java 8(1.8)中是不可用的。
vh0rcniy5#
如果你不想把这个jar文件添加到你的应用程序中,那么你必须手工复制它。从这里复制方法实现:http://svn.apache.org/viewvc/commons/proper/io/trunk/src/main/java/org/apache/commons/io/IOUtils.java?revision=1004358&view=markup:
字符串
把这两个方法放在你的助手类中,你就可以开始了。