2017-06-19 113 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(); 
}