使用类路径在java中加载CSV

使用类路径在java中加载CSV,java,spring,csv,Java,Spring,Csv,如何使用类路径加载csv文件? 在此之前,我尝试使用FileReader加载文件,在本地运行时效果很好,但部署到外部服务器时会抛出FileNotFound之类的异常。下面的代码在本地工作,但在tomcat文件夹www/[jar]上部署jar时会引发此异常 不幸的是,我无法提供原始代码。要点如下: BufferedReader br = new BufferedReader(new FileReader("src/SSR.csv")); while ((line = br.readLine

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

这里有两件事你应该考虑:

  • 正如我们的同事已经说过的,当代码在jar中运行时,您想要加载一个类路径资源,您不能使用您已经说过的FileReader方法 您当前的代码假定CSV位于工件之外的文件系统中的某个位置,这可能不是真的,因此它无法找到该文件

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

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


  • <> P> >这里有两件事你应该考虑:

  • 正如我们的同事已经说过的,当代码在jar中运行时,您想要加载一个类路径资源,您不能使用您已经说过的FileReader方法 您当前的代码假定CSV位于工件之外的文件系统中的某个位置,这可能不是真的,因此它无法找到该文件

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

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


  • …举几个例子

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

    对于您的csv文件,请按照

    Resource csv = context.getResource("classpath:some/resource/path/my.csv");
    InputStream inputstream = csv.getInputStream();
    
    应该是一个起点。资源接口提供了一个

    File getFile() throws IOException;
    
    方法,但这仅在文件驻留在文件系统中时才起作用。因此,对于您的案例,我认为您应该使用inputstream的方法

    编辑: 在这里,您可以使用ClassPathResource找到另一个答案

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

    对于您的csv文件,请按照

    Resource csv = context.getResource("classpath:some/resource/path/my.csv");
    InputStream inputstream = csv.getInputStream();
    
    应该是一个起点。资源接口提供了一个

    File getFile() throws IOException;
    
    方法,但这仅在文件驻留在文件系统中时才起作用。因此,对于您的案例,我认为您应该使用inputstream的方法

    编辑: 在这里,您可以使用ClassPathResource找到另一个答案

    您需要发布您的代码,让我们看看发生了什么,以及完整的异常堆栈跟踪,您是否使用了getClass().getResource()。。你的类路径中有文件吗?你可以检查这个主题。你可能会找到解决问题的办法。您需要发布您的代码,让我们看看发生了什么,以及完整的异常堆栈跟踪,您是否使用了getClass().getResource()。。你的类路径中有文件吗?你可以检查这个主题。你可能会找到解决问题的办法。我可以使用ClassPathResource从单元测试用例中读取src/test/resources下的csv文件,但是我无法从src/main/java代码中读取src/main/resources下的相同文件。我可以使用ClassPathResource从单元测试用例中读取src/test/resources下的csv文件,但是我无法从src/main/java代码中读取src/main/resources下的同一个文件我可以使用ClassPathResource从单元测试用例中读取src/test/resources下的csv文件,但是我无法从src/main/java中读取src/main/resources下的同一个文件code@Sid如何运行代码?也许这就是你的问题的答案我使用gradle来构建和运行JAR,你能在ClasspathResource中发布引用文件的路径吗?我可以使用ClasspathResource从单元测试用例中读取src/test/resources下的csv文件,但是我无法从src/main/java读取src/main/resources下的相同文件code@Sid如何运行代码?也许这就是你的问题的答案,我使用gradle来构建和运行JAR,你能在ClasspathResource中发布引用文件的路径吗?