我想使用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