当给 Files.newOutputStream 时,WRITE 选项的功能是什么?

问题描述 投票:0回答:1
使用文件 API 打开 OutputStream 时,您可以为其传递选项。其中一个选项是 WRITE,如果未指定选项,则默认应用该选项。 然而,我看不出提供和不提供时有什么区别。 输出流只能用于写入,不是吗? 文档仅提到:

打开写访问权限。

输出流根据定义总是写入内容,所以我无法使用它。 在我们的项目中(我们有一个与 TRUNCATE_EXISTING 缺失相关的错误),未指定 WRITE 选项,但文件还是被(覆盖)写入了。 需要明确的是,以下两者有什么区别:

// OpenOption.CREATE, OpenOption.TRUNCATE_EXISTING, OpenOption.WRITE Files.newOutputStream(file);

Files.newOutputStream​(file, OpenOption.CREATE, OpenOption.TRUNCATE_EXISTING);

java nio
1个回答
0
投票
方法最终调用

FileSystemProvider.newStreamOutput()

,它使用
newByteChannel()
来创建OutputStream,如
源代码
中所示:
public OutputStream newOutputStream(Path path, OpenOption... options) throws IOException { int len = options.length; Set<OpenOption> opts ; if (len == 0) { opts = DEFAULT_OPEN_OPTIONS; } else { opts = new HashSet<>(); for (OpenOption opt: options) { if (opt == StandardOpenOption.READ) throw new IllegalArgumentException("READ not allowed"); opts.add(opt); } opts.add(StandardOpenOption.WRITE); } WritableByteChannel wbc = newByteChannel(path, opts); if (wbc instanceof FileChannelImpl) { ((FileChannelImpl) wbc).setUninterruptible(); } return Channels.newOutputStream(wbc); }

此方法始终将 WRITE 添加到选项中。请注意,在未给出选项时使用的 DEFAULT_OPEN_OPTIONS 也包含 WRITE。

newByteChannel()

方法需要

WRITE

(或
APPEND
)来创建可写通道。
结论:使用或不使用 WRITE 没有(功能)差异。

© www.soinside.com 2019 - 2024. All rights reserved.