2017-06-19 111 views
0

我想使用FTP下載文件,然後將文件保存在內存中,並簡單地循環播放。如何轉換ByteArrayOutputStream以循環使用readline

我下載文件這樣至今:

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-與資源塊。

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