我试图读取在CLASSPATH系统变量中设置的文本文件。不是用户变量。

我试图获得输入流文件如下:

将文件目录(D:\myDir)放在CLASSPATH中,然后尝试如下操作:

InputStream in = this.getClass().getClassLoader().getResourceAsStream("SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("/SomeTextFile.txt");
InputStream in = this.getClass().getClassLoader().getResourceAsStream("//SomeTextFile.txt");

将文件(D:\myDir\SomeTextFile.txt)的完整路径放在CLASSPATH中,并尝试上面的3行代码。

但不幸的是,他们都没有工作,我总是得到null到我的输入流。


当前回答

要将文件的内容从类路径读入String,你可以使用这个:

private String resourceToString(String filePath) throws IOException, URISyntaxException
{
    try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath))
    {
        return IOUtils.toString(inputStream);
    }
}

注意: IOUtils是Commons IO的一部分。

这样叫它:

String fileContents = resourceToString("ImOnTheClasspath.txt");

其他回答

要真正读取文件的内容,我喜欢使用Commons IO + Spring Core。假设Java 8:

try (InputStream stream = new ClassPathResource("package/resource").getInputStream()) {
    IOUtils.toString(stream);
}

另外:

InputStream stream = null;
try {
    stream = new ClassPathResource("/log4j.xml").getInputStream();
    IOUtils.toString(stream);
} finally {
    IOUtils.closeQuietly(stream);
}

要将文件的内容从类路径读入String,你可以使用这个:

private String resourceToString(String filePath) throws IOException, URISyntaxException
{
    try (InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(filePath))
    {
        return IOUtils.toString(inputStream);
    }
}

注意: IOUtils是Commons IO的一部分。

这样叫它:

String fileContents = resourceToString("ImOnTheClasspath.txt");

当使用Spring框架时(作为实用工具或容器的集合—您不需要使用后一种功能),您可以轻松地使用Resource抽象。

Resource resource = new ClassPathResource("com/example/Foo.class");

通过Resource接口,您可以以InputStream、URL、URI或File的形式访问资源。将资源类型更改为文件系统资源,只需更改实例即可。

我使用webshpere应用服务器和我的Web模块是建立在Spring MVC。测试。属性位于资源文件夹中,我尝试使用以下方法加载此文件:

.getResourceAsStream .getClassLoader this.getClass()()(“Test.properties”); this.getClass () .getResourceAsStream (" / Test.properties ");

上面的代码都没有加载文件。

但是在下面代码的帮助下,属性文件被成功加载:

.getResourceAsStream .getContextClassLoader Thread.currentThread()()(“Test.properties”);

感谢用户“user1695166”。

通过类路径上的目录,从同一个类加载器加载的类中,你应该能够使用以下任何一种:

// From ClassLoader, all paths are "absolute" already - there's no context
// from which they could be relative. Therefore you don't need a leading slash.
InputStream in = this.getClass().getClassLoader()
                                .getResourceAsStream("SomeTextFile.txt");
// From Class, the path is relative to the package of the class unless
// you include a leading slash, so if you don't want to use the current
// package, include a slash like this:
InputStream in = this.getClass().getResourceAsStream("/SomeTextFile.txt");

如果这些都不起作用,那就说明有其他问题。

举个例子,这段代码:

package dummy;

import java.io.*;

public class Test
{
    public static void main(String[] args)
    {
        InputStream stream = Test.class.getResourceAsStream("/SomeTextFile.txt");
        System.out.println(stream != null);
        stream = Test.class.getClassLoader().getResourceAsStream("SomeTextFile.txt");
        System.out.println(stream != null);
    }
}

这个目录结构是:

code
    dummy
          Test.class
txt
    SomeTextFile.txt

然后(使用Unix路径分隔符,因为我在Linux机器上):

java -classpath code:txt dummy.Test

结果:

true
true