4

我的 .jar (program.jar/resources/img/image.gif) 中有一个图像,我想在我的 main 开头调用一个方法将它们复制到“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

不知道为什么其他答案被删除,但你resStreamOut.close()写完后需要。

您需要实现这种情况时stream == null(大概抛出异常)。

此外,永远不要捕获和吞下错误:printStackTrace()不是错误处理,而是错误忽略。

于 2013-03-21T14:23:07.777 回答
0

错误是“saveResource()”的第一行:

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

在这里,“流”始终为空。这是解决这个问题的方法(使用 Eclipse):

  1. src中创建一个新(我们称之为resources)。

  2. 在你的中创建一个新文件夹(我们称之为myPictures

  3. 如果需要,可以创建更多文件夹。我将在myPictures 中创建一个新文件夹,并将其命名为partyPictures

  4. 选择一个文件夹并将图像(或其他)放入其中。我将在partyPictures中有一个名为imageName.jpg的图像

  5. 然后,转到“导航器”,找到您的 Proyect,您会看到有一个名为bin的文件夹。在里面,你应该看到你的包被组织在文件夹中。

  6. 在bin中查找具有您之前创建的包名称的文件夹(我将有一个名为resources的文件夹)。在文件夹内,您将看到包内文件夹的树视图(您之前创建的文件夹)。

  7. 查找您的文件。(我会寻找资源/myPictures/partyPictures/imageName.jpg

  8. 如果不存在,InputStream stream = this.getClass().getResourceAsStream(fromFile); 将始终为空。要解决此问题,请将图像(或任何文件)复制到文件夹中。

  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 回答