java - 有没有更好的方法将文件的全部内容写入 OutputStream?

标签 java io

当我想将一个文件的全部内容写入一个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/

相关文章:

java - 如何将带有 utf-8 名称的 zip 条目添加到 zip

java - 选择哪个 JVM 进行 GC 攻击?

java - 如何从 Java 中运行的进程中获取 bash 命令退出代码?

c++ - 使用 ifstream 读取文件

java - listFiles(FileFilter) 而不是 listFiles(FileNameFilter)

c++ - 关于 skipws 声明的简单说明

java - 在 Java 中为链中的变量赋值

java - 当子类对象传递给带有父类(super class)参数的方法时会发生什么?

c++ - 如何在 C++ 中控制标准输入回显?

javascript - Knex 在 for 循环内 promise