Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中从jar读取文件?_Java_File Io_Jar - Fatal编程技术网

如何在Java中从jar读取文件?

如何在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

我想读取一个XML文件,该文件位于类路径中包含的
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)