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

时间:2013-08-09 12:25:41

标签: 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 {

    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 false。这是预期的吗?难道我做错了什么? 文件被过早删除的事实是有问题的,因为我需要测试它的大小,例如在写入文件之后。

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

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

1 个答案:

答案 0 :(得分:5)

看起来Linux JVM会在您打开文件后立即删除该文件,这在Linux上可以实现。这就是我实现它的方式。您必须自己跟踪已经写入文件的数量,例如:插入一个计算字节的FilterOutputStream