使用FileInputStream启动连接后删除文件

时间:2013-09-19 06:01:53

标签: java playframework inputstream

我有一个临时文件,我想从Play Framework中的控制器发送客户端。使用FileInputStream打开连接后可以删除文件吗?例如我可以做这样的事情 -

File file = getFile();
InputStream is = new FileInputStream(file);
file.delete();
renderBinary(is, "name.txt");

如果文件是大文件怎么办?如果我删除该文件,InputStream上的后续reads()会出错吗?我尝试过大约1MB的文件我没有收到错误。

很抱歉,如果这是一个非常天真的问题,但我找不到与此相关的任何内容,而且我对Java很陌生

2 个答案:

答案 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和数据在任何进程拥有它时都会持续存在开“。

但我认为依靠它不是一个好主意。