我正在尝试读取在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
输入我的InputStream in
.
16 回答
不知何故,最好的答案对我不起作用 . 我需要使用稍微不同的代码 .
我希望这能帮助那些遇到同样问题的人 .
不要使用getClassLoader()方法并在文件名前使用“/” . “/“ 非常重要
我正在使用webshpere应用程序服务器,我的Web模块是基于Spring MVC构建的 .
Test.properties
位于资源文件夹中,我尝试使用以下方法加载此文件:this.getClass().getClassLoader().getResourceAsStream("Test.properties");
this.getClass().getResourceAsStream("/Test.properties");
以上代码都没有加载文件 .
但是在下面的代码的帮助下,属性文件已成功加载:
Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");
感谢用户"user1695166" .
这就是我使用Java 7 NIO读取类路径上文本文件的所有行的方法:
注意,这是一个如何完成它的例子 . 你必须根据需要进行改进 . 此示例仅在文件实际存在于类路径中时才有效,否则当getResource()返回null并且在其上调用.toURI()时,将抛出NullPointerException .
此外,从Java 7开始,指定字符集的一种便捷方法是使用
java.nio.charset.StandardCharsets
中定义的常量(根据它们的javadocs,"guaranteed to be available on every implementation of the Java platform.") .因此,如果您知道文件的编码为UTF-8,则明确指定charset
StandardCharsets.UTF_8
要实际读取文件的内容,我喜欢使用Commons IO Spring Core . 假设Java 8:
或者:
你必须把你的'系统变量'放在java类路径上 .
使用Spring Framework(作为实用程序 or 容器的集合 - 您不需要使用后者功能)时,您可以轻松使用资源抽象 .
通过Resource接口,您可以将资源作为InputStream,URL,URI或File访问 . 将资源类型更改为例如文件系统资源是更改实例的简单问题 .
使用类路径上的目录,从同一个类加载器加载的类中,您应该能够使用以下任一项:
如果那些不起作用,那表明其他问题是错误的 .
例如,请使用以下代码:
而这个目录结构:
然后(使用Unix路径分隔符,因为我在Linux机器上):
结果:
要从
classpath
将文件内容读入字符串,您可以使用:注意:
IOUtils是Commons IO的一部分 .
这样叫:
如果你使用 Guava :
我们可以从CLASSPATH获取URL:
或InputStream:
Scenario:
1) client-service-1.0-SNAPSHOT.jar 有依赖 read-classpath-resource-1.0-SNAPSHOT.jar
2)我们想要读取 read-classpath-resource-1.0-SNAPSHOT.jar 到 client-service-1.0-SNAPSHOT.jar 的类路径资源( sample.txt )的内容 .
3) read-classpath-resource-1.0-SNAPSHOT.jar 有 src/main/resources/sample.txt
pom.xml
ofread-classpath-resource-1.0-SNAPSHOT.jar
ClassPathResourceReadTest.java
read-classpath-resource-1.0-SNAPSHOT.jar
中的类加载类路径资源文件内容 .pom.xml
ofclient-service-1.0-SNAPSHOT.jar
AccessClassPathResource.java
instantiateClassPathResourceReadTest.java
class其中,它将加载sample.txt
并打印其内容 .5.Run可执行jar如下:
您说“我正在尝试读取在CLASSPATH系统变量中设置的文本文件 . ”我猜这是在Windows上你正在使用这个丑陋的对话框来编辑“系统变量” .
现在,您在控制台中运行Java程序 . 这不起作用:控制台在启动时获取系统变量值的副本 . 这意味着之后对话框中的任何更改都不会产生任何影响 .
有这些解决方案:
每次更改后启动新控制台
在控制台中使用
set CLASSPATH=...
在控制台中设置变量的副本,当代码工作时,将最后一个值粘贴到变量对话框中 .将对Java的调用放入
.BAT
文件并双击它 . 这将每次创建一个新控制台(从而复制系统变量的当前值) .请注意:如果您还有一个用户变量
CLASSPATH
,那么它将影响您的系统变量 . 这就是为什么通常最好将对Java程序的调用放入.BAT
文件并在其中设置类路径(使用set CLASSPATH=
),而不是依赖于全局系统或用户变量 .这也确保你可以有多个Java程序在您的计算机上运行,因为它们必然具有不同的类路径 .
使用
org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));
要获得类绝对路径,请尝试以下操作:
请试试
您的尝试不起作用,因为只有类的类加载器能够从类路径加载 . 您为java系统本身使用了类加载器 .