有没有办法使用 ClassLoader 和 getClass() 方法从 res 文件夹中获取文件
Is there a way to get a file from res folder with ClassLoader and getClass() method
我有 loadImage
获取图像的功能。它仅在我尝试从 getFile()
函数获取文件时不起作用。
public BufferedImage loadImage(String img) {
BufferedImage bimg = null;
try {
bimg = ImageIO.read(new File("res/" + img));
} catch (Exception e1) {
try {
bimg = ImageIO.read(ClassLoader.getSystemResource("res/" + img));
} catch (Exception e2) {
try {
bimg = ImageIO.read(getClass().getResource("res/" + img));
} catch (Exception e3) {
System.out.println("Cannot load image: " + img);
}
}
}
return bimg;
}
我试过使用以下函数:
public File getFile(String file) {
File f = null;
try {
f = new File("res/" + file);
} catch (Exception e1) {
try {
f = new File(ClassLoader.getSystemResource("res/" + file).getFile());
} catch (Exception e2) {
try {
f = new File(getClass().getResource("res/" + file).getFile());
} catch (Exception e3) {
System.out.println("Cannot load File: " + file);
}
}
}
return f;
}
这些函数在 jar 库中,我的其他项目想从 jar 库中获取文件。
这是在我的项目中试图从 jar 库中获取 config.cfg 文件
File file = files.getFile("config.cfg");
我已经打开 jar 并检查了 jar 中是否存在该文件。
这取决于你的包装。
请记住,您不必将应用程序打包为 jar 文件 - 它可以是未打包的形式,在单独的目录中包含 类(就像在 jar 文件中但没有它).
在 Java 中获取 File
就像在您作为 运行 应用程序的操作系统中获取文件一样。因此,如果您有一个 "non-jar" 表单,那么您的代码就可以正常工作。但是如果你有一个 JAR 应用程序,那么你的操作系统必须支持对打包文件(jar 实际上是 ZIP 存档)的操作,就像对非打包文件一样。但是,我不知道这种情况。
总而言之 - 从资源(从应用程序的 jar 文件)获取文件将不起作用,因为它应该允许本机文件系统执行普通文件允许的所有操作(复制、粘贴、写入,更改属性等)。以流的形式获取资源是另一回事(它适用于所有情况)。
编辑:
根据您的评论,您有一个 JAR
表格。在这种情况下,从资源中获取文件 File
根本不起作用。
您可以使用 Class.getResourceAsStream(String name)。例如,如果 jar 文件中有 "/data/config.cfg"
,则可以使用以下行打开该文件进行读取:
InputStream is = this.getClass().getResourceAsStream("/data/config.cfg");
我有 loadImage
获取图像的功能。它仅在我尝试从 getFile()
函数获取文件时不起作用。
public BufferedImage loadImage(String img) {
BufferedImage bimg = null;
try {
bimg = ImageIO.read(new File("res/" + img));
} catch (Exception e1) {
try {
bimg = ImageIO.read(ClassLoader.getSystemResource("res/" + img));
} catch (Exception e2) {
try {
bimg = ImageIO.read(getClass().getResource("res/" + img));
} catch (Exception e3) {
System.out.println("Cannot load image: " + img);
}
}
}
return bimg;
}
我试过使用以下函数:
public File getFile(String file) {
File f = null;
try {
f = new File("res/" + file);
} catch (Exception e1) {
try {
f = new File(ClassLoader.getSystemResource("res/" + file).getFile());
} catch (Exception e2) {
try {
f = new File(getClass().getResource("res/" + file).getFile());
} catch (Exception e3) {
System.out.println("Cannot load File: " + file);
}
}
}
return f;
}
这些函数在 jar 库中,我的其他项目想从 jar 库中获取文件。
这是在我的项目中试图从 jar 库中获取 config.cfg 文件
File file = files.getFile("config.cfg");
我已经打开 jar 并检查了 jar 中是否存在该文件。
这取决于你的包装。
请记住,您不必将应用程序打包为 jar 文件 - 它可以是未打包的形式,在单独的目录中包含 类(就像在 jar 文件中但没有它).
在 Java 中获取 File
就像在您作为 运行 应用程序的操作系统中获取文件一样。因此,如果您有一个 "non-jar" 表单,那么您的代码就可以正常工作。但是如果你有一个 JAR 应用程序,那么你的操作系统必须支持对打包文件(jar 实际上是 ZIP 存档)的操作,就像对非打包文件一样。但是,我不知道这种情况。
总而言之 - 从资源(从应用程序的 jar 文件)获取文件将不起作用,因为它应该允许本机文件系统执行普通文件允许的所有操作(复制、粘贴、写入,更改属性等)。以流的形式获取资源是另一回事(它适用于所有情况)。
编辑:
根据您的评论,您有一个 JAR
表格。在这种情况下,从资源中获取文件 File
根本不起作用。
您可以使用 Class.getResourceAsStream(String name)。例如,如果 jar 文件中有 "/data/config.cfg"
,则可以使用以下行打开该文件进行读取:
InputStream is = this.getClass().getResourceAsStream("/data/config.cfg");