Java 在Linux上关闭之前删除文件

Java 在Linux上关闭之前删除文件,java,linux,nio,Java,Linux,Nio,我使用Java 7 nio API编写了以下代码: import java.io.IOException; import java.io.ObjectOutputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardOpenOption; public class TestDeleteOnClose {

我使用Java 7 nio API编写了以下代码:

import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardOpenOption;

public class TestDeleteOnClose {

    public static void main(String[] args) throws IOException {
        Path tmp = Files.createTempFile("a", "b");
        OutputStream out = Files.newOutputStream(tmp, StandardOpenOption.DELETE_ON_CLOSE);

        ObjectOutputStream os = new ObjectOutputStream(out);

        os.write(0);

        os.flush();
        System.out.println(Files.exists(tmp));
        os.close();
        System.out.println(Files.exists(tmp));
    }
}
在Windows上,我看到了我所期望的,即
true-false
。在Linux上,我看到
false
。这是预期的吗?我做错什么了吗? 文件被过早删除的事实是有问题的,因为我需要测试它的大小,例如在写入之后

我在Linux和Windows上都使用jdk7u25,可以在装有RedHat或ArchLinux的机器上复制


编辑:即使我在再次调用os.write()之前测试文件是否存在,我也会被告知该文件不再存在。如果我使用
CREATE
选项打开文件,那么我将看到
true

看起来Linux JVM会在您打开文件后立即删除该文件,这与您在Linux上所做的一样有意义。这也是我实现它的方式。您必须自己跟踪已写入文件的量,例如,通过插入一个计数字节的
过滤器OutputStream

为什么要这样实现它@AleksandrDubinsky,因为它简单且万无一失。您不需要一个可能执行也可能不执行的关闭挂钩。