Spring Boot - 使用ResourceLoader读取文本文件

时间:2017-01-20 01:38:37

标签: java spring spring-boot

我正在尝试使用Spring资源加载器读取文本文件,如下所示:

Resource resource  = resourceLoader.getResource("classpath:\\static\\Sample.txt");

该文件位于我的Spring启动项目中: enter image description here

在eclipse中运行应用程序时工作正常,但是当我打包应用程序然后使用java -jar运行它时,我得到文件未找到异常:

java.io.FileNotFoundException: class path resource [static/Sample.txt] cannot be resolved to absolute file path because it does not reside in the
 file system: jar:file:/C:/workspace-test/XXX/target/XXX-0.0.1-SNAPSHOT.jar!/BOOT-INF/classes!/static/Sample.txt

我解压缩了Sample所在的Jar文件: XXX-0.0.1-SNAPSHOT \ BOOT-INF \ classes \ static \ Sample.txt

有人能帮助我吗?

提前致谢!

6 个答案:

答案 0 :(得分:27)

我已经检查了你的代码。如果你想在Spring Boot JAR中从classpath加载一个文件,那么你必须使用 resource.getInputStream()而不是资源。 getFile()。如果您尝试使用resource.getFile(),您将收到错误,因为Spring尝试访问文件系统路径,但它无法访问JAR中的路径。

详情如下:

https://smarterco.de/java-load-file-classpath-spring-boot/

答案 1 :(得分:6)

请尝试resourceLoader.getResource("classpath:static/Sample.txt");

使用java -jar XXXX.jar

运行时使用此代码

enter image description here

------更新------

完成代码后,问题是您尝试通过FileInputStream读取文件,但实际上它在jar文件中。

但实际上你得到org.springframework.core.io.Resource所以意味着你得到了InputStream,所以你可以像new BufferedReader(new InputStreamReader(resource.getInputStream())).readLine();

那样做

答案 2 :(得分:1)

我遇到了同样的问题,正如@Gipple Lake解释的那样,使用Spring启动时,您需要将文件作为inputStream加载。下面我将添加我的代码作为示例,我想读取import.xml文件

public void init() {
    Resource resource = new ClassPathResource("imports/imports.xml");
    try {
        InputStream dbAsStream = resource.getInputStream();
        try {
            document = readXml(dbAsStream);
            } catch (SAXException e) {
                trace.error(e.getMessage(), e);
                e.printStackTrace();
            } catch (ParserConfigurationException e) {
                trace.error(e.getMessage(), e);
                e.printStackTrace();
            }
    } catch (IOException e) {
        trace.error(e.getMessage(), e);
        e.printStackTrace();
    }
    initListeImports();
    initNewImports();
}

public static Document readXml(InputStream is) throws SAXException, IOException,
      ParserConfigurationException {
      DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();

      dbf.setValidating(false);
      dbf.setIgnoringComments(false);
      dbf.setIgnoringElementContentWhitespace(true);
      dbf.setNamespaceAware(true);
      DocumentBuilder db = null;
      db = dbf.newDocumentBuilder();

      return db.parse(is);
  }

我添加了#34; imports.xml"吼叫src/main/ressources/imports

答案 3 :(得分:0)

将文件放在 resources/static 下,它将位于类路径中,并读取以下路径

import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

Resource resource = new ClassPathResource("/static/pathtosomefile.txt");
resource.getURL().getPath()

答案 4 :(得分:0)

如果您想读取文件夹中的所有文件

这是示例代码。

docker build --build-args FULLNAME=$(wget -nv https://upload.wikimedia.org/wikipedia/commons/5/54/Golden_Gate_Bridge_0002.jpg 2>&1 |cut -d\" -f2) -t my_image .

答案 5 :(得分:0)

如果资源存在于 resources/static/listings.csv

String path = "classpath:static/listings.csv";

ResultSet rs = new Csv().read(path, null, null);