是否有任何方法從文本文件中讀取特定的行?在API或Apache Commons中。 喜歡的東西:從Java中的文本文件中讀取特定的行
String readLine(File file, int lineNumber)
我同意這是微不足道的實施,但它不是非常有效的特別是如果該文件是非常大的。
是否有任何方法從文本文件中讀取特定的行?在API或Apache Commons中。 喜歡的東西:從Java中的文本文件中讀取特定的行
String readLine(File file, int lineNumber)
我同意這是微不足道的實施,但它不是非常有效的特別是如果該文件是非常大的。
String line = FileUtils.readLines(file).get(lineNumber);
會做,但它仍然有效率問題。
或者,你可以使用:
LineIterator it = IOUtils.lineIterator(
new BufferedReader(new FileReader("file.txt")));
for (int lineNumber = 0; it.hasNext(); lineNumber++) {
String line = (String) it.next();
if (lineNumber == expectedLineNumber) {
return line;
}
}
這將是稍微更有效,因爲緩衝區。
看看Scanner.skip(..)
並嘗試跳過整行(用正則表達式)。我不知道它是否會更有效率 - 以此爲基準。
P.S.與效率我的意思是內存效率
如果你讀的系是所有相同的長度,然後計算可能是有用的。
但是在線條長度不同的情況下,我不認爲有一種方法可以逐個讀取它們,直到行數正確爲止。
和「相同長度」是指字節長度相同,而不是字符(考慮到可變長度字符編碼) – MBO 2010-01-26 09:21:11
實際上輸入文件是固定長度和ANSI,我忘了在問題中指定這個。問題可能是行分隔符,應用程序必須在Windows和Unix中運行。 – 2010-01-26 10:18:27
如果您要以相同的方式使用同一個文件(在特定行查找文本),您可以爲您的文件建立索引。行號 - >偏移量。
不是我所知道的。
要知道,有上的文件沒有特殊的索引,以線開始的地方,所以任何實用的方法是完全一樣有效,因爲:
BufferedReader r = new BufferedReader(new FileReader(file));
for (int i = 0; i < lineNumber - 1; i++)
{
r.readLine();
}
return r.readLine();
(用適當的錯誤處理和資源關閉邏輯,當然)。
不幸的是,除非你能保證文件中每一行的長度完全相同,否則你將不得不通讀整個文件,或者至少讀到你之後的行。
你可以計算行的唯一方法是在文件中尋找新的行字符,這意味着你將不得不讀取每個字節。
可以優化你的代碼,使它整潔可讀,但是在你的下面你總是會閱讀整個文件。
如果您要反覆讀取同一文件,您可以解析該文件並創建一個存儲某些行號的偏移量的索引,例如第100,200行等的字節數爲。
由於文件是字節而不是行定向 - 任何通用解決方案的複雜度最多爲O(n),其中n爲文件大小(以字節爲單位)。您必須掃描整個文件並計算行分隔符,直到您知道要讀取的文件的哪一部分。
guava有類似的東西:
List<String> Files.readLines(File file, Charset charset);
所以,你可以做
String line = Files.readLines(file, Charsets.UTF_8).get(lineNumber);
使用文件utils的:
File fileFeatures = new File(
"Homework1AdditionalFiles/jEdit4.3/jEdit4.3ListOfFeatureIDs.txt");
String line = (String) FileUtils.readLines(fileFeatures).get(lineNumber);
根據這一answer,爪哇8使我們能夠提取特定來自文件的行。答案中提供了示例。
什麼是FileUtils?它來自Java 7嗎? – finnw 2010-01-26 09:21:59
不,它是commons-io - 問題中指定的庫 – Bozho 2010-01-26 09:28:43
效率?我認爲真正的問題是,第一個解決方案將**整個**文件讀到內存中...... – abyx 2010-01-26 09:41:17