当我想将一个文件的全部内容写入一个OutputStream
时,我通常分配一个缓冲区作为一个byte[]
,然后再做一个for
循环从文件的InputStream
中读取
数据到缓冲区,并将缓冲区内容写入OutputStream
,直到 InputStream
没有更多可用字节了。
这对我来说似乎很笨拙。有没有更好的方法来做到这一点?
另外,我总是不确定缓冲区大小。通常,我分配 1024 个字节,因为感觉很好。有没有更好的方法来确定合理的缓冲区大小?
在我目前的情况下,我想将文件的全部内容复制到写入 HTTP 响应内容的输出流中。所以,这不是关于如何在文件系统上复制文件的问题。
最佳答案
对于 Java 1.7+,您可以使用 Files.copy(Path, OutputStream) ,例如
HttpServletResponse response = // ...
File toBeCopied = // ...
try (OutputStream out = response.getOutputStream()) {
Path path = toBeCopied.toPath();
Files.copy(path, out);
out.flush();
} catch (IOException e) {
// handle exception
}
注意,由于您正在处理 HttpServletResponse
,因此设置正确的响应 header 也是一个好主意。在将实际文件数据复制到响应之前添加以下行:
String mimeType = URLConnection.guessContentTypeFromName(toBeCopied.getName());
String contentDisposition = String.format("attachment; filename=%s", toBeCopied.getName());
int fileSize = Long.valueOf(toBeCopied.length()).intValue();
response.setContentType(mimeType);
response.setHeader("Content-Disposition", contentDisposition);
response.setContentLength(fileSize);
注意,传递给内容配置的文件名的编码很重要,请参阅 this question .
关于java - 有没有更好的方法将文件的全部内容写入 OutputStream?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4741419/