2016-05-22 10 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を使用してください。これらのカテゴリの1つに該当しないInputSupplierの実装はcommon.ioのいずれのメソッドの恩恵も受けず、別のインターフェイスを使用する必要があります。このインターフェースは、あなたのケースではそう

12月2015年に除去するために予定されている、あなたはByteSource探している:

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

詳細については、グアバのWikiのthis sectionを参照してください。あなたは純粋なJava用(なし外部ライブラリ)のバージョンを探しているなら


は、次の操作を実行できます。これは、Java 7以上の場合にのみ有効であることを

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 
} 

注意を。

+0

私はちょうど純粋なJavaソリューションを見つけて、それを投稿しようとしていましたが、あなたの編集を見ました。本当にありがとう! – NonameSL

+0

あなたが表示する純粋なJavaバージョンは、Guavaバージョンとの重要な違いがあることに注意してください。リソースのストリームを閉じることも試みません。 Guavaのバージョンでは、ストリームが成功したか失敗したかにかかわらず、コピー後にストリームが閉じられることが保証されています。 – ColinD

関連する問題