我想知道Class.getResource()
和之间的区别是什么ClassLoader.getResource()
?
编辑:我特别想知道文件/目录级别是否涉及任何缓存.如"在类版本中缓存的目录列表?"
以下AFAIK应该基本上做同样的事情,但它们不是:
getClass().getResource()
getClass().getClassLoader().getResource()
Run Code Online (Sandbox Code Playgroud)
我在摆弄一些报告生成代码时发现了这一点,该代码WEB-INF/classes/
从该目录中的现有文件创建了一个新文件.当使用Class中的方法时,我可以找到部署时使用的文件getClass().getResource()
,但在尝试获取新创建的文件时,我收到了一个null对象.浏览目录会清楚地显示新文件存在.文件名前面带有正斜杠,如"/myFile.txt"中所示.
另一方面,ClassLoader
版本getResource()
确实找到了生成的文件.根据这种经验,似乎存在某种目录列表的缓存.我是对的,如果是的话,这会记录在哪里?
从API文档上Class.getResource()
查找具有给定名称的资源.搜索与给定类关联的资源的规则由类的定义类加载器实现.此方法委托给此对象的类加载器.如果此对象由引导类加载器加载,则该方法委托给ClassLoader.getSystemResource(java.lang.String).
对我来说,这是"Class.getResource真正调用它自己的类加载器的getResource()".这和做的一样getClass().getClassLoader().getResource()
.但显然不是.有人可以请我为此事提供一些启示吗?
我有这个代码从目录中读取所有文件.
File textFolder = new File("text_directory");
File [] texFiles = textFolder.listFiles( new FileFilter() {
public boolean accept( File file ) {
return file.getName().endsWith(".txt");
}
});
Run Code Online (Sandbox Code Playgroud)
它很棒.它使用目录"text_directory"中以".txt"结尾的所有文件填充数组.
如何在 JAR文件中以类似的方式读取目录的内容?
所以我真正想做的是,列出我的JAR文件中的所有图像,所以我可以加载它们:
ImageIO.read(this.getClass().getResource("CompanyLogo.png"));
Run Code Online (Sandbox Code Playgroud)
(那个是有效的,因为"CompanyLogo"是"硬编码的",但JAR文件中的图像数量可以是10到200个可变长度.)
编辑
所以我想我的主要问题是:如何知道我的主类所在的JAR文件的名称?
当然,我可以使用它来阅读它java.util.Zip
.
我的结构是这样的:
他们就像:
my.jar!/Main.class
my.jar!/Aux.class
my.jar!/Other.class
my.jar!/images/image01.png
my.jar!/images/image02a.png
my.jar!/images/imwge034.png
my.jar!/images/imagAe01q.png
my.jar!/META-INF/manifest
Run Code Online (Sandbox Code Playgroud)
现在我可以使用以下命令加载例如"images/image01.png":
ImageIO.read(this.getClass().getResource("images/image01.png));
Run Code Online (Sandbox Code Playgroud)
但只是因为我知道文件名,其余的我必须动态加载它们.
如何使用ClassLoader.getResources()
从类路径中查找recursivly资源?
例如
找到META-INF
"目录" 中的所有资源:想象一下
getClass().getClassLoader().getResources("META-INF")
不幸的是,这只会检索URL
到这个"目录".
所有资源命名bla.xml
(recursivly)
getClass().getClassLoader().getResources("bla.xml")
但是这会返回一个空的Enumeration
.
并作为一个奖金问题:如何ClassLoader.getResources()
区别ClassLoader.getResource()
?
我需要在java项目中获取资源图像文件.我在做的是:
URL url = TestGameTable.class.getClass().
getClassLoader().getResource("unibo.lsb.res/dice.jpg");
Run Code Online (Sandbox Code Playgroud)
目录结构如下:
unibo/
lsb/
res/
dice.jpg
test/
..../ /* other packages */
Run Code Online (Sandbox Code Playgroud)
事实是,我总是得到文件不存在.我尝试了很多不同的路径,但我无法解决问题.任何提示?
不确定这是怎么回事.我重读了getResourceAsStream,它总是返回null.
InputStream source = this.getClass().getResourceAsStream("test.xml");
Run Code Online (Sandbox Code Playgroud)
Finder中的test.java旁边(使用OS X和Eclipse)是test.xml
我可以在TextWrangler中打开它,并将其视为存在于内部的数据.
如果它有任何不同,这是一个Junit测试.我去查看我们系统上现有的Junit测试,并且我以与工作示例完全相同的方式使用它(如文件所在的位置和代码本身).
可以防止我假设getClass()返回正确的路径有什么小的差别?
谢谢!
我有一个函数,我试图将文件加载到一个URL
对象,因为示例项目说.
public class SecureFTP {
public static void main(String[] args) throws IOException , ClassNotFoundException, SQLException , JSchException, SftpException{
File file = new File("/home/xxxxx/.ssh/authorized_keys");
URL keyFileURL = this.getClass().getClassLoader().getResource(file);
Run Code Online (Sandbox Code Playgroud)
我尝试过使用SecureFTP.class.getResource
,但仍无法编译.
我对Java很新,所以我知道我做错了什么.
我最近开发了一个应用程序并创建了jar文件.
我的一个类创建了一个输出目录,用它的资源填充文件.
我的代码是这样的:
// Copy files from dir "template" in this class resource to output.
private void createOutput(File output) throws IOException {
File template = new File(FileHelper.URL2Path(getClass().getResource("template")));
FileHelper.copyDirectory(template, output);
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这不起作用.
没有运气我尝试了以下内容:
使用Streams解决其他类的类似问题,但它不适用于dirs.代码类似于 http://www.exampledepot.com/egs/java.io/CopyFile.html
使用创建文件模板 new File(getClass().getResource("template").toUri())
在写这篇文章的时候,我正在思考而不是在资源路径中有一个模板目录,而是有一个zip文件.这样做我可以将文件作为inputStream并将其解压缩到我需要的位置.但我不确定这是不是正确的方法.
以下是磁盘名称前面的前导斜杠.我怎么能避免这种情况?
String pngpath = getClass().getResource("/resources/lena.png").getPath();
System.out.println("pngpath = "+pngpath);
Run Code Online (Sandbox Code Playgroud)
得到:
pngpath = /C:/Users/jgrimsdale/Documents/NetBeansProjects/HelloCV/build/classes/resources/lena.png
Run Code Online (Sandbox Code Playgroud) 我正在为一个需要在初始化期间加载配置文件的项目创建一个JUnit TestCase.
此配置文件位于src/main/resources/config文件夹中的项目内,并且在构建maven期间将其放入JAR内的/ config文件夹中.
初始化类,使用以下语句从那里读取文件:
ClassLoader classloader = this.getClass().getClassLoader();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(classLoader.getResourceAsStream("/config/config.xml")));
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我将这个jar部署并执行到应用程序服务器时,它按预期工作,但是,每当我在Eclipse中的JUnit TestCase中运行它时,getResrouceAsStream方法返回null.
考虑到该类是my.package.MyClassTest.java,并且它位于src/test/java/my/package/MyClassTest.java中,我已经尝试将config.xml文件的副本放入以下文件夹中但没有成功:
- src/test/resources/config
- src/test/resources/my/package/config
- src/test/java/my/package/config
Run Code Online (Sandbox Code Playgroud)
我知道在StackOverflow中已经多次询问过类似的问题,但是我发现的所有响应都指的是改变文件的加载方式,虽然更改代码可能是一个选项,但我更愿意找到合适的地方.该文件所以我不需要修改已经在生产环境中工作的东西.
那么,我应该在哪里放置这个文件,以便能够在我的JUnit测试中使用它?
UPDATE
我只是通过对代码进行一些小改动来提出解决方案:我没有使用ClassLoader来获取资源,而是直接使用了类:
Class clazz = this.getClass();
BufferedReader xmlSource = new BufferedReader(new InputStreamReader(clazz.getResourceAsStream("/config/config.xml")));
Run Code Online (Sandbox Code Playgroud)
它从src/test/resources/config/config.xml成功读取文件.
但是,这里有一些非常奇怪的东西:Class.getResourceAsStream方法是:
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
Run Code Online (Sandbox Code Playgroud)
如果我调试它,我可以清楚地看到这个getClassLoader0()返回与前一个调用完全相同的对象(相同的id),this.getClass().getResourceAsStream()(我维护,只是为了比较值)! !
这里发生了什么?!
为什么在工作之间插入新方法调用时直接调用方法不起作用?
老实说,我对此非常惊讶.
顺便说一句,我使用的是JUnit 4.10版.可能以某种方式篡改getClassLoader调用吗?
非常感谢,
普约尔
我试图在JPanel上显示图片,但我一直收到错误:
java.lang.IllegalArgumentException:input == null!
我不明白发生了什么.
这是我正在使用的代码:
public void actionPerformed(ActionEvent e) {
try {
Image image=ImageIO.read(getClass().getResource("img/" +num.getText()+".jpg"));
Image resized = image.getScaledInstance(200, 200, 100);
pictureFrame.setIcon(new ImageIcon(resized));
} catch (Exception ex){
ex.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)
这只会导致我收到错误!
堆栈跟踪产生以下结果:
Java.lang.IllegalArgumentException: input == null!
at javax.imageio.ImageIO.read(ImageIO.java:1362)
at work.Item.actionPerformed(Item.java:96)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
at java.awt.Component.processMouseEvent(Component.java:6297)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3275)
at java.awt.Component.processEvent(Component.java:6062)
at java.awt.Container.processEvent(Container.java:2039)
at java.awt.Component.dispatchEventImpl(Component.java:4660)
at java.awt.Container.dispatchEventImpl(Container.java:2097)
at java.awt.Component.dispatchEvent(Component.java:4488)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4575)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4236)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4166)
at java.awt.Container.dispatchEventImpl(Container.java:2083)
at java.awt.Window.dispatchEventImpl(Window.java:2489)
at java.awt.Component.dispatchEvent(Component.java:4488)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:668)
at …
Run Code Online (Sandbox Code Playgroud) getresource ×10
java ×10
classloader ×3
jar ×2
resources ×2
classpath ×1
file ×1
java-io ×1
junit ×1
url ×1