我有一个临时文件,我想从Play Framework中的控制器发送客户端。使用FileInputStream打开连接后可以删除文件吗?例如我可以做这样的事情 -
File file = getFile();
InputStream is = new FileInputStream(file);
file.delete();
renderBinary(is, "name.txt");
如果文件是大文件怎么办?如果我删除该文件,InputStream上的后续reads()会出错吗?我尝试过大约1MB的文件我没有收到错误。
很抱歉,如果这是一个非常天真的问题,但我找不到与此相关的任何内容,而且我对Java很陌生
答案 0 :(得分:1)
我刚刚在一些代码中遇到了这个完全相同的场景。程序员正在创建一个临时文件,在其上获取输入流,删除临时文件,然后调用renderBinary。即使对于非常大的文件,它似乎也能正常工作,甚至可以达到千兆字节。
我对此感到惊讶,我仍然在寻找一些文件来说明这是为什么会有效。
更新:我们终于遇到了导致此事件爆炸的文件。我认为它超过3 Gb。此时,有必要在渲染过程中不删除文件。实际上我最终使用Amazon Queue服务来排队这些文件的消息。然后,通过计划的删除作业检索消息。即使在负载均衡器上使用群集服务器,也能很好地工作。
答案 1 :(得分:0)
在删除文件后,FileInputStream仍然可以读取,这似乎是违反直觉的。
DiskLruCache,源自Android平台的libcore的Android世界中的热门库,甚至依赖于此“功能”,如下所示:
// Open all streams eagerly to guarantee that we see a single published
// snapshot. If we opened streams lazily then the streams could come
// from different edits.
InputStream[] ins = new InputStream[valueCount];
try {
for (int i = 0; i < valueCount; i++) {
ins[i] = new FileInputStream(entry.getCleanFile(i));
}
} catch (FileNotFoundException e) {
....
正如@EJP在his comment中指出的类似问题,“这就是Unix和Linux的行为。删除文件实际上是从目录中删除它的名称:inode和数据在任何进程拥有它时都会持续存在开“。
但我认为依靠它不是一个好主意。