首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >正在读取CSV文件返回java.io.FileNotFoundException:

正在读取CSV文件返回java.io.FileNotFoundException:
EN

Stack Overflow用户
提问于 2016-08-25 14:25:51
回答 4查看 1.1K关注 0票数 1

我正在尝试从应用程序中读取csv文件。但我得到了java.io.FileNotFoundException:。下面是我的csv阅读代码。

代码语言:javascript
运行
复制
    String constantURL = AppConst.INTERNAL_ASSETS_CONFIG_ROOT_URL + "whitelist/RMWhitelist.csv";
    logger.info("constantURL >  " + constantURL);

    BufferedReader br = null;
    String line = "";
    String cvsSplitBy = ",";
    try{         

        br = new BufferedReader(new InputStreamReader(new FileInputStream(constantURL)));      
        while ((line = br.readLine()) != null) {
           String[] country = line.split(cvsSplitBy);
           System.out.println("Country [code= " + country[0] + " , name=" + country[1] + "]");
        }
    }catch(Exception e){
        e.printStackTrace();
    }

下面是我得到的错误。

代码语言:javascript
运行
复制
 INFO: constantURL >  http://localhost:7001/shops/config/whitelist/milRMWhitelist.csv
 java.io.FileNotFoundException: http:\localhost:7001\app\config\whitelist\RMWhitelist.csv (The filename, directory name, or volume label syntax is incorrect)

为什么会出现这个错误?路径中提供了CSV文件。

更新

下面是我在另一个项目中使用的现有代码之一。这工作得很好。但是相同的代码在这个新项目中不起作用。获取F.N.F错误。如何区分文件输入流是URL还是来自文件路径?

代码语言:javascript
运行
复制
final String file = this.httpRequestPoster.sendGetRequest(AppUrlConst.CONFIG_URL + "other.csv", "");
    Reader reader = new StringReader(file);
    final CSVReaderBuilder<UpgradeVO> customerVOCSVReaderBuilder = new CSVReaderBuilder<UpgradeVO>(reader);
    customerVOCSVReaderBuilder.strategy(CSVStrategy.UK_DEFAULT);
    CSVReader<UpgradeVO> customerVOCSVReader = customerVOCSVReaderBuilder.entryParser(new UpgradeParser()).build();
    Iterator<UpgradeVO> customerVOIterator = customerVOCSVReader.iterator();
    while (customerVOIterator.hasNext()) {
        UpgradeVO upgradeVO = customerVOIterator.next();
        logger.info(UpgradeVO.getServiceId());
    }
EN

回答 4

Stack Overflow用户

发布于 2016-08-25 14:31:23

您正在将FileInputStreams与HTTP URL混合在一起

要么使用一个,要么使用另一个

例如:

代码语言:javascript
运行
复制
 InputStream input = new URL(constantUrl).openStream();

代码语言:javascript
运行
复制
 br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath)));
票数 2
EN

Stack Overflow用户

发布于 2016-08-25 14:28:38

您正在向FileInputStream传递一个表示URL的字符串。FileInputStream需要一个指向文件系统的文件名。因此,您的方法不起作用!

换句话说:通过包括主机IP地址和端口号,您的字符串不再“仅仅是一个文件名”。

因此,有两种选择:

  1. 如果你真的想要传递一个URL,那么你需要使用一个真正的对象,并使用它的openStream()方法。意思:你不用从一个字符串中创建一个URL;你创建一个FileInputStream对象;然后你在这个对象上调用openStream()来从那个流中读取。
  2. 你修改你的字符串就是:一个“平面”的文件名;没有任何ip地址或端口号。
票数 0
EN

Stack Overflow用户

发布于 2016-08-25 15:36:16

根据你的评论和对你的问题的更新,我认为这是可行的:

代码语言:javascript
运行
复制
String constantURL = AppConst.INTERNAL_ASSETS_CONFIG_ROOT_URL + "whitelist/RMWhitelist.csv";
File file = new File(constantURL);
String cvsSplitBy = ",";
try(BufferedReader br = new BufferedReader(new InputStreamReader(file.exists()?new FileInputStream(file): new URL(constantURL).openStream()));){    
    for (String line; (line = br.readLine()) != null;) {
       String[] country = line.split(cvsSplitBy);
       System.out.println("Country [code= " + country[0] + " , name=" + country[1] + "]");
    }
}catch(Exception e){
    e.printStackTrace();
}

重要的部分是这个file.exists() ? new FileInputStream(file) : new URL(constantURL).openStream(),它检查constantURL是否是本地文件系统上的有效文件路径。如果是,它会打开一个FileInputStream;如果不是,它会尝试打开到的url连接。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39138096

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档