Java返回一个已删除的文件

时间:2018-04-30 20:05:55

标签: java playframework java-io

我正在使用将CSV写入临时目录的Java Play端点 - >返回CSV - >然后删除CSV。

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

我想要做的是播放返回一个未链接的文件,以便垃圾收集器在文件返回后删除该文件。但是,对Java不熟悉,我不确定如何做到这一点。非常感谢社区对如何做到这一点的任何指导。非常感谢你。

2 个答案:

答案 0 :(得分:0)

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

你可以做的是创建一个临时文件:

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

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

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

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

答案 1 :(得分:0)

好的,所以,我想我已经明白了。我需要做的是打开文件并创建一个链接。然后我保持该链接打开并删除该文件。我仍然可以返回该文件,因为我在内存中通过读取/打开文件时创建的链接以及而不是关闭该文件读取器来引用它。然后我返回文件。程序退出后,对文件位置的引用将被垃圾收集,文件可以从内存中删除。这是一个示例类。

`
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();
}
}`