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

Java 如何转换ByteArrayOutputStream以使用readline循环,java,apache-commons,apache-commons-net,Java,Apache Commons,Apache Commons Net,我想使用FTP下载一个文件,然后将该文件保存在内存中,然后简单地在行上循环 到目前为止,我下载的文件如下: ByteArrayOutputStream bos = new ByteArrayOutputStream() ftp.retrieveFile("inventory.csv", bos) 我不知道如何从ByteArrayOutputStream循环每条线路 您可以改用retrieveFileStream(),然后使用BufferedReader在try with resources块中

我想使用FTP下载一个文件,然后将该文件保存在内存中,然后简单地在行上循环

到目前为止,我下载的文件如下:

ByteArrayOutputStream bos = new ByteArrayOutputStream()
ftp.retrieveFile("inventory.csv", bos)
我不知道如何从ByteArrayOutputStream循环每条线路


您可以改用
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
相比,它的优势在于,在任何时候,您的程序都不需要在内存中保存整个文件内容的副本。

这是我想到的想法,保存次要忽略,它应该可以帮助您:

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();
}
ByteArrayOutputStream;
BufferedReader BufferedReader;
ftp客户端ftp;
弦线;
数组列表值;
试一试{
bos=新的ByteArrayOutputStream();
ftp=新的FTPClient();
if(ftp.retrieveFile(“inventory.csv”,bos)){
值=新的ArrayList();
bufferedReader=新的bufferedReader(新的StringReader(新的字符串(bos.toByteArray()));
而((line=bufferedReader.readLine())!=null){
添加(行分割(“,”);
}
//然后可以将ArrayList切换为字符串[]
}
}
捕获(异常x){
}
最后{
if(bufferedReader!=null)
bufferedReader.close();
如果(bos!=null)
bos.close();
}

如何解析csv?首先使用类似opencsv的方法解析csv,并将解析后的列保存在内存中,这样更有意义。否则你会一遍又一遍地重播over@efekctive还没有到那个阶段,只是先从远程ftp服务器下载。只需执行简单的字符串拆分b/c csv非常简单,可能只有5-6列。然后需要调用ByteArrayOutputStream.toByteArray将其转换为字符串(字节[]),并在循环中处理。确保忽略cvs标题行(如果有)。如果他的作品让我知道,我会把它作为一个答案。编辑:您将需要和stringreadertoo@efekctive . 是的,听起来好像可以。csv中没有标题。