Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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 ';URI不是分层的';从.jar加载文件时_Java - Fatal编程技术网

Java ';URI不是分层的';从.jar加载文件时

Java ';URI不是分层的';从.jar加载文件时,java,Java,我正在从事一个基于Java的OpenGL项目,该项目需要在运行时加载纹理。 这是一个Maven管理的项目,打包后所有文件都放在一个.jar 我有以下代码尝试加载纹理: URL url = Utils.class.getResource("/car.jpg"); TextureIO.newTexture(new File(url.toURI()), false); 如果我在Eclipse中运行项目,那么该代码可以正常工作,但是当从命令行打包和执行时,我会得到以下错误(这是指上面的第二行): 假设

我正在从事一个基于
Java
OpenGL
项目,该项目需要在运行时加载纹理。
这是一个
Maven
管理的项目,打包后所有文件都放在一个
.jar

我有以下代码尝试加载纹理:

URL url = Utils.class.getResource("/car.jpg");
TextureIO.newTexture(new File(url.toURI()), false);
如果我在
Eclipse
中运行项目,那么该代码可以正常工作,但是当从命令行打包和执行时,我会得到以下错误(这是指上面的第二行):


假设我需要使用
getResourceAsStream()
,但是我需要将它的值传递到一个
新文件()

您试图将其作为文件访问,但是当您将其打包到一个jar中时,不再有car.jpg文件,它被压缩到jar文件中

因此,您不能将指向它的文件对象装箱,在本例中,URL不是普通的文件URL,而是jar URL中的“特殊”文件

Java能够解码这些URL,或者直接访问资源并为您提供一个InputStream

newTexture方法还直接接受URL或InputStream

要使用URL,请执行以下操作:

TextureIO.newTexture(url, false,"jpg");
要使用输入流,请执行以下操作:

InputStream instr = null;
try {
  instr = Utils.class.getResourceAsStream("/car.jpg");
  TextureIO.newTexture(instr, false, "jpg");
} finally {
  instr.close();
}

没有意识到
TextureIO。newTexture
可以接受
InputStream
,使用这种方法。
InputStream instr = null;
try {
  instr = Utils.class.getResourceAsStream("/car.jpg");
  TextureIO.newTexture(instr, false, "jpg");
} finally {
  instr.close();
}