Java return 一个已删除的文件

Java return a deleted file

我正在开发 Java Play 端点,它将 CSV 写入临时目录 -> returns CSV -> 然后删除 CSV。

我不想依赖Play框架来删除文件,我也不想依赖外部进程来监视临时目录。

我想要做的是播放 return 一个未链接的文件,以便垃圾收集器在文件 returned 后删除该文件。但是,作为 Java 的新手,我不确定这是如何完成的。非常感谢社区可能提供的有关如何执行此操作的任何指导。非常感谢你。

垃圾收集器无法删除文件,这是一个操作系统构造,远远超出了垃圾收集的范围。

不过您可以做的是创建一个临时文件:

File temp= File.createTempFile("myprefix-", ".suffix");
temp.deleteOnExit();

JVM 会在适当的时候清理它。

注意:如果安全是一个问题并且您不希望文件四处闲逛,那么这可能是个问题。

我还建议,如果可能,您绕过文件的写入并直接 return CSV String。在您上面的用例中,临时文件似乎是多余的。

好的,所以,我想我明白了。我需要做的是打开文件并为其创建一个 link。然后我保持 link 打开并删除文件。我仍然能够 return 文件,因为我通过在读取/打开文件时创建的 link 和 not 关闭时在内存中引用了它那个文件阅读器。然后我 return 文件。一旦程序退出,对文件位置的引用将被垃圾收集,文件可以从内存中删除。这是要演示的示例 class。

`
import java.io.*;

public class FileUtil {

public File generateFile() {
    File sampleFile = new File("./sampleFile.txt");
    try {
        FileOutputStream is = new FileOutputStream(sampleFile);
        OutputStreamWriter osw = new OutputStreamWriter(is);
        Writer w = new BufferedWriter(osw);
        w.write("sample file text");
        w.write("testing new line");
        w.close();
    } catch (IOException e) {
        System.err.println("Problem writing to the file sampleFile.txt");
    }

    String line = null;

    try {
        FileReader fileReader = new FileReader(sampleFile);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        while((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        // do not close fileReader
        // leave it open so that we can delete the file and still return it
    } catch (FileNotFoundException ex) {
        System.out.println("Unable to open file");
    } catch (IOException ex) {
        System.out.println("Error reading file");
    }

    sampleFile.delete();

    return sampleFile.getAbsoluteFile();
}

public static void main(String[]args) {
    FileUtil myFile = new FileUtil();
    myFile.generateFile();
}
}`