2017-06-19 8 views
0

私はFTPを使用してファイルをダウンロードし、そのファイルをメモリに保存して単純にその行をループします。Readlineを使用してループするためにByteArrayOutputStreamを変換する方法

私はこれまでのところ、このようなファイルをダウンロードしています:

ByteArrayOutputStream bos = new ByteArrayOutputStream() 
ftp.retrieveFile("inventory.csv", bos) 

は、私は、各ラインのループにできるようにByteArrayOutputStreamから行くするかどうかはわかりません。

https://commons.apache.org/proper/commons-net/apidocs/org/apache/commons/net/ftp/FTPClient.html#retrieveFile(java.lang.String,%20java.io.OutputStream)

+0

はどのようにcsvファイルを解析していますか? – efekctive

+0

最初にopencsvのようなものを解析し、解析された列をメモリに保持する方が理にかなっています。さもなければ、 – efekctive

+0

@efekctiveは、リモートのftpサーバから最初にダウンロードするだけで、その段階には至っていません。単純な文字列分割b/cを行うかもしれません.csvは非常にシンプルで多分5〜6列です。 – Blankman

答えて

0

代わりretrieveFileStream()を使用して、BufferedReaderを使用してみてください - と、リソースブロックに行ずつ読むことができました。

try (BufferedReader reader = 
     new BufferedReader(
       new InputStreamReader(ftp.retrieveFileStream("inventory.csv"), 
         StandardCharsets.UTF_8))) { 
    String line; 
    while ((line = reader.readLine()) != null) { 
     // do something with line 
    } 
} catch (IOException e) { 
    // handle error 
} 

このコードでは、ファイルがUTF-8でエンコードされていることを前提としています。別のエンコードを使用する場合は、必ずStandardCharsets.UTF_8を置き換えてください。

ByteArrayOutputStreamのメリットより、プログラムでは、ファイル内容全体をメモリにコピーする必要はありません。

0

これは私が念頭に置いていたアイデア、マイナーな見晴らしを保存している、それはあなたを助ける必要があります。

ByteArrayOutputStream bos; 
BufferedReader bufferedReader; 
FTPClient ftp; 
String line; 
ArrayList<String[]> values; 
try{ 
    bos = new ByteArrayOutputStream(); 
    ftp = new FTPClient(); 
    if (ftp.retrieveFile("inventory.csv", bos)){ 
     values = new ArrayList<>(); 
     bufferedReader = new BufferedReader(new StringReader(new String(bos.toByteArray()))); 
     while ((line = bufferedReader.readLine()) != null){ 
      values.add(line.split(",")); 
     } 
     // Then you could switch ArrayList<String[]> for just String[] 
    } 

} 
catch(Exception x){ 

} 
finally{ 
    if (bufferedReader != null) 
     bufferedReader.close(); 
    if (bos != null) 
     bos.close(); 
} 
関連する問題