Java FileOutputStream 如果文件不存在则创建文件

235

有没有一种使用FileOutputStream的方法,如果文件(String filename)不存在,它能够创建这个文件?

FileOutputStream oFile = new FileOutputStream("score.txt", false);

如果有人正在寻找使用Files.write()的方法,请尝试Files.write(Paths.get("./score.txt"), "sometext".getBytes(StandardCharsets.UTF_8), StandardOpenOption.CREATE, StandardOpenOption.APPEND);StandardOpenOption - Rohim Chou
9个回答

364

如果文件不存在且无法创建(文档),它将抛出FileNotFoundException异常,但如果可以创建它,则会创建文件。为确保安全起见,您可能应该先测试文件是否存在,然后再创建FileOutputStream(如果文件不存在,则使用createNewFile()创建):

File yourFile = new File("score.txt");
yourFile.createNewFile(); // if file already exists will do nothing 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 

3
如果文件不存在,我该如何创建一个空的 .txt 文件? - Stefan Dunn
3
使用createNewFile()方法,就像我的示例一样,来@StefanDunn。 - talnicolas
64
该条件是多余的。根据JavaDoc,“createNewFile()”本身会原子性地检查文件是否存在。 - aztek
8
@aztek 可能我们可以将此条件留下以提高代码的可读性。 - Andrii Chernenko
4
在这里调用createNewFile()是完全浪费时间的。系统已经会自动创建文件了,你只是在让它多做一遍。 - user207421
显示剩余7条评论

89
在创建文件之前,必须创建所有父目录。 使用yourFile.getParentFile().mkdirs() 更新:仅在父文件夹不存在时才创建所有父文件夹。否则不需要创建。

1
不必要,就像你最初写的那样。只有在它们不存在的情况下才需要。 - user207421

39

来自Apache Commons的FileUtils是以一行代码完成此操作的不错方式。

FileOutputStream s = FileUtils.openOutputStream(new File("/home/nikhil/somedir/file.txt"))

如果父文件夹不存在,则会创建父文件夹;如果文件不存在,则会创建文件,并在文件对象是目录或无法写入时抛出异常。这与下面的代码等效

File file = new File("/home/nikhil/somedir/file.txt");
file.getParentFile().mkdirs(); // Will create parent directories if not exists
file.createNewFile();
FileOutputStream s = new FileOutputStream(file,false);

如果当前用户没有被允许执行操作,则所有上述操作都会抛出异常。


28
File f = new File("Test.txt");
if(!f.exists()){
  f.createNewFile();
}else{
  System.out.println("File already exists");
}
将此 f 传递给您的 FileOutputStream 构造函数。

4
这里存在竞争条件... 最好按以下方式执行:File f = new File("Test.txt"); 如果 (!f.createNewFile()) { System.out.println("文件已存在"); } - humanity
这完全是浪费时间。new FileOutputStream(...)已经做了这个,现在你又强制它删除在这里创建的文件。 - user207421

26

无论文件是否存在,您都可以创建一个空文件...

new FileOutputStream("score.txt", false).close();

如果你想在文件存在的情况下离开该文件...

new FileOutputStream("score.txt", true).close();

如果您尝试在不存在的目录中创建文件,则只会收到FileNotFoundException错误。

编辑:从Java 7开始,您可以创建文件,但在失败时会得到更有意义的错误消息。

Path newFilePath = Paths.get(FILE_NAME);
Files.createFile(newFilePath); // throws FileAlreadyExistsException if it exists

这篇文章有很多变化。 https://www.baeldung.com/java-how-to-create-a-file


5
两种情况下都会抛出FileNotFoundException异常。 - mixel
这很糟糕,它会返回FileNotFoundException,但应该是类似于FileNotCreatedException的异常。一个完全误导性的异常。 这就像斯蒂芬·金(Stephen King)说他找不到他的新书,而不是说他还没有写! - AriesConnolly
1
@AriesConnolly 的目的是创建一个文件;只有当父级不存在时才会失败。如果有任何问题,应该是 PathNotFoundException。 - Peter Lawrey

5
如果文件不存在,则创建文件。如果文件存在,则清空其内容:
/**
 * Create file if not exist.
 *
 * @param path For example: "D:\foo.xml"
 */
public static void createFile(String path) {
    try {
        File file = new File(path);
        if (!file.exists()) {
            file.createNewFile();
        } else {
            FileOutputStream writer = new FileOutputStream(path);
            writer.write(("").getBytes());
            writer.close();
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

这完全是浪费时间。 new FileOutputStream(...) 已经做到了这一点,现在你还要强制删除在这里创建的文件。 - user207421

4

使用Path和Files提供了一种创建文件的另一种方式,仅在文件不存在时才创建。

Path path = Paths.get("Some/path/filename.txt");
Files.createDirectories(path.getParent());
if( !Files.exists(path))
    Files.createFile(path);
Files.write(path, ("").getBytes());

这完全是浪费时间。new FileOutputStream(...) 已经做了那件事,现在你又强制它删除在此创建的文件。 - user207421

0

0

new FileOutputStream(f) 通常会创建一个文件,但不幸的是,您可能会遇到 FileNotFoundException

如果文件存在但是是目录而不是常规文件,不存在但无法创建,或由于任何其他原因无法打开

来自Javadoc

换句话说,可能有很多情况下您会收到 FileNotFoundException,意味着“无法创建您的文件”,但您将无法找到文件创建失败的原因。

解决方案是删除对 File API 的任何调用,并改用 Files API,因为它提供了更好的错误处理。通常将任何 new FileOutputStream(f) 替换为 Files.newOutputStream(p)

在需要使用 File API 的情况下(例如,您使用 File 的外部接口),使用 Files.createFile(p) 是确保正确创建文件的好方法,如果没有,则会知道为什么它不起作用。一些人在上面发表评论说这是多余的。这是真的,但您可以获得更好的错误处理,这在某些情况下可能是必要的。


1
Files.newOutputStream() 的错误处理并不比 new FileOutputStream 更好。如果您有不同看法,请说明理由。 - user207421
2
哈哈,我可以把它还给你:请证明你的说法。 - stackoverflowed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接