4

.jar (program.jar/resources/img/image.gif) にイメージがあり、メインの開始時にメソッドを呼び出して、それらを "C:\folder" にコピーしたいと考えています。ファイル「C:\folder\image.gif」が存在するかどうかを確認し、存在しない場合はコピーします。このトピックについて調査しましたが、それを行う方法が見つかりません。これは私が持っているもので、動作します...しかし、0 バイトの空のファイル (image.gif) が作成されます。私の.jarからのファイルではなくファイルを作成します。

コード:

//MyResources.saveResource("/resources/img/image.gif", "C:\folder", "image.gif");
public static void saveResource(String fromFile, String toFolder, String toFile){
    InputStream stream = MyResources.class.getResourceAsStream(fromFile);
    if (stream == null) {
        //send your exception or warning
    }
    OutputStream resStreamOut;
    int readBytes;
    byte[] buffer = new byte [4096];
    try {
        resStreamOut = new FileOutputStream(new File (toFolder + File.separator + toFile));
        while ((readBytes = stream.read(buffer)) != -1){ //LINE 80
            resStreamOut.write (buffer, 0, readBytes); 
        }
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
}

また、エラーが発生します (ファイルが空である理由を説明する NullPointerException ですが、解決方法がわかりません):

Exception in thread "main" java.lang.NullPointerException at
com.github.CrafterPGSV.Chess.Library.MyResources.saveResource(MyResources.java:80)
at com.github.CrafterPGSV.Chess.Library.MyResources.createFolders(MyResources.java:61)
at com.github.CrafterPGSV.Chess.Chess.main(Chess.java:10)

私のメインコール「MyResources.createFolders();」フォルダーが存在しない場合は作成します。「createFolders」の最後に、「saveResources(...)」を呼び出して画像を保存します。

4

2 に答える 2

0

エラーは「saveResource()」の最初の行でした:

InputStream stream = this.getClass().getResourceAsStream(fromFile);

ここで、「ストリーム」は常にnullでした。これを解決する方法は次のとおりです(Eclipseを使用)。

  1. srcに新しいパッケージを作成します(これをresourcesと呼びましょう)。

  2. パッケージに新しいフォルダを作成します(これをmyPicturesと呼びます) 。

  3. 必要に応じて、さらにフォルダを作成します。myPictures内に新しいフォルダを作成し、それをpartyPicturesと呼びます

  4. フォルダの1つを選択し、画像(またはその他)を中に入れます。partyPictures内にimageName.jpgという画像があります

  5. 次に、「ナビゲーター」に移動してProyectを見つけると、binというフォルダーがあることがわかります。内部には、パッケージがフォルダに整理されているのがわかります。

  6. 以前に作成したパッケージの名前が付いているbin内のフォルダーを探します( resourcesというフォルダーがあります)。フォルダ内には、パッケージ内のフォルダ(以前に作成したフォルダ)のツリービューが表示されます。

  7. ファイルを探します。(resources / myPictures / partyPictures / imageName.jpgを探します)

  8. 存在しない場合、InputStream stream = this.getClass()。getResourceAsStream(fromFile); 常にnullになります。これを修正するには、画像(または任意のファイル)をフォルダーにコピーします。

  9. 次に、

    String fromFile = "/resources/myPictures/partyPictures/imageName.jpg";
    InputStream stream = this.getClass().getResourceAsStream(fromFile);
    
  10. 文字列fromFileをファイルのパスに変更し、常に/で開始します。コードは次のようになります。

String fromFile = "/ packageName / folderName / fileName.extension ";

InputStreamストリーム=this.getClass()。getResourceAsStream(fromFile);

それはそれであるはずです!

于 2013-03-22T11:56:55.870 に答える
0

他の回答が削除された理由はわかりませんが、resStreamOut.close()書き終わったら必要です。

ケースを実装する必要がありますstream == null(おそらく例外をスローします)。

また、決してエラーをキャッチして飲み込まないでください。これはエラー処理でprintStackTrace()なく、エラーの無視です。

于 2013-03-21T14:23:07.777 に答える