我想使用FTP下载文件,然后将文件保存在内存中,并简单地循环播放。如何转换ByteArrayOutputStream以循环使用readline
我下载文件这样至今:
ByteArrayOutputStream bos = new ByteArrayOutputStream()
ftp.retrieveFile("inventory.csv", bos)
我不知道如何从一个ByteArrayOutputStream到能够循环每一行。
我想使用FTP下载文件,然后将文件保存在内存中,并简单地循环播放。如何转换ByteArrayOutputStream以循环使用readline
我下载文件这样至今:
ByteArrayOutputStream bos = new ByteArrayOutputStream()
ftp.retrieveFile("inventory.csv", bos)
我不知道如何从一个ByteArrayOutputStream到能够循环每一行。
你可以使用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
的优势在于,您的程序在任何时候都不需要在内存中拥有整个文件内容的副本。
这想法我脑子里想的,保存轻微眺望,它应该帮助你:
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();
}
你是如何解析的CSV? – efekctive
首先用opencsv解析它,并在内存中保存解析的列更有意义。否则,你会一遍又一遍地重新编辑 – efekctive
@efekctive还没有到达这个阶段,只是先从远程ftp服务器上下载。只需做一个简单的字符串拆分b/c csv非常简单,也许只有5-6列。 – Blankman