2010-03-05 101 views
2

在兩個方向上讀取一個非常大的文本文件的n行塊我需要讀取一個非常大的日誌文件(大約400MB)並在textarea中顯示其內容。如何使用Java

很明顯,我不能首先讀取整個文件,因爲它的維度,所以我正在尋找一種方法,可以讀取前n行(或部分字節),然後,當被問到時,開始閱讀下一個n行,等等。該方法需要在兩個方向上工作:即如果顯示1000到1500行,並且用戶想要回讀,則必須顯示500到1000行。

我正在嘗試RandomAccessFile,LineIterator和經典BufferedReader方法,但這些似乎並不是很好的解決方案。

在此先感謝。

+0

行是否有固定數量的字符? – 2010-03-05 11:54:19

+0

你能把它分成幾個小文件(每行1000行)嗎? – Roman 2010-03-05 11:56:10

+0

這些行沒有固定的字符數。 是的,我可以將文件拆分成幾個較小的文件,但在大多數情況下用戶不需要讀取整個文件,所以這可能不是一種有效的方法。 – alexmeia 2010-03-05 11:59:25

回答

3

如果您的文件沒有嚴格的結構(即Martijn注意到的每行或每個邏輯塊的固定字符數),那麼您無法使用RandomAccessFile的優點。

在這種情況下,您可以嘗試將大文件分割成更小的文件,每個文件的行數固定(例如1000)。在這種情況下,當用戶想要查看1800到2100行時,只需要讀取2個文件(如果您說總大小約爲400 Mb,則可能會從幾千個文件中讀取)。

如果你不能做到這一點,你可以做的唯一事情就是使用NIO至少增加一點性能。

+0

將文件拆分成較小的文件對我來說似乎不是一個好的解決方案。如果我這樣做了,當用戶請求不在他正在閱讀的文件中的行時,我遇到了瀏覽這些文件的問題。 – alexmeia 2010-03-05 12:07:42

+0

沒有任何問題。讀一個小文件不是很繁重的操作。它比從一端讀取​​一個大文件輕得多。 – Roman 2010-03-05 12:22:29

+0

如果您確定該用戶將主要閱讀連續的行,然後使用NIO。如果用戶很可能想讀取第100行然後第20000行,那麼請使用我的方法。 – Roman 2010-03-05 12:24:43

1

在類似情況下,其他人建議將文件存儲在數據庫中。例如每行作爲單獨的記錄。然後以任何方向讀取數據或以大塊或小塊讀取數據都容易得多。