从jar包中读取资源文件

348

我想从我的jar文件中读取资源,方法如下:

File file;
file = new File(getClass().getResource("/file.txt").toURI());
BufferedReader reader = new BufferedReader(new FileReader(file));

//Read the file

在Eclipse中运行代码时工作正常,但是如果将其导出为jar文件然后运行,会出现IllegalArgumentException异常:

Exception in thread "Thread-2"
java.lang.IllegalArgumentException: URI is not hierarchical

而且我真的不知道为什么,但是通过一些测试我发现如果我改变

file = new File(getClass().getResource("/file.txt").toURI());

file = new File(getClass().getResource("/folder/file.txt").toURI());

然后情况就反过来了(在 jar 中可以运行,但在 Eclipse 中不行)。

我正在使用 Eclipse,并且包含我的文件的文件夹位于一个类文件夹中。


如果您想从包含任意数量文件的jar目录中读取文件,请参见Stackoverflow-Link - Michael Hegner
1
我不确定原始问题是否涉及Spring。上一个评论中的链接是来自另一个问题的Spring特定答案。我认为getResourceAsStream仍然是解决问题更简单、更可移植的方法。 - Drew MacInnis
15个回答

-1

你可以使用类加载器,它将从类路径作为根路径进行读取(不需要在开头添加“/”)

InputStream in = getClass().getClassLoader().getResourceAsStream("file.txt"); 
BufferedReader reader = new BufferedReader(new InputStreamReader(in));

-1
由于某些原因,当我将Web应用程序部署到WildFly 14时,classLoader.getResource()总是返回null。从getClass().getClassLoader()Thread.currentThread().getContextClassLoader()获取classLoader也会返回null。 getClass().getClassLoader() API文档说:
“返回类的类加载器。一些实现可能使用null来表示引导类加载器。如果此类是由引导类加载器加载的,则在这样的实现中,此方法将返回null。”
如果您正在使用WildFly并且您的Web应用程序,请尝试使用request.getServletContext().getResource()。它将返回资源URL。这里的request是ServletRequest对象。

-2
以下代码适用于Spring Boot(Kotlin):
val authReader = InputStreamReader(javaClass.getResourceAsStream("/file1.json"))

-2
如果您正在使用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 readFileToString(String path) throws IOException {

    StringBuilder resultBuilder = new StringBuilder("");
    ClassPathResource resource = new ClassPathResource(path);

    try (
        InputStream inputStream = resource.getInputStream();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) {

      String line;

      while ((line = bufferedReader.readLine()) != null) {
        resultBuilder.append(line);
      }

    }

    return resultBuilder.toString();
  }

1
欢迎来到SO。这并没有回答问题。一旦您拥有足够的声望,您将能够在任何帖子上评论。还要检查这个我可以做什么代替 - thewaywewere
这将会移除文件中的换行符! - elad.chen

-3
如果你想将其作为文件读取,我相信仍然有类似的解决方案:
    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource("file/test.xml").getFile());

5
URL.getFile()并不会将URL转换为文件名。它返回主机之后的URL部分,并保留所有百分号编码,因此如果路径包含任何非ASCII字符或任何不允许在URL中的ASCII字符(包括空格),则结果将不是现有的文件名,即使URL是“file:” URL。 - VGR
52
一旦程序被打包成jar文件,其中的内容无法在内部运行。 - Akshay Kasar
1
除非你将其转换为字符串并先本地保存,否则无法从jar文件中运行。 - smoosh911

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接