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();
}
}`
我正在开发 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();
}
}`