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

Java 使用FileInputStream启动连接后删除文件,java,playframework,inputstream,Java,Playframework,Inputstream,我有一个临时文件,我想从Play框架中的控制器发送给客户端。我可以在使用FileInputStream打开连接后删除该文件吗?例如,我可以这样做吗- File file = getFile(); InputStream is = new FileInputStream(file); file.delete(); renderBinary(is, "name.txt"); 如果文件是一个大文件怎么办?如果删除该文件,InputStream上的后续读取()是否会出错?我试过使用1MB左右的文件,但

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

File file = getFile();
InputStream is = new FileInputStream(file);
file.delete();
renderBinary(is, "name.txt");
如果文件是一个大文件怎么办?如果删除该文件,InputStream上的后续读取()是否会出错?我试过使用1MB左右的文件,但没有出现错误


很抱歉,如果这是一个非常幼稚的问题,但我找不到任何与此相关的内容,而且我对Java非常陌生,我只是在要求我编写的一些代码中遇到了完全相同的情况。程序员正在创建一个临时文件,获取其中的输入流,删除临时文件,然后调用renderBinary。它似乎可以很好地工作,即使是非常大的文件,甚至到千兆字节

我对此感到惊讶,并仍在寻找一些文档,说明为什么这是可行的


更新:我们终于遇到了一个导致这件事爆炸的文件。我想它超过了3GB。此时,有必要在渲染过程中不删除该文件。实际上,我最终使用Amazon队列服务将这些文件的消息排队。然后通过计划的删除作业检索消息。即使使用负载平衡器上的群集服务器,也能很好地工作。

删除文件后,FileInputStream仍然可以读取,这似乎与直觉相反

,一个源于Android平台最新版本的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) {
....
//急切地打开所有流,以确保我们看到单个已发布的
//快照。如果我们懒洋洋地打开溪流,那么溪流就会来
//来自不同的编辑。
InputStream[]ins=新的InputStream[valueCount];
试一试{
对于(int i=0;i
正如@EJP在一个类似的问题上指出的那样,“Unix和Linux就是这样运行的。删除一个文件实际上就是从目录中删除它的名称:inode和数据会在任何进程打开它时保持不变。”


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

也许设置一些计划任务会更安全一些,这些任务会删除超过60分钟的临时文件?只是想知道。@biesior我最后就是这么做的。谢谢!