Java 如何在Eclipse上导出带有图像的jar?
我创建了一种国际象棋游戏(它不完全是国际象棋,但我不知道它的英文名称),我想将它导出为runnable 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
如何在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;
}