2011-08-22 32 views
0

我有問題可以從url中讀取最後n行。怎麼做 ?我有url.openstream,但沒有爲RandomAccessFile輸入流的contrsuctor。有人能幫助我嗎?有沒有meybe已經爲此庫。 (當我有文件時,我知道如何用RandomAccess實現,但如何將流更改爲文件)。從url流問題中讀取最後n行

回答

2
  1. 按照慣例打開URL流。
  2. 將返回的InputStream包裝在BufferedReader中,以便您可以逐行讀取它。
  3. 維護一個LinkedList,您將保存行。
  4. 從BufferedReader讀取每行後:
    1. 將行添加到列表中。
    2. 如果列表的大小大於「n」,則請致電LinkedList#removeFirst()
  5. 一旦讀取了流中的所有行,列表將包含最後一行「n」行。

例如(未經測試,只是爲了示範):

BufferedReader in = new BufferedReader(url.openStream()); 
LinkedList<String> lines = new LinkedList<String>(); 
String line = null; 
while ((line = in.readLine()) != null) { 
    lines.add(line); 
    if (lines.size() > nLines) { 
    lines.removeFirst(); 
    } 
} 
// Now "lines" has the last "n" lines of the stream. 
+0

問題是我在android中讀到這個,它是可以是大小爲100 MB ++的日誌文件。我以爲不讀所有文件。 – Damir

+0

@Damir,如果你擁有的只是一個URL流,那麼服務器發送文件結束的唯一方式就是你已經使用了以前的所有內容。也許你應該考慮做一些字節範圍請求,而不是請求整個日誌(但與簡單閱讀所有內容相比,這將是相當複雜的)。 –

+0

實現帶給你最後N行文件的servlet。從你的Android應用程序調用serlvlet。 – AlexR

2

對不起。你將不得不自己做這個。但不要擔心,因爲它非常簡單。

您只需要跟蹤自從您開始從UrlStream讀取以來遇到的最後一行n行。我可以建議使用Queue

基本上你可以做類似

public String[] readLastNLines(final URL url, final int n) throws IOException{ 
    final Queue<String> q = new LinkedList<String>(); 
    final BufferedReader br = new BufferedReader(new InputStreamReader(url.openStream())); 
    String line=null; 
    while ((line = br.readLine())!=null) 
    { 
     q.add(line); 
     if (q.size()>n) q.remove(); 
    } 
    return q.toArray(new String[q.size()]); 
} 

readLastNLines返回包含最後n線從url讀取陣列。

不幸的是,你不能用一個流從互聯網上使用RandomAccessFile因爲流是,通過定義,而不是隨機訪問。