在 Java 7+ 中使用 NIO.2 替换文件(如果存在),或者创建一个新文件

问题描述 投票:0回答:1

Java 7+ 中的

Files.write
Files.writeString
方法是将文本写入文件的简洁方便的方法。

try
{
    Files.write (
            Paths.get ( "/Users/My_UserName/Example.txt" ) ,
            List.of( "Hello world" , Instant.now().toString() ) ,
            StandardCharsets.UTF_8 ,
            StandardOpenOption.WRITE ;
}
catch ( IOException e )
{
    throw new RuntimeException ( e );
}

不幸的是,在文件存在之前,我无法让它第一次工作。我抛出异常:

java.nio.file.NoSuchFileException

我的目标始终是清除任何现有文件,编写一个新的文件。

我尝试添加

TRUNCATE_EXISTING

try
{
    Files.write (
            Paths.get ( "/Users/My_UserName/Example.txt" ) ,
            List.of( "Hello world" , Instant.now().toString() ) ,
            StandardCharsets.UTF_8 ,
            StandardOpenOption.WRITE,
            StandardOpenOption.TRUNCATE_EXISTING );  // <--- Combining Open-options.
}
catch ( IOException e )
{
    throw new RuntimeException ( e );
}

但是当文件尚不存在时,这也会失败。

👉🏼 是否有一些

OpenOption
/
StandardOpenOption
对象的组合来使用这些方便的
Files
方法?

java file nio nio2
1个回答
2
投票

因此,您想要的行为是使用 CREATE 和 TRUNCATE_EXISTING 选项与 WRITE 的效果。

try
{
    Files.write (
            Paths.get ( "/Users/My_UserName/Example.txt" ) ,
            List.of ( "Hello world" , Instant.now ( ).toString ( ) ) ,
            StandardCharsets.UTF_8 ,
            StandardOpenOption.CREATE ,
            StandardOpenOption.WRITE ,
            StandardOpenOption.TRUNCATE_EXISTING
    );
}
catch ( IOException e )
{
    throw new RuntimeException ( e );
}

幸运的是,这是默认行为,正如您的 API 参考文献(如 Files.write :

)所记录的那样

如果不存在任何选项,则此方法的工作方式与 CREATE 一样, TRUNCATE_EXISTING 和 WRITE 选项存在。

所以不要覆盖默认值 - 不要写,所以

try
{
    Files.write (
            Paths.get ( "/Users/My_UserName/Example.txt" ) ,
            List.of ( "Hello world" , Instant.now ( ).toString ( ) ) ,
            StandardCharsets.UTF_8  // <--- Omitting the 3 CREATE, WRITE, & TRUNCATE_EXISTING arguments.
    );
}
catch ( IOException e )
{
    throw new RuntimeException ( e );
}

顺便说一句,大多数时候我们也不需要指定字符集(我不记得在生产代码中见过它),所以除非你真的需要它:

 Files.write (
        Paths.get ( "/Users/My_UserName/Example.txt" ) ,
        List.of( "Hello world" , Instant.now().toString() ) );
© www.soinside.com 2019 - 2024. All rights reserved.