Java 创建mp4文件不需要';t删除tmp文件
我正在尝试编写一个InputStream,它是我通过调用外部SOAP服务获得的mp4,当我这样做时,它总是为我选择的临时目录(java.io.tmpdir)生成这个tmp文件,这些文件不可移动,并且在编写完成后保留 如果没有目录上的永久tmp,我也可以正常编写从SOAP服务获得的图像。我正在使用Java1.8Springboot 这就是我正在做的: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
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);
}