【问题标题】:Java FileOutputStream Create File if not existsJava FileOutputStream 如果不存在则创建文件
【发布时间】:2012-03-26 02:44:51
【问题描述】:

有没有办法使用 FileOutputStream,如果一个文件(字符串文件名)不存在,那么它会创建它?

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

【问题讨论】:

    标签: java file file-io new-operator fileoutputstream


    【解决方案1】:

    如果文件不存在且无法创建 (doc),它将抛出 FileNotFoundException,但如果可以,它将创建它。为了确保您可能应该在创建 FileOutputStream 之前首先测试该文件是否存在(如果不存在则使用 createNewFile() 创建):

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

    【讨论】:

    • 如果文件不存在,如何创建一个空的.txt文件?
    • @StefanDunn 使用 createNewFile() 方法,如我的示例所示。
    • 条件是多余的。根据JavaDoc 的说法,createNewFile() 本身会原子地检查文件的存在。
    • @aztek 也许我们可以保留条件以提高代码可读性
    • createNewFile() 在这里完全是浪费时间。系统已经这样做了。你只是强迫它看两次。
    【解决方案2】:

    在创建文件之前,需要创建所有父目录。

    使用yourFile.getParentFile().mkdirs()

    更新:仅当所有父文件夹不存在时才创建它们。否则就没有必要了。

    【讨论】:

    • 这不是必要的,或者像你最初写的那样需要。仅当它们不存在时。
    【解决方案3】:

    来自 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);
    

    如果不允许当前用户进行操作,上述所有操作都会抛出异常。

    【讨论】:

      【解决方案4】:

      你可以创建一个空文件,不管它是否存在......

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

      如果你想离开文件,如果它存在......

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

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

      【讨论】:

      • 在这两种情况下都会抛出FileNotFoundException
      【解决方案5】:
      File f = new File("Test.txt");
      if(!f.exists()){
        f.createNewFile();
      }else{
        System.out.println("File already exists");
      }
      

      将此f 传递给您的FileOutputStream 构造函数。

      【讨论】:

      • 这里有一个竞争条件...最好按如下方式进行: File f = new File("Test.txt"); if (!f.createNewFile()) { System.out.println("文件已存在"); }
      • 这完全是浪费时间。 new FileOutputStream(...) 已经这样做了,现在你正在强制它删除这里创建的文件。
      【解决方案6】:

      如果不存在则创建文件。如果文件退出,清除其内容:

      /**
       * 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(...) 已经这样做了,现在你正在强制它删除这里创建的文件。
      【解决方案7】:

      仅在使用路径和文件不存在时才提供另一种创建文件的方法。

      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(...) 已经这样做了,现在你正在强制它删除这里创建的文件。
      【解决方案8】:

      如果文件不存在,您可能会获得FileNotFoundException

      Java 文档说:

      文件是否可用或是否可以创建取决于 底层平台 http://docs.oracle.com/javase/7/docs/api/java/io/FileOutputStream.html

      如果您使用的是 Java 7,则可以使用 java.nio 包:

      options参数指定如何创建或打开文件...它打开文件进行写入,如果文件不存在则创建文件...

      http://docs.oracle.com/javase/7/docs/api/java/nio/file/Files.html

      【讨论】:

        【解决方案9】:

        new FileOutputStream(f) 在大多数情况下会创建一个文件,但不幸的是你会得到一个 FileNotFoundException

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

        from Javadoc

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

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

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

        【讨论】:

        • Files.newOutputStream() 没有比new FileOutputStream 更好的错误处理能力。如果您不这么认为,请证实您的说法。
        • 哈哈,我可以还给你:请证实你的说法。
        猜你喜欢
        • 2017-02-19
        • 2012-05-10
        • 2016-06-09
        • 2016-02-08
        • 2020-08-18
        • 2018-10-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多