从jar中读取资源文件
我想从我的jar中读取资源,如下所示:
File file; file = new File(getClass().getResource("/file.txt").toURI()); BufferredReader reader = new BufferedReader(new FileReader(file)); //Read the file
它在Eclipse中运行时工作正常,但如果我将其导出到jar运行它有一个IllegalArgumentException:
Exception in thread "Thread-2" java.lang.IllegalArgumentException: URI is not hierarchical
我真的不知道为什么,但如果我改变,我发现一些testing
file = new File(getClass().getResource("/file.txt").toURI());
至
file = new File(getClass().getResource("/folder/file.txt").toURI());
那么它的作用是相反的(它在jar中工作,但不是eclipse)。
我正在使用Eclipse和我的文件在文件夹是一个类文件夹。
而不是试图将资源作为文件来处理,只需要ClassLoader通过getResourceAsStream返回资源的InputStream即可 :
InputStream in = getClass().getResourceAsStream("/file.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(in));
只要file.txt
资源在类path中可用,那么无论file.txt
资源是位于classes/
目录中还是位于jar
这种方法都将以相同的方式工作。
URI is not hierarchical
,因为jar文件中的资源的URI看起来像这样: file:/example.jar!/file.txt
。 你不能阅读一个jar
文件(一个zip
文件),就像它是一个普通的旧文件 。
这可以通过以下答案来解释:
- 如何从Java jar文件读取资源文件?
- Java Jar文件:使用资源错误:URI不是分层的
如果你想作为一个文件阅读,我相信还有一个类似的解决scheme:
ClassLoader classLoader = getClass().getClassLoader(); File file = new File(classLoader.getResource("file/test.xml").getFile());
要访问jar文件,你有两个select:
-
将文件放在与你的包名相匹配的目录结构中(在解压缩.jar文件后,它应该和.class文件在同一个目录中),然后使用
getClass().getResourceAsStream("file.txt")
来访问它 -
将文件放在根目录(在解压缩.jar文件之后,它应该位于根目录下),然后使用
Thread.currentThread().getContextClassLoader().getResourceAsStream("file.txt")
来访问它
jar被用作插件时,第一个选项可能不起作用。
你也可以使用java.nio。 下面是一个示例,用于在classpath中resourcePath
中的文件中search文本:
new String(Files.readAllBytes(Paths.get(getClass().getResource(resourcePath).toURI())))
确保您使用正确的分隔符。 我用File.separator
replace了相对path中的所有/
。 这在IDE中正常工作,但在构buildJAR中无效。
我之前有过这个问题,我做了加载的备用方法。 基本上第一种方式在.jar文件中工作,第二种方式在eclipse或其他IDE中工作。
public class MyClass { public static InputStream accessFile() { String resource = "my-file-located-in-resources.txt"; // this is the path within the jar file InputStream input = MyClass.class.getResourceAsStream("/resources/" + resource); if (input == null) { // this is how we load file within editor (eg eclipse) input = MyClass.class.getClassLoader().getResourceAsStream(resource); } return input; } }
如果使用spring,那么可以使用以下方法从src / main / resources中读取文件:
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import org.springframework.core.io.ClassPathResource; public String readFile() { StringBuilder result = new StringBuilder(""); ClassPathResource resource = new ClassPathResource("filename.txt"); try (InputStream inputStream = resource.getInputStream()) { BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String line; while ((line = bufferedReader.readLine()) != null) { result.append(line); } inputStream.close(); } catch (IOException e) { e.printStackTrace(); } return result.toString(); }