【问题标题】:Load CSV in java using classpath使用类路径在 java 中加载 CSV
【发布时间】:2018-11-16 20:36:31
【问题描述】:

如何使用类路径加载 csv 文件? 在此之前,我尝试使用 FileReader 加载文件,该文件在本地运行时工作正常,但在部署到外部服务器时会引发 FileNotFound 等异常。下面的代码在本地工作,但是当在 tomcat 文件夹 www/[jar] 上部署 jar 时会抛出此异常 不幸的是,我无法提供原始代码。这是要点:

BufferedReader br = new BufferedReader(new FileReader("src/SSR.csv"));
    while ((line = br.readLine()) != null) {
        // use comma as separator
        String[] cols = line.split(",");
        map.put(cols[1],cols[0]); 

【问题讨论】:

  • 你需要发布你的代码让我们看看发生了什么,以及完整的异常堆栈跟踪,你是否使用了 getClass().getResource().. 你的类路径中有文件吗?
  • 您可以查看此主题。您可能会找到解决问题的方法。 stackoverflow.com/questions/1464291/…

标签: java spring csv


【解决方案1】:

这里有两件事你应该考虑

  1. 正如我们的同事已经说过的,当代码在 jar 中运行并且您想要加载类路径资源时,您不能使用您所说的 FileReader 方法。

您当前的代码假定 CSV 位于工件之外的 FileSystem 中的某个位置,这可能不是真的,所以它只是找不到该文件。

这里的正确方法是使用getClass().getResourceAsStream() / getClass().getClassLoader().getResourceAsStream()

  1. CSV 文件可能很复杂,尽管它们的结构看起来很简单。因此,如果您从事的是现实生活中的项目,而不是出于学习目的而从事某种家庭作业,我强烈建议您使用 3rdparty 库来处理 CSV:

...仅举几例

【讨论】:

  • 我可以使用 ClassPathResource 从单元测试用例中读取 src/test/resources 下的 csv 文件,但我无法从 src/main/java 代码中读取 src/main/resources 下的相同文件
【解决方案2】:

既然您用 spring 标记了这个问题,我想向您指出 Spring 框架提供的资源实现。文档可以在以下位置找到:

Spring Support for Resources

对于您的 csv 文件,类似于

Resource csv = context.getResource("classpath:some/resource/path/my.csv");
InputStream inputstream = csv.getInputStream();

应该是一个起点。资源接口提供了一个

File getFile() throws IOException;

方法,但这仅在文件驻留在文件系统中时才有效。因此,对于您的情况,您应该使用我认为的输入流方法。

编辑: 在这里,您可以使用 ClassPathResource 找到另一个答案 https://stackoverflow.com/a/44412189/7634201

【讨论】:

  • 我可以使用 ClassPathResource 从单元测试用例中读取 src/test/resources 下的 csv 文件,但我无法从 src/main/java 代码中读取 src/main/resources 下的相同文件
  • @Sid 你如何运行你的代码?也许这就是您问题的答案stackoverflow.com/a/10171213/7634201
  • 我使用 gradle 构建和运行 jar
  • 您能否在 ClasspathResource 中发布用于引用您的文件的路径?
猜你喜欢
  • 1970-01-01
  • 2021-04-21
  • 1970-01-01
  • 2011-03-27
  • 2020-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多