2016-05-22 17 views
3

我试图将我的项目中的资源复制到磁盘上的另一个位置。到目前为止,我有这样的代码:如何将资源复制到Java中另一个位置中的文件

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类是过时了,所以我在想,如果有一个更好的办法做我想要做的事。

回答

4

查看文档的番石榴InputSupplier class

对于InputSupplier<? extends InputStream>,使用ByteSource代替。对于InputSupplier<? extends Reader>,请使用CharSource。不属于这些类别之一的InputSupplier的实现不受益于common.io中的任何方法,并应使用不同的接口。这个接口定于去除2015年12月

你的情况

所以,你正在寻找ByteSource

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

更多信息,请参见番石榴维基this section


如果你正在寻找一个纯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和更高。

+0

我刚刚找到纯java解决方案,并即将发布它,然后我看到了您的编辑。谢谢一堆! – NonameSL

+0

请注意,您显示的纯Java版本与Guava版本有重要区别:它甚至不尝试关闭资源流。 Guava版本保证复制后关闭流,无论它是成功还是失败。 – ColinD

相关问题