2 回答

TA贡献1895条经验 获得超7个赞
版本Files更短更容易理解。
其他版本更灵活。当您只有一个要写入的文件时,它不是很有用,但如果您在不同的存储中有许多文件,它可以为您节省一些资源。
编辑
这是Files.write源代码:
public static Path write(Path path, byte[] bytes, OpenOption... options)
throws IOException
{
// ensure bytes is not null before opening file
Objects.requireNonNull(bytes);
try (OutputStream out = Files.newOutputStream(path, options)) {
int len = bytes.length;
int rem = len;
while (rem > 0) {
int n = Math.min(rem, BUFFER_SIZE);
out.write(bytes, (len-rem), n);
rem -= n;
}
}
return path;
}
如您所见,它内部没有使用 NIO,只有 good old OutputStream。
编辑 2
事实上Files.newOutputStream不要FileOutputStream像我预期的那样回来。它返回OutputStream定义在Channels.newOutputStream哪个使用 NIO 里面。

TA贡献1863条经验 获得超2个赞
Files.write(...)
使用OutputStream
而不是RandomAccessFile.getChannel()
. 它有一些不同的机制,所以最好用谷歌搜索一下Files.write(...)
写入文件的逻辑要短得多且封装性强当你使用这样的“低”代码时,你需要照顾很多事情。例如,在您的示例中,您没有关闭频道。
因此,总而言之,如果您只需要编写 - 更好地使用Files
或其他高级 API。如果您在读/写期间需要一些“附加”功能,您需要使用RandomAccessFile
或InputStream/OutputStream
添加回答
举报