【问题标题】:Resource loading using ClassLoader使用 ClassLoader 加载资源
【发布时间】:2018-09-01 23:06:02
【问题描述】:

我有一个需要在运行时加载的资源文件...它位于src/main/resources

我已成功地将文件加载到 inputStream 中:

LoadSAC.class.getClassLoader().getResourceAsStream("someFile.txt");

LoadSAC 是类名...

但是,PMD 抱怨这建议我使用

Thread.currentThread().getContextClassLoader().getResource(...)

我尝试了多种组合,但始终无法找到该文件...任何想法...我已经搜索了很多搜索并提供了很多建议,但似乎没有一个有效...

有什么想法吗?

【问题讨论】:

标签: java classloader


【解决方案1】:

如果someFile.txtLoadSAC.java 位于同一文件夹中,您可以这样做:

InputStream is = LoadSAC.class.getResourceAsStream("someFile.txt");

如果someFile.txt 在子文件夹subdir 中,您可以这样做:

InputStream is = LoadSAC.class.getResourceAsStream("subdir/someFile.txt");

如果您在LoadSAC.java 中的方法是非静态的,您可以将LoadSAC.class.getResourceAsStream... 替换为getClass().getResourceAsStream...

使用antmaven 编译时要小心,默认情况下,只有.java 文件被复制为构建目录中的.class 文件。

您必须编写一些规则以将someFile.txt 包含在最终的jar 中。

在您的resource 目录中,您可以像这样添加一个小助手类:

import java.io.InputStream;
import java.net.URL;

import javax.activation.DataSource;
import javax.activation.URLDataSource;

public abstract class ResourceHelper {

    public static URL getURL(String name) {
        return ResourceHelper.class.getResource(name);
    }

    public static InputStream getInputStream(String name) {
        return ResourceHelper.class.getResourceAsStream(name);
    }

    public static DataSource getDataSource(String name) {
        return new URLDataSource(getURL(name));
    }
}

LoadSAC.java 中拨打电话:

InputStream is = ResourceHelper.getInputStream("someFile.txt");

【讨论】:

  • 是的...我需要的文件在 src/main/resources 文件夹中...它没有与 LoadSAC 类位于同一位置...该方法是 NON STATIC
  • 我已经完成了我的回复,向您展示了一种查找资源的简单方法。希望对你有所帮助。
  • 您可以删除方法getDataSource(以及2个导入javax.activation.*),我将它与Javamail api一起使用。
  • 完美...谢谢!
  • "If someFile.txt is in the same folder than LoadSAC.java..." -- 不,不是真的。这应该是"If someFile.txt is in the same folder than LoadSAC.class..."。类加载器查看.class 文件的位置,并不关心.java 文件所在的位置,或者与.java 文件一起保存的任何文件。这就是为什么它被称为“类”加载器。
猜你喜欢
  • 1970-01-01
  • 2023-03-09
  • 2015-11-15
  • 1970-01-01
  • 2015-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多