创建文件后,Java file.createNewFile()返回false

创建文件后,Java file.createNewFile()返回false,java,Java,我有这段代码,我在其中创建一个目录,然后在目录中创建一个.txt文件。我为文件是否已创建分配了一个布尔值,即使在“重新运行”时,布尔值也始终为false,即确保所述目录以及所述.txt文件不存在,方法是在以前的运行中创建后手动删除它们 这是我的代码的简化版本 import java.io.*; public class Test{ public static void main(String[] args){ File dir = new File("TheDirector

我有这段代码,我在其中创建一个目录,然后在目录中创建一个.txt文件。我为文件是否已创建分配了一个布尔值,即使在“重新运行”时,布尔值也始终为false,即确保所述目录以及所述.txt文件不存在,方法是在以前的运行中创建后手动删除它们

这是我的代码的简化版本

import java.io.*;
public class Test{
  public static void main(String[] args){
    File dir = new File("TheDirectory");
    dir.mkdir();
    String path = dir.getAbsolutePath();
    File f = new File(path + "\\TheFile.txt");
    boolean isCreated = f.createNewFile();
    System.out.println(isCreated); //false            
  }
}
所以,我不明白为什么iscreate总是返回false。 我错过了什么

编辑: 好吧,也许我把代码简单化了?让我发布一个更原始的版本

import java.io.*;

public class Test {
    public static void main(String[] args){
        try{
            File dir = new File("4June");
            dir.mkdir();
            String path = dir.getAbsolutePath();
            File f = new File(path + "\\demo.txt");
            FileWriter fw = new FileWriter(f);
            FileReader fr = new FileReader(f);
            //create file
            try{
                boolean result = f.createNewFile();
                System.out.println(result + "" + f.getAbsolutePath());
                if (result){
                    System.out.println("file created " + f.getCanonicalPath()); //returns the path string  
                    System.out.println("file created " + f2.getAbsolutePath());   
                }
            }
            catch(Exception e){e.printStackTrace();}
            //code for writing in the file, reading, other stuff
        }catch(Exception e){e.printStackTrace();}
    }
}

该方法返回false,因为存在同名的文件。请参阅此处的“返回值”部分:。不知何故,当您运行.createNewFile方法时,该文件已经存在。我运行了代码,结果返回true。因此,您没有提供足够的信息,或者没有正确删除该文件。

该方法返回false,因为已经存在同名文件。请参阅此处的“返回值”部分:。不知何故,当您运行.createNewFile方法时,该文件已经存在。我运行了代码,结果返回true。因此,您没有提供足够的信息,或者没有正确删除文件。

在Java中创建FileWriter或FileOutputStream也会创建相应的文件

我从Java1.0.1开始使用Java,FileOutputStream和FileWriter的构造函数总是创建文件

JavaDoc没有明确说明这一点,只是说如果无法创建文件,构造函数将失败。由于如果无法创建文件,则没有其他方法被记录为失败,因此这意味着构造函数必须实际创建文件,就好像没有其他方法会因为创建文件失败而失败一样,并且没有其他方法以这种方式记录

尽管如此,这只是一种暗示。JavaDoc的严格解释允许永远不会创建或写入文件。如果无法创建文件,但实际上不需要创建,则构造函数将失败。写入方法允许写入缓冲区,而不是磁盘。flush方法只需要将数据传递到操作系统,close方法只需要释放操作系统资源。任何地方都不能保证文件是实际创建的,数据也确实存在于文件中

JLS确实声明FileOutputStream必须打开到实际文件的连接,并且write方法必须写入该文件,但是对于第二版,此规范已从JLS中删除,只剩下JavaDoc

合理的预期是FileOutputStream和FileWriter将继续保持一贯的行为。调用write方法后,文件将由其构造函数创建,字节将在文件中结束,close表示刷新。对这些行为的任何更改,尽管在JavaDoc的信函中,都将被开发人员视为一个主要错误

如果您希望有明确的记录行为,请使用以下工具创建您的编写器:

    Path path = Paths.get("4June");
    try (
        FileChannel channel = FileChannel.open(path, 
                StandardOpenOption.WRITE,
                StandardOpenOption.CREATE,
                StandardOpenOption.TRUNCATE_EXISTING);
        Writer writer = Channels.newWriter(channel, StandardCharsets.UTF_8)
    ) {
      // write text to the file via the writer
      // ...
      // ...

      // Flush the writer so all the data reaches the channel
      writer.flush();

      // Force the channel to ensure the bytes have reached the disk
      channel.force(true);
    }
这承诺创建文件并将所有写入文件的字节传递给文件,但需要比简单使用FileWriter更多的代码。

在Java中创建FileWriter或FileOutputStream也将创建相应的文件

我从Java1.0.1开始使用Java,FileOutputStream和FileWriter的构造函数总是创建文件

JavaDoc没有明确说明这一点,只是说如果无法创建文件,构造函数将失败。由于如果无法创建文件,则没有其他方法被记录为失败,因此这意味着构造函数必须实际创建文件,就好像没有其他方法会因为创建文件失败而失败一样,并且没有其他方法以这种方式记录

尽管如此,这只是一种暗示。JavaDoc的严格解释允许永远不会创建或写入文件。如果无法创建文件,但实际上不需要创建,则构造函数将失败。写入方法允许写入缓冲区,而不是磁盘。flush方法只需要将数据传递到操作系统,close方法只需要释放操作系统资源。任何地方都不能保证文件是实际创建的,数据也确实存在于文件中

JLS确实声明FileOutputStream必须打开到实际文件的连接,并且write方法必须写入该文件,但是对于第二版,此规范已从JLS中删除,只剩下JavaDoc

合理的预期是FileOutputStream和FileWriter将继续保持一贯的行为。文件将由其构造函数创建,字节将以 在调用write方法后删除文件,close表示刷新。对这些行为的任何更改,尽管在JavaDoc的信函中,都将被开发人员视为一个主要错误

如果您希望有明确的记录行为,请使用以下工具创建您的编写器:

    Path path = Paths.get("4June");
    try (
        FileChannel channel = FileChannel.open(path, 
                StandardOpenOption.WRITE,
                StandardOpenOption.CREATE,
                StandardOpenOption.TRUNCATE_EXISTING);
        Writer writer = Channels.newWriter(channel, StandardCharsets.UTF_8)
    ) {
      // write text to the file via the writer
      // ...
      // ...

      // Flush the writer so all the data reaches the channel
      writer.flush();

      // Force the channel to ensure the bytes have reached the disk
      channel.force(true);
    }

这承诺创建文件并将所有写入文件的字节传递给文件,但需要的代码比简单使用FileWriter要多。

如果文件名已经存在,则返回false。是的,但正如我所说,我在运行程序之前删除了该文件,以确保情况并非如此。无论如何,我现在已经编辑了这个问题,以防我不能准确地报告情况。新的FileWriterf将创建文件f.@SimonG。嗯,好吧,看起来是这样的,但我不确定是哪一部分提到了这一点。构造函数只说它创建了一个新的FileWriter对象。很抱歉,我对Java API不是一个有经验的读者。@Ayush据我所知,文档中没有提到它。它确实指出,如果文件不存在但无法创建,新FileWriter将抛出IOException,但从未声明它将实际创建该文件。FileOutputStream也是如此。如果文件名已经存在,则返回false。是的,但正如我所说,我在运行程序之前删除了该文件,以确保情况并非如此。无论如何,我现在已经编辑了这个问题,以防我不能准确地报告情况。新的FileWriterf将创建文件f.@SimonG。嗯,好吧,看起来是这样的,但我不确定是哪一部分提到了这一点。构造函数只说它创建了一个新的FileWriter对象。很抱歉,我对Java API不是一个有经验的读者。@Ayush据我所知,文档中没有提到它。它确实指出,如果文件不存在但无法创建,新FileWriter将抛出IOException,但从未声明它将实际创建该文件。FileOutputStream也是如此。我不明白。我实际上删除了目录本身,所以文件无论如何都不应该存在,是吗?我不确定我需要提供什么额外的信息,整个代码,也许?@Ayush如果path+\\TheFile.txt已经是一个文件,那么这个调用返回false。它告诉你它不能创建一个已经存在的文件。您可以检查文件是否已经存在,然后执行其他操作将其删除,或者其他操作,或者如果文件存在对您来说不是问题,则忽略此返回。@SnakeDoc但由于我在执行程序之前删除了目录“path”,path\TheFile.txt显然不应该存在,对吗?我还编辑了我的问题,因为我担心我提供的代码过于简单。@Ayush您不是在删除目录,而是在尝试创建目录。调用mkdir不会删除并重新创建目录@SnakeDoc,但我的意思是,在运行程序之前,我正在手动删除它。也就是说,转到路径,删除文件夹,然后运行我的程序。我不懂。我实际上删除了目录本身,所以文件无论如何都不应该存在,是吗?我不确定我需要提供什么额外的信息,整个代码,也许?@Ayush如果path+\\TheFile.txt已经是一个文件,那么这个调用返回false。它告诉你它不能创建一个已经存在的文件。您可以检查文件是否已经存在,然后执行其他操作将其删除,或者其他操作,或者如果文件存在对您来说不是问题,则忽略此返回。@SnakeDoc但由于我在执行程序之前删除了目录“path”,path\TheFile.txt显然不应该存在,对吗?我还编辑了我的问题,因为我担心我提供的代码过于简单。@Ayush您不是在删除目录,而是在尝试创建目录。调用mkdir不会删除并重新创建目录@SnakeDoc,但我的意思是,在运行程序之前,我正在手动删除它。即,转到路径,删除文件夹,然后运行我的程序