从 jar 中访问资源
Access resource from inside jar
我得到了一个 jar 文件 test.jar,其中包含一个包含 txtFile.txt.
的文件夹资源
我正在尝试访问该文件,但该文件似乎为空。
package main;
import java.net.URL;
public class Test {
private Test() {
URL file = this.getClass().getClassLoader().getResource("/resources/txtFile.txt");
System.out.println(file == null);
}
public static final void main(String[] args) {
new Test();
}
}
如果您使用的是 Maven,src/main/resources
和 src/test/resources
是 txtFile.txt 两者中的任何一个,您不需要在路径中使用 resources/
。你可以用这个代替
this.getClass().getClassLoader().getResource("/txtFile.txt");
您可以使用以下方式请求 InputStream,而不是将流用作文件:
InputStream in = getClass().getResourceAsStream("/txtFile.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
您不必指定资源文件夹。您可以直接将文件名设为
getClass().getResourceAsStream("txtFile.txt");
尝试使用 getResource("resources/txtFile.txt");
(即没有第一个 /
)。
使用 ClassLoader
版本的 getResource
时,不应有前导斜线,它将始终被解释为绝对路径。
所以我这样做了
package main;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
public class Test {
private Test() {
Class<?> c = this.getClass();
ClassLoader cl = c.getClassLoader();
InputStream[] iss = new InputStream[8];
URL[] urls = new URL[8];
iss[0] = c.getResourceAsStream("/resources/txtFile.txt");
iss[1] = c.getResourceAsStream("resources/txtFile.txt");
iss[2] = c.getResourceAsStream("/txtFile.txt");
iss[3] = c.getResourceAsStream("txtFile.txt");
iss[4] = cl.getResourceAsStream("/resources/txtFile.txt");
iss[5] = cl.getResourceAsStream("resources/txtFile.txt");
iss[6] = cl.getResourceAsStream("/txtFile.txt");
iss[7] = cl.getResourceAsStream("txtFile.txt");
urls[0] = c.getResource("/resources/txtFile.txt");
urls[1] = c.getResource("resources/txtFile.txt");
urls[2] = c.getResource("/txtFile.txt");
urls[3] = c.getResource("txtFile.txt");
urls[4] = cl.getResource("/resources/txtFile.txt");
urls[5] = cl.getResource("resources/txtFile.txt");
urls[6] = cl.getResource("/txtFile.txt");
urls[7] = cl.getResource("txtFile.txt");
for (int i = 0; i < 8; i++)
System.out.println("iss[" + i + "] is "
+ String.valueOf(iss[i] == null));
for (int i = 0; i < 8; i++)
System.out.println("url[" + i + "] is "
+ String.valueOf(urls[i] == null));
int read;
try {
while ((read = iss[0].read()) != -1)
System.out.print((char) read);
} catch (IOException e) {
}
}
public static final void main(String[] args) {
new Test();
}
}
输出:
iss[0] is false
iss[1] is true
iss[2] is true
iss[3] is true
iss[4] is true
iss[5] is false
iss[6] is true
iss[7] is true
url[0] is false
url[1] is true
url[2] is true
url[3] is true
url[4] is true
url[5] is false
url[6] is true
url[7] is true
This is sample text.
结论:当我使用 getClass().getResource("/resources/txtFile.txt")
或 getClass().getClassLoader().getResource("resources/txtFile.txt")
时有效( getResourceAsStream()
也有效)。
我得到了一个 jar 文件 test.jar,其中包含一个包含 txtFile.txt.
的文件夹资源我正在尝试访问该文件,但该文件似乎为空。
package main;
import java.net.URL;
public class Test {
private Test() {
URL file = this.getClass().getClassLoader().getResource("/resources/txtFile.txt");
System.out.println(file == null);
}
public static final void main(String[] args) {
new Test();
}
}
如果您使用的是 Maven,src/main/resources
和 src/test/resources
是 txtFile.txt 两者中的任何一个,您不需要在路径中使用 resources/
。你可以用这个代替
this.getClass().getClassLoader().getResource("/txtFile.txt");
您可以使用以下方式请求 InputStream,而不是将流用作文件:
InputStream in = getClass().getResourceAsStream("/txtFile.txt");
BufferedReader reader = new BufferedReader(new InputStreamReader(in));
您不必指定资源文件夹。您可以直接将文件名设为
getClass().getResourceAsStream("txtFile.txt");
尝试使用 getResource("resources/txtFile.txt");
(即没有第一个 /
)。
使用 ClassLoader
版本的 getResource
时,不应有前导斜线,它将始终被解释为绝对路径。
所以我这样做了
package main;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
public class Test {
private Test() {
Class<?> c = this.getClass();
ClassLoader cl = c.getClassLoader();
InputStream[] iss = new InputStream[8];
URL[] urls = new URL[8];
iss[0] = c.getResourceAsStream("/resources/txtFile.txt");
iss[1] = c.getResourceAsStream("resources/txtFile.txt");
iss[2] = c.getResourceAsStream("/txtFile.txt");
iss[3] = c.getResourceAsStream("txtFile.txt");
iss[4] = cl.getResourceAsStream("/resources/txtFile.txt");
iss[5] = cl.getResourceAsStream("resources/txtFile.txt");
iss[6] = cl.getResourceAsStream("/txtFile.txt");
iss[7] = cl.getResourceAsStream("txtFile.txt");
urls[0] = c.getResource("/resources/txtFile.txt");
urls[1] = c.getResource("resources/txtFile.txt");
urls[2] = c.getResource("/txtFile.txt");
urls[3] = c.getResource("txtFile.txt");
urls[4] = cl.getResource("/resources/txtFile.txt");
urls[5] = cl.getResource("resources/txtFile.txt");
urls[6] = cl.getResource("/txtFile.txt");
urls[7] = cl.getResource("txtFile.txt");
for (int i = 0; i < 8; i++)
System.out.println("iss[" + i + "] is "
+ String.valueOf(iss[i] == null));
for (int i = 0; i < 8; i++)
System.out.println("url[" + i + "] is "
+ String.valueOf(urls[i] == null));
int read;
try {
while ((read = iss[0].read()) != -1)
System.out.print((char) read);
} catch (IOException e) {
}
}
public static final void main(String[] args) {
new Test();
}
}
输出:
iss[0] is false
iss[1] is true
iss[2] is true
iss[3] is true
iss[4] is true
iss[5] is false
iss[6] is true
iss[7] is true
url[0] is false
url[1] is true
url[2] is true
url[3] is true
url[4] is true
url[5] is false
url[6] is true
url[7] is true
This is sample text.
结论:当我使用 getClass().getResource("/resources/txtFile.txt")
或 getClass().getClassLoader().getResource("resources/txtFile.txt")
时有效( getResourceAsStream()
也有效)。