如何在Java中从jar读取文件?
我想读取一个XML文件,该文件位于类路径中包含的如何在Java中从jar读取文件?,java,file-io,jar,Java,File Io,Jar,我想读取一个XML文件,该文件位于类路径中包含的jars中。如何读取包含在jar中的任何文件?如果要从应用程序内部读取该文件,请使用: InputStream input = getClass().getResourceAsStream("/classpath/to/my/file"); 路径以“/”开头,但这不是文件系统中的路径,而是类路径中的路径。因此,如果您的文件位于类路径“org.xml”并被称为myxml.xml,那么您的路径看起来像“/org/xml/myxml.xml” Inpu
jar
s中。如何读取包含在jar
中的任何文件?如果要从应用程序内部读取该文件,请使用:
InputStream input = getClass().getResourceAsStream("/classpath/to/my/file");
路径以“/”开头,但这不是文件系统中的路径,而是类路径中的路径。因此,如果您的文件位于类路径“org.xml”并被称为myxml.xml,那么您的路径看起来像“/org/xml/myxml.xml”
InputStream读取文件的内容。如果你愿意,你可以把它包装成阅读器
我希望这会有所帮助。如果您想从应用程序内部读取该文件,请使用:
InputStream input = getClass().getResourceAsStream("/classpath/to/my/file");
路径以“/”开头,但这不是文件系统中的路径,而是类路径中的路径。因此,如果您的文件位于类路径“org.xml”并被称为myxml.xml,那么您的路径看起来像“/org/xml/myxml.xml”
InputStream读取文件的内容。如果你愿意,你可以把它包装成阅读器
我希望这有帮助。啊,这是我最喜欢的科目之一。基本上有两种方法可以通过类路径加载资源:
Class.getResourceAsStream(资源)
及
ClassLoader.getResourceAsStream(资源)
(还有其他方法,包括以类似的方式获取资源的URL,然后打开与它的连接,但这是两种直接的方法)
在弄乱资源名称后,第一个方法实际上委托给第二个方法。基本上有两种资源名称:绝对(例如“/path/to/resource/resource”)和相对(例如“resource”)。绝对路径以“/”开头
这里有一个例子可以说明。考虑一个类COM。考虑两个资源,一个位于/COM/示例/嵌套,另一个位于/Stof,在类路径中。以下程序显示了访问这两个资源的九种可能方式:
package com.example;
public class A {
public static void main(String args[]) {
// Class.getResourceAsStream
Object resource = A.class.getResourceAsStream("nested");
System.out.println("1: A.class nested=" + resource);
resource = A.class.getResourceAsStream("/com/example/nested");
System.out.println("2: A.class /com/example/nested=" + resource);
resource = A.class.getResourceAsStream("top");
System.out.println("3: A.class top=" + resource);
resource = A.class.getResourceAsStream("/top");
System.out.println("4: A.class /top=" + resource);
// ClassLoader.getResourceAsStream
ClassLoader cl = A.class.getClassLoader();
resource = cl.getResourceAsStream("nested");
System.out.println("5: cl nested=" + resource);
resource = cl.getResourceAsStream("/com/example/nested");
System.out.println("6: cl /com/example/nested=" + resource);
resource = cl.getResourceAsStream("com/example/nested");
System.out.println("7: cl com/example/nested=" + resource);
resource = cl.getResourceAsStream("top");
System.out.println("8: cl top=" + resource);
resource = cl.getResourceAsStream("/top");
System.out.println("9: cl /top=" + resource);
}
}
包com.example;
公共A类{
公共静态void main(字符串参数[]){
//Class.getResourceAsStream
对象资源=A.class.getResourceAsStream(“嵌套”);
System.out.println(“1:A.class嵌套=“+resource”);
resource=A.class.getResourceAsStream(“/com/example/nested”);
System.out.println(“2:A.class/com/example/nested=“+resource”);
resource=A.class.getResourceAsStream(“top”);
System.out.println(“3:A.class top=“+resource”);
resource=A.class.getResourceAsStream(“/top”);
System.out.println(“4:A.class/top=“+resource”);
//ClassLoader.getResourceAsStream
ClassLoader cl=A.class.getClassLoader();
resource=cl.getResourceAsStream(“嵌套”);
System.out.println(“5:cl嵌套=”+资源);
resource=cl.getResourceAsStream(“/com/example/nested”);
System.out.println(“6:cl/com/example/nested=“+resource”);
resource=cl.getResourceAsStream(“com/example/nested”);
System.out.println(“7:cl-com/example/nested=“+resource”);
资源=cl.getResourceAsStream(“顶部”);
System.out.println(“8:cl top=“+resource”);
resource=cl.getResourceAsStream(“/top”);
System.out.println(“9:cl/top=“+资源”);
}
}
程序的输出为:
1: A.class nested=java.io.BufferedInputStream@19821f
2: A.class /com/example/nested=java.io.BufferedInputStream@addbf1
3: A.class top=null
4: A.class /top=java.io.BufferedInputStream@42e816
5: cl nested=null
6: cl /com/example/nested=null
7: cl com/example/nested=java.io.BufferedInputStream@9304b1
8: cl top=java.io.BufferedInputStream@190d11
9: cl /top=null
1:A.class嵌套=java.io。BufferedInputStream@19821f
2:A.class/com/example/nested=java.io。BufferedInputStream@addbf1
3:A.class top=null
4:A.class/top=java.io。BufferedInputStream@42e816
5:cl=null
6:cl/com/example/nested=null
7:cl-com/example/nested=java.io。BufferedInputStream@9304b1
8:cl top=java.io。BufferedInputStream@190d11
9:cl/top=null
大多数事情都会按照你的期望去做。案例3失败,因为类相对解析是关于类的,所以“top”表示“/com/example/top”,但“/top”表示它所说的内容
案例5失败,因为类加载器相对解析是关于类加载器的。但是,出乎意料的是,案例6也失败了:人们可能期望“/com/example/nested”能够正确解析。要通过类加载器访问嵌套资源,需要使用Case-7,即嵌套路径相对于类加载器的根。同样,案例9失败,但案例8通过
记住:对于java.lang.Class,getResourceAsStream()会委托给类加载器:
public InputStream getResourceAsStream(String name) {
name = resolveName(name);
ClassLoader cl = getClassLoader0();
if (cl==null) {
// A system class.
return ClassLoader.getSystemResourceAsStream(name);
}
return cl.getResourceAsStream(name);
}
公共InputStream getResourceAsStream(字符串名称){
名称=解析名称(名称);
ClassLoader cl=getClassLoader0();
如果(cl==null){
//系统类。
返回ClassLoader.getSystemResourceAsStream(名称);
}
返回cl.getResourceAsStream(名称);
}
因此,重要的是resolveName()的行为
最后,由于类装入器的行为本质上控制了getResourceAsStream(),并且类装入器通常是一个自定义装入器,因此资源装入规则可能更为复杂。e、 g.对于Web应用程序,从Web应用程序上下文中的Web-INF/classes或Web-INF/lib加载,但不要从其他孤立的Web应用程序加载。此外,行为良好的类加载器将委托给父类,因此使用此机制可能无法访问类路径中的重复资源。啊,这是我最喜欢的主题之一。基本上有两种方法可以通过类路径加载资源:
Class.getResourceAsStream(资源)
及
ClassLoader.getResourceAsStream(资源)
(还有其他方法,包括以类似的方式获取资源的URL,然后打开与它的连接,但这是两种直接的方法)
在弄乱资源名称后,第一个方法实际上委托给第二个方法。基本上有两种资源名称:绝对(例如“/path/to/resource/resource”)和相对(例如“resource”)。绝对路径以“/”开头
这里有一个例子可以说明。考虑一个类COM。
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.4</version>
</dependency>
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
if (classLoader == null) {
classLoader = Class.class.getClassLoader();
}
classLoader.getResourceAsStream("xmlFileNameInJarFile.xml");
// xml file location at xxx.jar
// + folder
// + folder
// xmlFileNameInJarFile.xml
PythonInterpreter.execfile(InputStream)