当我想将文件的全部内容写入OutputStream
,我通常分配一个缓冲区作为byte[]
,然后做一个for
循环到read
来自文件的数据InputStream
写入缓冲区并将缓冲区内容写入OutputStream
, 直到InputStream
没有更多可用字节。
这对我来说似乎相当笨拙。有一个更好的方法吗?
另外,我总是不确定缓冲区的大小。通常,我分配 1024 字节,因为感觉很好。有没有更好的方法来确定合理的缓冲区大小?
在我当前的情况下,我想将文件的完整内容复制到写入 HTTP 响应内容的输出流中。所以,这不是一个关于如何在文件系统上复制文件的问题。
对于 Java 1.7+,您可以使用文件.copy(路径,输出流) http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html#copy(java.nio.file.Path,%20java.io.OutputStream), e.g.
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
设置正确的响应头也是一个好主意。添加以下行before您将实际文件数据复制到响应中:
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);
请注意,传递给内容处置的文件名的编码很重要,请参阅这个问题 https://stackoverflow.com/questions/93551/how-to-encode-the-filename-parameter-of-content-disposition-header-in-http.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)