2016-08-25 2 views
1

Я пытаюсь прочитать файл csv из приложения. Но я получаю java.io.FileNotFoundException:. Ниже приведен код чтения csv.Чтение файла CSV-файла java.io.FileNotFoundException:

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(); 
    } 

Ниже приведена ошибка.

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 доступен в пути.

UPDATE

Ниже один из существующего кода я использую в другом проекте. Это работает нормально. Но тот же код не работает в этом новом проекте. Получил ошибку F.N.F. Как этот дифференцировать поток входных файлов - это URL-адрес или путь к файлу?

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()); 
    } 
+0

Ваш файл доступен по указанному вами пути в вашем сообщении об ошибке или в вашем пути к классу? – LuckAss

+0

вам нужно определить источник вашего потока. обновленный код не будет работать, если исходная строка - это местоположение файла, а не http url. – daotan

+0

@daotan Но это мой существующий код, который отлично работает как для URL, так и для файла, без каких-либо изменений. –

ответ

0

Вы передаете строку, которая представляет URL к вашему FileInputStream. FileInputStream ожидает, что имя файла укажет на файловую систему. Поэтому ваш подход не работает!

Другими словами: путем включения IP-адреса хоста и номера порта ваша строка больше не является «просто именем файла».

Таким образом, есть два варианта:

  1. Если вы действительно хотите, чтобы передать URL, то вам необходимо использовать реальный объект URL, и использовать его метод Openstream(). Значение: вы делаете не создать FileInputStream из строки; вы создаете объект URL; и затем вы вызываете openStream() на этом объекте на , читаете из этого потока.
  2. Вы переделываете свою строку так: «плоское» имя файла; нет IP-адресов или номеров портов.
+0

Как это сделать? приведите пример? Я попробовал этот последний файл String = this.httpRequestPoster.sendGetRequest (constantURL, ""); 'все еще та же ошибка. Когда я печатаю вывод «файла», я вижу содержимое файла. но по-прежнему имеет такую ​​же ошибку F.N.F –

+0

См. мой обновленный ответ. – GhostCat

2

Вы смешивание FileInputStreams с HTTP URL

Либо использовать один или другой

например,

InputStream input = new URL(constantUrl).openStream(); 

или

br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath))); 
+0

Этот путь, когда я разрабатываю локально, является URL-адресом. Но когда производство читается с диска. Но мой код должен оставаться таким же, чтобы обрабатывать как файл url, так и файл CSV. –

+0

В этом случае, возможно, вам следует проверить строку url, чтобы решить, какой из них использовать. –

+1

@everalian. Вы можете проверить, является ли путь файлом, используя что-то вроде этого 'if (new File (filePath) .exists()) {... } ' – Titus

0

на основе ваших комментариев и обновлений на ваш вопрос, я думаю, что это будет работать:

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

Я не знаю, как вы заявили AppConst.INTERNAL_ASSETS_CONFIG_ROOT_URL переменная

пытаются использовать файл: /// протокола в установке значения для файла например

URL urlFile = new URL("file:///C:/whitelist/RMWhitelist.csv"); 
URL urlHttp = new URL("http://http://localhost:7001/shops/config/"); 

, который должен работать правильно.

Смежные вопросы