如何转换ByteArrayOutputStream以便使用readline循环

时间:2017-06-19 00:16:57

标签: java apache-commons apache-commons-net

我想使用FTP下载文件,然后将文件保存在内存中,只需循环遍历这些行。

到目前为止,我正在下载这样的文件:

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)

2 个答案:

答案 0 :(得分:1)

这是我想到的想法,除了轻微的忽视,它应该对你有帮助:

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

答案 1 :(得分:0)

您可以使用retrieveFileStream()代替,然后使用BufferedReader在try-with-resources块中逐行阅读。

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的优势在于,您的程序在任何时候都不需要在内存中拥有整个文件内容的副本。