我只是花了很多时间跟踪一个没有写入文件的bug,并注意到我在创建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)发布于 2014-10-31 01:20:10
它实际上并不是在删除文件。它正在删除文件的内容。当您运行代码并取出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());
}发布于 2014-10-31 01:31:05
删除文件通常只涉及从文件系统中删除其目录条目。
File delete方法根据是否允许删除文件返回true或false。这与Files.delete方法不同,后者在无法删除文件时抛出IOException。因为您没有检查这个返回值,所以您不知道文件是否已被删除。
这一点很重要,因为不同的OSes具有不同的文件删除规则。例如,Linux就是perfectly happy to remove a directory entry for a file that is currently open。因此,您仍然可以读/写已删除的文件。
另一方面,Windows enforces mandatory file locking会简单地拒绝删除该文件。
https://stackoverflow.com/questions/26659238
复制相似问题