使用ClassLoader

时间:2018-09-01 23:06:03

标签: java classloader

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

我已成功使用以下命令将文件加载到inputStream中:

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

LoadSAC是类名...

但是,PMD抱怨这表明我使用了

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

我尝试了多种组合,但是无法找到文件...任何想法...我在大量搜索中提出了很多建议,但似乎都没有效果...

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

如果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");