Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在Eclipse上导出带有图像的jar?_Java_Eclipse_Image_Jar_Embedded Resource - Fatal编程技术网

Java 如何在Eclipse上导出带有图像的jar?

Java 如何在Eclipse上导出带有图像的jar?,java,eclipse,image,jar,embedded-resource,Java,Eclipse,Image,Jar,Embedded Resource,我创建了一种国际象棋游戏(它不完全是国际象棋,但我不知道它的英文名称),我想将它导出为runnable jar 问题是,由于某些奇怪的原因,图像(在这个程序中-玩家)无法导出 如何在eclipse上导出带有图像的可运行jar?谢谢。推荐的方法是在项目根目录下有一个资源目录,并将其包含在源代码目录列表中。这将导致那里的所有图像都被复制到JAR中。如果您在那里创建一个子目录,resource/image,那么您将得到一个JAR,它有一个image目录。您可以通过类加载器访问这些图像: classlo

我创建了一种国际象棋游戏(它不完全是国际象棋,但我不知道它的英文名称),我想将它导出为runnable jar

问题是,由于某些奇怪的原因,图像(在这个程序中-玩家)无法导出


如何在eclipse上导出带有图像的可运行jar?谢谢。

推荐的方法是在项目根目录下有一个
资源
目录,并将其包含在源代码目录列表中。这将导致那里的所有图像都被复制到JAR中。如果您在那里创建一个子目录,
resource/image
,那么您将得到一个JAR,它有一个
image
目录。您可以通过类加载器访问这些图像:

classloader.getResourceAsStream("/image/name.jpg");
或者,每当您将映像传递给接受资源URL的API时:

classloader.getResource("/image/name.jpg");
当然,这完全取决于您构建JAR的具体方式,但是如果您通过Eclipse的导出JAR来实现,您将能够实现我所描述的。如果使用Maven,有一种与我描述的方法非常相似的方法

还要注意,我故意避免演示获取类加载器的代码,因为这在Java中是一个非常重要的主题,应该以特定于上下文的方式来完成。但是,如果您是从与图像位于同一个JAR中的类中执行此操作,那么可以肯定的是,这将从实例方法中执行:

this.getClass().getClassLoader();

这个
在这里是可选的,实际上从代码风格的角度来看并不推荐,但为了清晰起见,我将其包括在内,因为在您自己的类以外的任何类的实例上调用
getClass
都是错误和危险的。

让我举几个例子,以防您觉得有趣:

要将jar文件中的资源(图像)写入DataOutPutStream,请执行以下操作:

public static void readResourceFromJarToDataOutputStream(String file,
        DataOutputStream outW) {
    try {
        InputStream fIs = new BufferedInputStream(new Object() {
        }.getClass().getResourceAsStream(file));
        byte[] array = new byte[4096];
        for (int bytesRead = fIs.read(array); bytesRead != -1; bytesRead = fIs
                .read(array)) {
            outW.write(array, 0, bytesRead);
        }
        fIs.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
要在内存(字节数组)中加载资源,请执行以下操作:


只需将所有资源(如图像、文本文件等)放入可运行Jar所在的目录中即可。它为我解决了问题。

你确定图像不在罐子里吗?你怎么查的?代码如何访问图像?例如,通过
文件
URL
等。打开您的jar文件,您确定您的图像不在那里吗?”jar函数中读取文件的另一个示例:“不是很好。1)
readFileString(String file)
资源不是一个
文件
,因此,不让用户感到困惑是值得的。我会选择
readFileString(String resourcePath)
2)更好地声明
抛出
,而不是在没有
的情况下尝试自己处理它们,最后
,或者继续返回null或空的
StringBuffer
——这不是其他人可以学习的源代码。非常好的反模式!您在哪里见过可以从StringBuffer构建图像?最初的问题是“导出罐子中的图像”…回答得很好。现在我更仔细地看一下,还注意到
classloader.getResource(“/images/name.jpg”)
也非常方便,例如对于Java sound API,
音频系统
通常需要可重新定位的输入流。
getClass().getClassLoader()通过
this.getClass().getClassLoader()为其添加前缀这几乎意味着程序员设计的自定义类。一般来说,只要API接受资源URL而不是流,我会说这是首选方法。@andrewhompson我没有理解你的观点
this.getClass()
。我最初是这样写的,但由于它是多余的,而且对Java来说不是真正的习惯用法(使用显式的
this
限定实例方法),所以删除了它。你的观点是离开它更具教育意义?因为那是我最初的动机。“不够明确”是的,我想就是这样,但你的解释更好。你能把它编辑成答案吗?
public static byte[] readResourceFromJarToByteArray(String resource) {
    InputStream is = null;
    byte[] finalArray = new byte[0];
    try {
        is = new Object() {
        }.getClass().getResourceAsStream(resource);
        if (is != null) {
            byte[] array = new byte[4096];//your buffer size
            int totalBytes = 0;
            if (is != null) {
                for (int readBytes = is.read(array); readBytes != -1; readBytes = is
                        .read(array)) {
                    totalBytes += readBytes;
                    finalArray = Arrays.copyOf(finalArray, totalBytes);
                    System.arraycopy(array, 0, finalArray, totalBytes- readBytes, 
                            readBytes);
                }
            }
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (is != null)
                is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return finalArray;
}