标签: getresource

Class.getResource()和ClassLoader.getResource()有什么区别?

我想知道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().但显然不是.有人可以请我为此事提供一些启示吗?

java classloader getresource

186
推荐指数
5
解决办法
14万
查看次数

如何列出JAR文件中的文件?

我有这个代码从目录中读取所有文件.

    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)

但只是因为我知道文件名,其余的我必须动态加载它们.

java jar file getresource java-io

107
推荐指数
9
解决办法
13万
查看次数

如何正确使用ClassLoader.getResources()?

如何使用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 resources classpath classloader getresource

78
推荐指数
5
解决办法
19万
查看次数

使用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)

事实是,我总是得到文件不存在.我尝试了很多不同的路径,但我无法解决问题.任何提示?

java resources getresource

60
推荐指数
3
解决办法
16万
查看次数

Junit + getResourceAsStream返回Null

不确定这是怎么回事.我重读了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()返回正确的路径有什么小的差别?

谢谢!

java getresource

39
推荐指数
6
解决办法
4万
查看次数

如何从静态上下文中获取getclass().getResource()?

我有一个函数,我试图将文件加载到一个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很新,所以我知道我做错了什么.

java url getresource

34
推荐指数
4
解决办法
5万
查看次数

从jar文件复制目录

我最近开发了一个应用程序并创建了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)

不幸的是,这不起作用.

没有运气我尝试了以下内容:

在写这篇文章的时候,我正在思考而不是在资源路径中有一个模板目录,而是有一个zip文件.这样做我可以将文件作为inputStream并将其解压缩到我需要的位置.但我不确定这是不是正确的方法.

java jar getresource

32
推荐指数
5
解决办法
3万
查看次数

getResource使用java 1.7 windows 7在磁盘名称前面/前面

以下是磁盘名称前面的前导斜杠.我怎么能避免这种情况?

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)

java getresource

16
推荐指数
2
解决办法
7258
查看次数

来自JUnit的getResourceAsStream

我正在为一个需要在初始化期间加载配置文件的项目创建一个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调用吗?

非常感谢,

普约尔

java junit classloader getresource

13
推荐指数
1
解决办法
8568
查看次数

Class.getResource()返回null

我试图在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)

java getresource

10
推荐指数
1
解决办法
3万
查看次数

标签 统计

getresource ×10

java ×10

classloader ×3

jar ×2

resources ×2

classpath ×1

file ×1

java-io ×1

junit ×1

url ×1