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

Java 从文件中获取InputStream,该文件可能(或不)在类路径中,java,file,io,Java,File,Io,只是想知道读取类路径中的文件的最佳方式 我只有一个文件路径的属性。例如: filepath=classpath:com/mycompany/myfile.txt filepath=file:/myfolder/myfile.txt 从该属性加载InputStream的最佳方法是什么?好吧,我只需使用String方法startsWith(String sequence)并检查它是否以classpath或filepath开头,然后从那里调用适当的方法来完成这项工作: String str=//e

只是想知道读取类路径中的文件的最佳方式

我只有一个文件路径的属性。例如:

  • filepath=classpath:com/mycompany/myfile.txt
  • filepath=file:/myfolder/myfile.txt

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

好吧,我只需使用
String
方法
startsWith(String sequence)
并检查它是否以classpath或filepath开头,然后从那里调用适当的方法来完成这项工作:

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
}

有关从jar中提取资源的信息,请参阅。

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

您必须手动检测它。完成此操作后,要以inputstream的形式从类路径获取资源,请执行以下操作:

class Example {
    void foo() {
        try (InputStream in = Example.class.getResourceAsStream("/config.cfg")) {
            // use here. It'll be null if not found.
        }
    }
}
注意:如果没有前导斜杠,它是相对于包含
Example.class
文件的同一目录(如果需要,在jar中)的。使用斜杠,它相对于类路径的根(jar的根、bin目录的根等)


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

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

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

你需要具体点吗?我会搜索类路径,如果它不在那里,从文件系统读取。springs似乎对此有一个解析器,可以使用它吗?很好的更正,@JoopEggen-我编辑了这个片段,如果下次出现这样的内容,我可以随意编辑我的答案:)URL给我的原因是:java.net.MalformedURLException:unknown protocol:classpathyeah,默认情况下java不支持“classpath”URL类型。一些应用服务器添加了对此的支持。