如何真正从Java的classpath中读取文本文件

我正在尝试读取在CLASSPATH系统variables中设置的文本文件。 不是用户variables。

我正在试图获取inputstream如下所示:

将文件( 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"); 

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

但不幸的是,他们都没有工作,我总是在我的InputStream null

通过类path中的目录,从同一个类加载器加载的类中,您应该可以使用以下任一项:

 // 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 

然后(使用Unixpath分隔符,因为我在Linux上):

 java -classpath code:txt dummy.Test 

结果:

 true true 

当使用Spring框架(作为实用程序容器的集合 – 你不需要使用后者的function),你可以很容易地使用资源抽象。

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

通过资源接口,您可以访问资源作为InputStreamURLURI文件 。 将资源types更改为例如文件系统资源是更改实例的简单事情。

这是我如何阅读我的类path上的文本文件的所有行,使用Java 7的NIO:

 ... import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Paths; ... Files.readAllLines( Paths.get(this.getClass().getResource("res.txt").toURI()), Charset.defaultCharset()); 

注意这是一个如何完成的例子。 您必须根据需要进行改进。 这个例子只有在文件实际存在于类path中时才会起作用,否则当getResource()返回null并调用.toURI()时,将抛出NullPointerExceptionexception。

另外,从Java 7开始,指定字符集的一个方便的方法是使用java.nio.charset.StandardCharsets定义的常量(根据它们的javadoc ,“保证在每个Java平台的实现上都可用”)。 )。

因此,如果您知道文件的编码为UTF-8,则明确指定charset StandardCharsets.UTF_8

请尝试

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

您的尝试不起作用,因为只有类的类加载器能够从类path加载。 你使用了Java系统本身的类加载器。

要真正阅读文件的内容,我喜欢使用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); } 

要获得类绝对path,请尝试以下操作:

 String url = this.getClass().getResource("").getPath(); 

不知何故,最好的答案不适合我。 我需要使用稍微不同的代码。

 ClassLoader loader = Thread.currentThread().getContextClassLoader(); InputStream is = loader.getResourceAsStream("SomeTextFile.txt"); 

我希望这能帮助那些遇到同样问题的人。

要从classpath中将文件的内容读入string,可以使用以下命令:

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

注意:
IOUtilsCommons IO一部分。

像这样调用它:

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

你说“我正在尝试读取在CLASSPATH系统variables中设置的文本文件”。 我猜这是在Windows上,你正在使用这个丑陋的对话框来编辑“系统variables”。

现在在控制台中运行Java程序。 这不起作用:控制台启动时会获取一次系统variables值的副本。 这意味着之后对话框中的任何更改都不起作用。

有这些解决scheme:

  1. 每次更改后启动一个新的控制台

  2. 在控制台中使用set CLASSPATH=...在控制台中设置variables的副本,当代码工作时,将最后一个值粘贴到variables对话框中。

  3. 把调用Java到.BAT文件中,然后双击它。 这将每次创build一个新的控制台(从而复制系统variables的当前值)。

注意:如果你也有一个用户variablesCLASSPATH那么它会影响你的系统variables。 这就是为什么把你的Java程序的调用放到一个.BAT文件中,并在那里设置类path(使用set CLASSPATH= ),而不是依赖全局系统或用户variables。

这也确保您可以在您的计算机上运行多个Java程序,因为它们必须具有不同的类path。

如果你使用番石榴:

 import com.google.common.io.Resources; 

我们可以从CLASSPATH获取URL:

 URL resource = Resources.getResource("test.txt"); String file = resource.getFile(); // get file path 

或InputStream:

 InputStream is = Resources.getResource("test.txt").openStream(); 

无论何时将目录添加到类path中,其下定义的所有资源都将直接复制到应用程序的部署文件夹下(例如bin )。

为了从应用程序访问资源,可以使用指向部署文件夹的根path的“/”前缀,path的其他部分取决于资源的位置(不pipe它是直接在“D:\”下面)。 myDir“或嵌套在子文件夹下)

查看本教程以获取更多信息。

在您的示例中,您应该能够通过以下方式访问您的资源:

 InputStream is = getClass().getResourceAsStream("/SomeTextFile.txt"); 

知道“SomeTextFile.txt”直接存在于“D:\ myDir”

使用org.apache.commons.io.FileUtils.readFileToString(new File("src/test/resources/sample-data/fileName.txt"));

不要使用getClassLoader()方法,并在文件名前面使用“/”。 “/“ 非常重要

 this.getClass().getResourceAsStream("/SomeTextFile.txt"); 

我正在使用webshpere应用程序服务器,我的Web模块build立在Spring MVC上。 Test.properties位于资源文件夹,我试图加载这个文件使用以下内容:

  1. this.getClass().getClassLoader().getResourceAsStream("Test.properties");
  2. this.getClass().getResourceAsStream("/Test.properties");

上述代码没有加载该文件。

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

Thread.currentThread().getContextClassLoader().getResourceAsStream("Test.properties");

感谢用户“user1695166”

你必须把你的“系统variables”放在java类path上。

 import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; public class ReadFile { /** * * feel free to make any modification I have have been here so I feel you * * * @param args * @throws InterruptedException */ public static void main(String[] args) throws InterruptedException { // thread pool of 10 File dir = new File("."); // read file from same directory as source // if (dir.isDirectory()) { File[] files = dir.listFiles(); for (File file : files) { // if you wanna read file name with txt files if (file.getName().contains("txt")) { System.out.println(file.getName()); } // if you want to open text file and read each line then if (file.getName().contains("txt")) { try { // FileReader reads text files in the default encoding. FileReader fileReader = new FileReader( file.getAbsolutePath()); // Always wrap FileReader in BufferedReader. BufferedReader bufferedReader = new BufferedReader( fileReader); String line; // get file details and get info you need. while ((line = bufferedReader.readLine()) != null) { System.out.println(line); // here you can say... // System.out.println(line.substring(0, 10)); this // prints from 0 to 10 indext } } catch (FileNotFoundException ex) { System.out.println("Unable to open file '" + file.getName() + "'"); } catch (IOException ex) { System.out.println("Error reading file '" + file.getName() + "'"); // Or we could just do this: ex.printStackTrace(); } } } } } }