Java 创建mp4文件不需要';t删除tmp文件

Java 创建mp4文件不需要';t删除tmp文件,java,spring-boot,io,temporary-files,Java,Spring Boot,Io,Temporary Files,我正在尝试编写一个InputStream,它是我通过调用外部SOAP服务获得的mp4,当我这样做时,它总是为我选择的临时目录(java.io.tmpdir)生成这个tmp文件,这些文件不可移动,并且在编写完成后保留 如果没有目录上的永久tmp,我也可以正常编写从SOAP服务获得的图像。我正在使用Java1.8Springboot 这就是我正在做的: File targetFile = new File("D:/archive/video.mp4"); targetFile

我正在尝试编写一个InputStream,它是我通过调用外部SOAP服务获得的mp4,当我这样做时,它总是为我选择的临时目录(java.io.tmpdir)生成这个tmp文件,这些文件不可移动,并且在编写完成后保留

如果没有目录上的永久tmp,我也可以正常编写从SOAP服务获得的图像。我正在使用Java1.8Springboot

这就是我正在做的:


File targetFile = new File("D:/archive/video.mp4");
targetFile.getParentFile().mkdirs(); 
targetFile.setWritable(true);

InputStream inputStream = filesToWrite.getInputStream();
OutputStream outputStream = new FileOutputStream(targetFile);

                    try {

                        int byteRead;

                        while ((byteRead = inputStream.read()) != -1) {
                            outputStream.write(byteRead);
                        }

                    } catch (IOException e) {
                        logger.fatal("Error@ SaveFilesThread for guid:  " + guid, e);
                    }finally {
                        try {
                            inputStream.close();
                            outputStream.flush();
                            outputStream.close();

                        }catch (Exception e){
                            e.printStackTrace();
                        }
还尝试:

byte data[] = IOUtils.toByteArray(inputStream);
Path file = Paths.get("video.mp4");
Files.write(file, data);
从apache commons IO:

 FileUtils.copyInputStreamToFile(initialStream, targetFile);

当您的代码启动时,损坏已经完成。您的代码不是临时文件的源代码(但是,对于可以做得简单得多的事情,需要做大量的工作,请参见下文),最终是框架为您提供了
filesToWrite
变量

在某种程度上,您可以在较早的时候进行连接,获取表示套接字或HTTP连接的原始inputstream,然后直接从那里开始保存文件。或者,也许
filesToWrite
有一种方法可以获取文件本身,在这种情况下,您可以将它们移动到位,而不是复制它们

但是,执行此操作的代码非常混乱,异常处理不好,内存泄漏,对于一个简单的作业来说,代码太多,并且可能比需要的慢2000到10000x,具体取决于您的硬盘(我并不夸张,在无缓冲流上调用单字节
read()
要慢数千倍!)


就这样。这解决了所有的问题——没有泄漏,没有速度损失,代码数量很少,修复了糟糕的错误处理(这里是“将某些内容记录到日志中,然后将某些内容打印到标准输出,然后可能泄漏大量资源,然后不告诉调用代码任何错误,并返回完全与复制操作成功相同的结果).

当代码启动时,损坏已经发生。您的代码不是临时文件的源代码(但是,对于可以做得简单得多的事情,需要做大量的工作,请参见下文),最终是框架为您提供了
filesToWrite
变量

在某种程度上,您可以在较早的时候进行连接,获取表示套接字或HTTP连接的原始inputstream,然后直接从那里开始保存文件。或者,也许
filesToWrite
有一种方法可以获取文件本身,在这种情况下,您可以将它们移动到位,而不是复制它们

但是,执行此操作的代码非常混乱,异常处理不好,内存泄漏,对于一个简单的作业来说,代码太多,并且可能比需要的慢2000到10000x,具体取决于您的硬盘(我并不夸张,在无缓冲流上调用单字节
read()
要慢数千倍!)


就这样。这解决了所有的问题——没有泄漏,没有速度损失,代码数量很少,修复了糟糕的错误处理(这里是“将某些内容记录到日志中,然后将某些内容打印到标准输出,然后可能泄漏大量资源,然后不告诉调用代码任何错误,并返回完全与复制操作成功相同的结果).

该解决方案不起作用。这实际上是一个迫切需要不同解决方案的例子。下面你可以看到我也使用了ApacheCommons IO。这不是一个解决方案,它只是一个旁注,说明了如何更安全、更简单地做到这一点,而不依赖于API设计非常糟糕的旧库:重读这个答案,它解释了当临时文件已经制作好时,粘贴的代码开始运行,你需要去别处看看。如果找不到,请提出新问题或彻底更新此问题:解释什么是“FileToWrite”以及它来自何处。tmp文件不是在此代码之前生成的,它仅在FileUtils.copyInputStreamToFil()出现时才会出现。FileToWrite是来自SOAP服务的。我给你的代码不可能生成那些临时文件,除非
filesToWrite.getInputStream
生成的输入流使它们成为一个输入流,在这种情况下,您仍然无法在这里对其执行任何操作-您必须编辑该代码或使用其他内容。是的,这是不可能的,但正在发生,我做了一个断点,并且仅在生成FileUtils.copyInputStreamToFil()之后,与您提供的代码相同。您是说输入流以某种方式具有写入tmp文件的指令?同一行代码(你的和我的)也从服务中写入了一个inputStream,它是JPG,没有生成tmp,只发生在mp4 inputStream中。该解决方案不起作用。这实际上是一个迫切需要不同解决方案的示例。下面你可以看到我也使用了ApacheCommons IO。这不是一个解决方案,它只是一个旁注,说明了如何更安全、更简单地做到这一点,而不依赖于API设计非常糟糕的旧库:重读这个答案,它解释了当临时文件已经制作好时,粘贴的代码开始运行,你需要去别处看看。如果找不到,请提出新问题或彻底更新此问题:解释什么是“FileToWrite”以及它来自何处。tmp文件不是在此代码之前生成的,它仅在FileUtils.copyInputStreamToFil()出现时才会出现。FileToWrite是来自SOAP服务的。我给你的代码不可能生成那些临时文件,除非
filesToWrite.getInputStream
生成的输入流使它们成为一个输入流,在这种情况下,您仍然无法在这里对其执行任何操作-您必须编辑该代码或使用其他内容。是的,这是不可能的,但正在发生,我做了一个断点,并且仅在生成FileUtils.copyInputStreamToFil()之后,与您提供的代码相同。您是说输入流以某种方式具有写入tmp文件的指令?同一行代码(你的和我的)也从服务中写入了一个inputStream,它是jpgs,没有tmp
// add `throws IOException` to your method signature.
// it saves files, it's supposed to throw IOException,
// 'doing I/O' is in the very definition of your method!

try (InputStream in = filesToWrite.getInputStream();
  OutputStream out = new FileOutputStream(targetFile)) {

    in.transferTo(out);
}