【问题标题】:Why no Exception when deleting a file of FileOutputStream?为什么删除 FileOutputStream 文件时没有异常?
【发布时间】:2014-10-30 17:11:27
【问题描述】:

我刚刚花了很多时间跟踪一个未写入文件的错误,并注意到我在创建 FileOutputStream 之后但在写入任何内容之前删除了该文件。我可以理解这是错误的,但是为什么它不抛出异常删除文件然后尝试在上面写呢?

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;

public class Test {

    public static void main(String[] args) throws FileNotFoundException, IOException
    {
        File test = new File("test.txt");
        try(OutputStream out = new FileOutputStream(test))
        {
            if(test.exists()) {test.delete();}
            out.write("Hello World".getBytes());
        }
    }
}

我的 Java 安装是否损坏? 我的java -version

java version "1.8.0"
Java(TM) SE Runtime Environment (build 1.8.0-b132)
Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

【问题讨论】:

  • 看看我的回答...

标签: java stream fileoutputstream


【解决方案1】:

它实际上并没有删除文件。它正在删除文件的内容。当您运行代码并取出 out.write 语句时,您会看到该文件实际上并未被删除,它只是从文件中删除文本。它无法完全删除该文件,因为您的 FileOutputStream 正在引用该文件。如果您取出 FileOutputStream 声明,那么它将完全删除该文件。或者,如果您在删除之前关闭 FileOutputStream,那么它将完全删除该文件。

例子:

        File test = new File("test.txt");
        try(OutputStream out = new FileOutputStream(test))
        {
            out.close();
            if(test.exists()) {System.out.println("test2");test.delete();}
            //out.write("Hello World2".getBytes());
        }

【讨论】:

  • 就我而言,它确实是在删除文件。
【解决方案2】:

删除文件通常只涉及从文件系统中删除其目录条目。

File delete 方法根据您是否被允许删除文件返回 true 或 false。这与Files.delete 方法不同,后者在无法删除文件时抛出 IOException。由于您没有检查此返回值,因此您不知道文件是否已被删除。

这很重要,因为不同的操作系统对文件删除有不同的规则。例如,Linux 是perfectly happy to remove a directory entry for a file that is currently open。因此,您仍然可以读取/写入已删除的文件。

另一方面,Windows enforces mandatory file locking 会直接拒绝删除文件。

【讨论】:

  • 但是..为什么删除文件时没有抛出异常?删除文件后,输出流数据会发生什么变化?
猜你喜欢
  • 1970-01-01
  • 2012-05-23
  • 2021-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-10
  • 2011-12-12
  • 2013-08-18
相关资源
最近更新 更多