2012-08-10 26 views
2

我需要對文件進行處理,首先計算行數並與值進行比較。可以在流式讀取器中使用相同的輸入流

下一步是通過逐行讀取文件並進行驗證。

如果第一個只通過我需要做第二個過程。

我用FTP讀取同一個文件。

當我嘗試創建不同的輸入流... ftp忙於讀取當前文件。

這樣的:

(is1 = ftp.getFile(feedFileName);) 
下面

是剩餘:

InputStream is = null; 
LineNumberReader lin = null; 
    LineNumberReader lin1 = null; 
is = ftp.getFile(feedFileName); 
lin = new LineNumberReader(new InputStreamReader(is)); 

所以我只是使用如下:

is1=is; 

都將流是具有從文件內容開始完成或第一個流對象被讀取後第二個對象將變爲空。

那麼剩下的唯一選擇是創建一個新的ftp對象來單獨讀取一個流?

+0

這是什麼 '的ftp忙讀取當前文件' 的意思。任何例外? – home 2012-08-10 13:38:38

+0

當我給出時發生異常:is1 = ftp.getFile(feedFileName);由於ftp已經讀到。 – ashwinsakthi 2012-08-10 13:41:03

回答

2

在完成LineNumberReader之後,關閉InputStream is。然後從FTP重新請求文件,它不會再忙了。你不能'只是'從同一個InputStream中讀取,因爲LineNumberReader完成時可能已經耗盡了。此外,並非所有InputStream都支持mark()reset()方法。

但是我建議只在第一個過程成功時執行第二個過程可能不是正確的方法。由於您無論如何都在傳輸數據,爲什麼不將它流式傳輸到臨時數據結構中,然後對這些行進行計數,然後對相同的數據結構進行操作。

+0

我需要計數行,看看它是否等於在同一個文件中提到的計數。只有如果它的相等,我需要做的文件內容行的驗證線是什麼,而不是csv格式的個人記錄。所以,當我完成了計數並完成了第一次驗證,我需要從開始的流。所以我感到困惑,接下來該怎麼辦...如果可能,請問如何將文件內容加載到數據結構,然後計數它。 – ashwinsakthi 2012-08-10 14:02:11

+0

您已經在使用輸入到LineNumberReader中的InputStreamReader。如果你首先緩存'List '中的所有讀取行,那麼你可以做同樣的事情,並且不需要兩次流式傳輸文件。 – 2012-08-10 14:20:00

+0

謝謝Hiery ...我跟着你的方法,它的工作。 – ashwinsakthi 2012-08-10 15:44:27

1

如果你文件不大,可以將數據保存到一個String中。 liek:

StringBuilder sb = new StringBuilder(); 
byte[] buffer = new byte[1024]; 
int len; 
while((len = is.read(buffer))!=-1) 
sb.append(buffer, 0, len); 
String data = sb.toString(); 

那麼你可以做進一步的事情在String 這樣的:

int lineNumber = data.split("\n").length; 
相關問題