从文件中获取InputStream,该文件可能(或不)在类路径中

时间:2012-09-13 15:13:41

标签: java file io

只是想知道哪个是读取类路径中文件的最佳方法。

我唯一拥有的是具有文件路径的属性。例如:

  • 文件路径=类路径:COM / myCompany的/ myfile.txt的
  • 文件路径=文件:/myfolder/myfile.txt

从该属性加载InputStream的最佳方法是什么?

4 个答案:

答案 0 :(得分:3)

您必须手动检测它。完成此操作后,以输入流的形式从类路径中获取资源:

class Example {
    void foo() {
        try (InputStream in = Example.class.getResourceAsStream("/config.cfg")) {
            // use here. It'll be null if not found.
        }
    }
}

NB:没有前斜杠,它是相对于包含Example.class文件的同一目录(如果需要的话,在jar中)。以斜杠开头时,它相对于类路径的根(jar的根,“ bin”目录的根等)。

自然地,没有办法获得输出流。通常,classpath中的大多数条目都是不可写的。

答案 1 :(得分:2)

您可以使用URL方法openStream,它返回一个可用于读取文件的InputStream。该URL适用于JAR内外的文件。请注意使用有效的网址。

答案 2 :(得分:1)

我只是使用String方法startsWith(String sequence)并检查它是否以 classpath filepath 开头,并从中调用approriate方法那里做的工作:

String str=//extracted property tag
if(str.startsWith("filepath")) {
 //simply intialize as URL and get inputstream from that
 URL url =new URL(str);
 URLConnection uc = url.openConnection(); 
 InputStream is=uc.getInputStream();
} else if(str.startsWith("classpath")) {
//strip the classpath  and then call method to extract from jar
}

请参阅here以从jar中提取资源。

答案 3 :(得分:0)

使用弹簧org.springframework.core.io.DefaultResourceLoader是一种解决方案:

@Resource DefaultResourceLoader defaultResourceLoader;
defaultResourceLoader.getResource(path).getInputStream()