对于我的应用程序,我必须编写一个方法,该方法接受一个InputStream
as参数,将内容写入临时文件,执行一些操作,最后删除临时文件.
这是我到目前为止:
public void myMethod(InputStream in, String name) { //... Path path = Paths.get("./tmp/benchmarks/" + name + ".zip") try { Files.copy(in, path); //operations... } catch (IOException e) { //error handling for copy... } finally { try { Files.delete(path)); } catch (IOException e) { //error handling for delete... } } //... }
它完成了这项工作,但看起来也很丑陋.我想知道是否有一些方法可以try-with-resources
更优雅地处理这个问题.有可能吗?
更新:我在十分钟内写了一个即时解决方案.它看起来像这样:
public class TemporaryFileHandler implements AutoCloseable { private File file; public TemporaryFileHandler(final InputStream in, final Path path) throws IOException { Files.copy(in, path); this.file = new File(path.toString()); } public File getFile() { return file; } @Override public void close() throws IOException { Files.delete(file.toPath()); } }
我敢肯定它不是最好的,但它现在完成了这项工作.如果有人就如何以任何方式改进这一点提出建议,那么建议非常受欢迎.
我想用一个小助手/包装器就好
public class AutoDeletingTempFile implements AutoCloseable { private final Path file; public AutoDeletingTempFile() throws IOException { file = Files.createTempFile(null, null); } public Path getFile() { return file; } @Override public void close() throws IOException { Files.deleteIfExists(file); } }
它被关闭并删除它包装的文件得到一个很好的短语法:
public void myMethod(InputStream in, String name) { try (AutoDeletingTempFile wrapper = new AutoDeletingTempFile()) { //Files.copy(in, wrapper.getFile()); //operations... } catch (IOException e) { //error handling for copy... // + temp file creation } }
或者一个整洁的小Closable
羊羔
public void myMethod(InputStream in, Path existingFile, String name) { try (Closeable closable = () -> Files.deleteIfExists(existingFile)) { // ... } catch (IOException e) { // } }