Java 7+ NIO.2实现覆盖或创建文件的OpenOption组合方案
解决方案:正确的OpenOption组合实现“覆盖/创建”写入需求
要实现文件存在则覆盖内容,不存在则创建文件并写入的需求,你需要在Files.write/Files.writeString中组合使用以下StandardOpenOption:
StandardOpenOption.WRITE:打开文件用于写入StandardOpenOption.CREATE:如果文件不存在则创建它StandardOpenOption.TRUNCATE_EXISTING:如果文件已存在,则将其长度截断为0(清空原有内容)
修正后的代码示例
try { Files.write( Paths.get("/Users/My_UserName/Example.txt"), List.of("Hello world", Instant.now().toString()), StandardCharsets.UTF_8, StandardOpenOption.WRITE, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING ); } catch (IOException e) { throw new RuntimeException(e); }
为什么之前的组合失败?
你之前仅使用WRITE和TRUNCATE_EXISTING的问题在于:
WRITE选项仅针对已存在的文件生效,不会自动创建新文件TRUNCATE_EXISTING同样要求文件必须存在,否则会触发NoSuchFileException
添加CREATE选项后,即可在文件不存在时自动创建,同时保留对已有文件的覆盖能力。
更简洁的替代组合
如果你觉得三个选项过于繁琐,也可以直接使用StandardOpenOption.CREATE + StandardOpenOption.TRUNCATE_EXISTING,因为TRUNCATE_EXISTING隐含了写入权限,效果与三个选项组合完全一致:
try { Files.write( Paths.get("/Users/My_UserName/Example.txt"), List.of("Hello world", Instant.now().toString()), StandardCharsets.UTF_8, StandardOpenOption.CREATE, StandardOpenOption.TRUNCATE_EXISTING ); } catch (IOException e) { throw new RuntimeException(e); }
内容的提问来源于stack exchange,提问作者Basil Bourque
相关产品推荐
相关产品推荐

