如何在Java中将资源复制到另一个位置的文件

4
我正在尝试将项目中的资源复制到磁盘上的另一个位置。到目前为止,我的代码是这样的:

if (!file.exists()){
    try {
        file.createNewFile();
        Files.copy(new InputSupplier<InputStream>() {
            public InputStream getInput() throws IOException {
                return Main.class.getResourceAsStream("/" + name);
            }
        }, file);                   
    } catch (IOException e) {
        file = null;
        return null;
    }
}

它能正常运行,但是InputSupplier类已被废弃,因此我想知道有没有更好的方法来实现我所需的功能。

1个回答

6
请查看GuavaInputSupplier类的文档:

对于InputSupplier<? extends InputStream>,请使用ByteSource代替。对于InputSupplier<? extends Reader>,请使用CharSource。那些不属于这些类别的InputSupplier实现不会从common.io中的任何方法受益,并且应使用其他接口。此接口计划在2015年12月删除。

因此,在您的情况下,您正在寻找ByteSource

Resources.asByteSource(url).copyTo(Files.asByteSink(file));

请查看Guava Wiki的此部分获取更多信息。


如果您正在寻找一个纯Java版本(没有外部库),可以执行以下操作:

try (InputStream is = this.getClass().getClassLoader().getResourceAsStream("/" + name)) {
    Files.copy(is, Paths.get("C:\\some\\file.txt"));
} catch (IOException e) {
    // An error occurred copying the resource
}

请注意,此仅适用于Java 7及更高版本。

我刚找到了纯 Java 解决方案,并正准备发布它,然后我看到了你的编辑。非常感谢! - NonameSL
请注意,您展示的纯Java版本与Guava版本有一个重要区别:它甚至不尝试关闭资源的流。Guava版本保证在复制后关闭流,无论成功与否。 - ColinD
1
@ColinD 他使用了“try with resources”块,因此InputStream将自动关闭。 - pavi2410
@Pavitra:我的评论是针对NonameSL发布的已被删除的答案,而不是这个评论所在的答案。 - ColinD

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接