2016-08-25 12 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

あなたのFileInputStreamにURLを表す文字列を渡しています。 FileInputStreamは、ファイルシステムを指すファイル名を想定しています。したがって、あなたのアプローチはうまくいきません!

つまり、ホストIPアドレスとポート番号を含めることで、文字列はもはや「単なるファイル名」ではなくなりました。あなたが本当にURLを渡したい場合、あなたは本物のURLオブジェクトを使用して、そのopenStream()メソッドを使用する必要があり、

  1. は、このように二つの選択肢があります。意味:あなたはではありません文字列からFileInputStreamを作成します。 URLオブジェクトを作成します。そのオブジェクトのopenStream()をに呼び出し、そのストリームからを読み込みます。

  2. 文字列を次のように修正します。「フラット」ファイル名。 IPアドレスやポート番号はまったくありません。
+0

どうやって?例を挙げる?私はこの 'final String file = this.httpRequestPoster.sendGetRequest(constantURL、" ");'と同じエラーを試みました。 'file'の出力を出力すると、ファイルの内容が表示されます。同じF.N.Fエラーがあります –

+0

私の更新された回答を参照してください。 – GhostCat

2

あなたは

どちらか一つを使用するHTTP URLでFileInputStreamsを混合しているか、他の

例えば私はこれが動作すると思います、あなたの質問にあなたのコメントや更新情報に基づいて

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

重要な部分がconstantURLがあるかどうかを確認され、このfile.exists() ? new FileInputStream(file) : new URL(constantURL).openStream()ですローカルファイルシステム上の有効なファイルパス。そうである場合は、FileInputStreamを開き、そうでない場合は、URL接続を開こうとします。

0

あなたはAppConstをどのように宣言したのか分かりません。正常に動作するはずのファイル 例

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

に値を設定する際に///プロトコル:INTERNAL_ASSETS_CONFIG_ROOT_URL変数

試みは、ファイルを使用します。

関連する問題