【问题标题】:why new FileWriter("abc.txt") creates a new file and new File("abc.txt") does not?为什么 new FileWriter("abc.txt") 创建一个新文件而 new File("abc.txt") 没有?
【发布时间】:2011-12-25 16:41:07
【问题描述】:

new File("abc.txt") 不创建实际文件,而new FileWriter("abc.txt") 在磁盘上创建文件。在浏览源代码时,我发现new FileWriter("abc.txt") 最终会创建一个像new File() 这样的文件对象

【问题讨论】:

  • 您确定new FileWriter("abc.txt") 创建了一个新文件吗? AFAIK 它创建一个依赖于某个文件的输出流,但如果没有任何指定的文件,它也可以创建空对象。尝试创建后尝试检查new File("abc.txt")File.canRead()File.canWrite()

标签: java


【解决方案1】:

java.io.File 类的构造函数不在磁盘上创建文件。它只是对文件路径的抽象。该文件是在您写入文件时创建的。

当您创建 FileWriter 时,它会调用 FileOutputStream 的构造函数,该构造函数会调用一系列安全检查,然后调用:

if (append) {
    openAppend(name);
} else {
    open(name);
}

调用open() 在磁盘上创建文件。

编辑:

open() 的定义如下:

/**
 * Opens a file, with the specified name, for writing.
 * @param name name of file to be opened
 */
private native void open(String name) throws FileNotFoundException;

【讨论】:

    【解决方案2】:

    我认为 file.createNewFile() 实际上会创建新文件..请参阅以下代码以了解详细信息...

      File file = new File("D:\\tables\\test.sql");
    
                // if file does not exists, then create it
                if (!file.exists()) {
                    file.createNewFile();
                }
    
                FileWriter fw = new FileWriter(file.getAbsoluteFile());
    

    【讨论】:

      【解决方案3】:

      File 并不总是需要代表一个实际的文件,它可以是您计划创建的、猜测存在的或者您已经删除的。

      来自java.io.File 的 JavaDoc:

      文件和目录路径名的抽象表示。

      此类的实例可能表示也可能不表示实际的文件系统对象,例如文件或目录。

      为了真正创建文件,需要调用createNEwFile(),根据JavaDoc:

      当且仅当具有此名称的文件尚不存在时,自动创建一个以此抽象路径名命名的新的空文件。

      【讨论】:

        【解决方案4】:

        File 对象只是系统中文件位置 (URL) 的表示。您可以在 File 对象上调用 createNewFile() 来编写我们的文件,假设该位置不存在具有该名称的文件。

        【讨论】:

        • 更不用说File 对象也可以是目录。 +1。
        • 非常正确。 File 上也有创建目录的方法。
        【解决方案5】:

        FileWriter 在内部创建一个新的File 对象时,这并不是导致文件存在的原因。这发生在代码的其他部分。 File 对象只是指定文件(或目录)的标准方式,无论它是否存在。

        【讨论】:

          【解决方案6】:

          确实有很多原因,但是:

          文件被 java.io 中的许多类使用。 FileReader 等... FileWriter 是一个使用 File 的“便利”类,它使程序员的工作效率更高。有些类只需要一个指向文件位置的 File 对象,然后根据需要对其进行操作以支持其处理。其他类可能支持 FileWriter,因为它只会写入文件而不是读取。它还使 API 的类型更加强。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2019-07-10
            • 1970-01-01
            • 1970-01-01
            • 2017-07-09
            • 1970-01-01
            • 2011-05-24
            • 1970-01-01
            • 2020-09-02
            相关资源
            最近更新 更多