我正在使用将CSV写入临时目录的Java Play端点 - >返回CSV - >然后删除CSV。
我不想依赖Play框架来删除文件,我也不想依赖外部进程来查看临时目录。我想要做的是播放返回一个未链接的文件,以便垃圾收集器在文件返回后删除该文件。但是,对Java不熟悉,我不确定如何做到这一点。非常感谢社区对如何做到这一点的任何指导。非常感谢你。
答案 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();
}
}`