当前位置: 首页 > 知识库问答 >
问题:

使用类路径在java中加载CSV

吴开宇
2023-03-14

如何使用类路径加载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]); 

共有2个答案

巫马浩言
2023-03-14

这里有两件事你应该考虑

  1. 正如我们的同事已经指出的,当代码在jar中运行时,如果您想加载一个类路径资源,您就不能使用前面提到的FileReader方法

您当前的代码假设CSV在工件之外的文件系统中的某个地方,这可能是不正确的,所以它找不到文件。

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

CSV文件可能很复杂,尽管其结构看起来非常简单。因此,如果您从事的是现实生活中的项目,而不是为了学习而做的作业,我强烈建议您使用第三方库来处理CSV:

  • 打开CSV
  • 超级CSV
  • Commons CSV

...仅举几个例子

魏学智
2023-03-14

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

资源的Spring支持

对于您的csv文件,可以使用

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

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

File getFile() throws IOException;

方法,但这只在文件驻留在文件系统中时才起作用。因此,对于您的情况,我认为您应该使用inputstream方法

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

 类似资料:
  • 我有以下分布 主要的jar包含main方法,我想在其中访问lib提供的本机函数。所以被捆绑在发行版中。开始sh只需设置java的类路径和引导。 加载库的最佳方法是什么。那么应用程序内部的库呢?我知道两种方法: 系统。加载(绝对路径) 系统。loadLibrary(名称) 前者需要库在文件系统中的绝对路径,后者需要设置特定于应用程序的java。图书馆路径JVM参数。在这种情况下,哪种解决方案更好?将

  • 问题内容: 假设我已经使用Groovyc编译了Groovy脚本,该脚本已在文件系统中生成了一个或多个.class文件。如何从Java应用程序动态地将这些类添加到类路径中,以加载它们并调用它们的方法?目标是预编译Groovy脚本并将其存储到数据库中,以便可以从脚本的编译版本执行评估。 问题答案: 您可以创建URLClassLoader的实例以从目录加载新类: 第1 行将.class 创建到.clas

  • 问题内容: 我是Java的新手,我不确定如何从单独的程序jar中访问位于特定目录中的类文件。 例如,我在/中有一个第三方jar文件,该文件应该加载/mylib/MyClass.class中的MyClass,因此我尝试运行: 但我得到了错误: 我究竟做错了什么? 问题答案: 当您使用,然后 只 在中定义的属性文件里面的文件会影响到类路径。 它还将忽略该参数(或更具体地说:将其解释为)中定义的主类的参

  • 问题内容: 我正在运行应该执行方法的Shell脚本: 在这一点上,我得到这个异常: 这是因为弹簧罐位于另一个文件夹中。所以我更改了脚本: 但是,使用此脚本无法找到com.example.ClassTest。关于这个问题有什么想法吗? 提前致谢 问题答案: Java类路径通配符扩展不常见。 从文档: 了解类路径通配符 类路径条目可以包含基本名称通配符,这被认为等效于指定目录中所有扩展名为.jar或.

  • 问题内容: 在Java中,您可以使用相同的API,但使用不同的URL协议来加载各种资源: 这很好地将资源的实际加载与需要资源的应用程序分离开来,并且由于URL只是一个字符串,因此资源加载也很容易配置。 是否有使用当前类加载器加载资源的协议?这类似于Jar协议,除了我不需要知道资源来自哪个jar文件或类文件夹。 我当然可以使用来做到这一点,但这需要我使用不同的API,因此需要对现有代码进行更改。我希

  • 问题内容: 我希望Gradle构建脚本将完整的Classpath添加到构建后创建的JAR文件中包含的清单文件中。 例: 我的构建脚本已经通过这种方式向清单添加了一些信息: 如何获取要添加到清单的依赖项列表? Java教程的此页面详细描述了如何以及为什么向清单中添加类路径:将类添加到JAR文件的类路径中 问题答案: 在Gradle的论坛上找到了一个解决方案: 来源:子项目的Jar任务中带有类路径的清