当前位置:  开发笔记 > 编程语言 > 正文

使用资源处理临时文件

如何解决《使用资源处理临时文件》经验,为你挑选了1个好方法。

对于我的应用程序,我必须编写一个方法,该方法接受一个InputStreamas参数,将内容写入临时文件,执行一些操作,最后删除临时文件.

这是我到目前为止:

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());
    }
}

我敢肯定它不是最好的,但它现在完成了这项工作.如果有人就如何以任何方式改进这一点提出建议,那么建议非常受欢迎.



1> zapl..:

我想用一个小助手/包装器就好

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) {
        // 
    }
}

推荐阅读
无名有名我无名_593
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有