无法从spring boot jar读取文本文件

时间:2017-05-09 08:32:41

标签: spring-boot

我正在尝试读取Spring启动控制台应用程序的resources文件夹中的文件,但是我发现找不到文件异常。

这是我的pom

<resource>
    <directory>src/main/resources</directory>
    <includes>
      <include>**/*.*</include>
    </includes>
  </resource>

以下是例外:

java.io.FileNotFoundException: class path resource [9.txt] cannot be resolved to absolute file path because it does not reside in the file system: jar:file:/Users/abc/Documents/workspace-sts-3.8.4.RELEASE/xyz/target/xyz-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/9.txt

我打开了xyz-0.0.1-SNAPSHOT.jar文件,9.txt在BOOT-INF / classes文件夹中。

谢谢, -dj

4 个答案:

答案 0 :(得分:4)

它是Spring Boot,让我们使用ClassPathResource

@Component
public class MyBean {
    @Value("9.txt")
    private ClassPathResource resource;

    @PostConstruct
    public void init() throws IOException {
        Files.lines(resource.getFile().toPath(), StandardCharsets.UTF_8)
            .forEach(System.out::println);
    }
}

更新:由于ClassPathResource支持解析为java.io.File,如果类路径资源位于文件系统中,但不支持JAR中的资源,则更好用这种方式

@Component
public class MyBean {
    @Value("9.txt")
    private ClassPathResource resource;

    @PostConstruct
    public void init() throws IOException {
        try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8))) {
            bufferedReader.lines()
                .forEach(System.out::println);
        }        
    }
}

答案 1 :(得分:0)

这对我有用!

InputStream in = this.getClass().getResourceAsStream("/" + len + ".txt");

因为这不起作用

ClassPathResource resource = new ClassPathResource(len + ".txt"); 
File file = resource.getFile();

答案 2 :(得分:0)

在Spring Boot中,您可以使用ResourceLoader从Resource文件夹中读取文件。这是从资源文件夹读取文件的有效方法。 第一个Autowire ResourceLoader

@Autowired
private ResourceLoader resourceLoader;

然后

Resource resource = resourceLoader.getResource(CLASSPATH_URL_PREFIX + "9.txt");
InputStream inputStream = resource.getInputStream();

答案 3 :(得分:0)

从 jar 文件中加载文件时,使用 resource.getInputStream() 而不是 resource.getFile()