使用Java 高效讀取文本文件的最後一行
高效讀取大型文本文件的最後一行是一個常見的挑戰Java編程。逐行讀取檔案的標準方法效率不高,因為它需要迭代整個檔案。
更有效的方法是使用 RandomAccessFile 類別。此類別允許隨機存取文件,使我們能夠直接存取最後一行,而無需逐步遍歷整個文件。以下程式碼示範了這種方法:
public String tail(File file) { RandomAccessFile fileHandler = null; try { fileHandler = new RandomAccessFile(file, "r"); long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); // Start from the last character of the file for (long filePointer = fileLength; filePointer != -1; filePointer--) { fileHandler.seek(filePointer); int readByte = fileHandler.readByte(); // Check for line break if (readByte == 0xA) { if (filePointer == fileLength) { continue; } break; } else if (readByte == 0xD) { if (filePointer == fileLength - 1) { continue; } break; } // Append character to the string builder sb.append((char) readByte); } String lastLine = sb.reverse().toString(); return lastLine; } catch (java.io.FileNotFoundException e) { e.printStackTrace(); return null; } catch (java.io.IOException e) { e.printStackTrace(); return null; } finally { if (fileHandler != null) { try { fileHandler.close(); } catch (IOException e) { /* ignore */ } } } }
此方法有效地傳回檔案的最後一行,而無需載入或單步執行整個檔案。
但是,在許多情況下,您可能需要讀取檔案的最後 N 行。以下程式碼示範了可以實現此目的的方法:
public String tail2(File file, int lines) { RandomAccessFile fileHandler = null; try { fileHandler = new java.io.RandomAccessFile(file, "r"); long fileLength = fileHandler.length() - 1; StringBuilder sb = new StringBuilder(); int line = 0; // Start from the last character of the file for (long filePointer = fileLength; filePointer != -1; filePointer--) { fileHandler.seek(filePointer); int readByte = fileHandler.readByte(); // Check for line break if (readByte == 0xA) { if (filePointer < fileLength) { line = line + 1; } } else if (readByte == 0xD) { if (filePointer < fileLength - 1) { line = line + 1; } } // Break if the required number of lines have been reached if (line >= lines) { break; } // Append character to the string builder sb.append((char) readByte); } String lastLine = sb.reverse().toString(); return lastLine; } catch (java.io.FileNotFoundException e) { e.printStackTrace(); return null; } catch (java.io.IOException e) { e.printStackTrace(); return null; } finally { if (fileHandler != null) { try { fileHandler.close(); } catch (IOException e) { } } } }
此方法類似地使用 RandomAccessFile 類別來有效讀取檔案的最後 N 行。
這些方法可以調用為如下:
File file = new File("D:\stuff\huge.log"); System.out.println(tail(file)); System.out.println(tail2(file, 10));
注意:這些方法可能由於反轉而無法正確生成Unicode 字符,因此使用不同語言進行徹底測試非常重要。
以上是如何在Java中高效地讀取文本文件的最後一行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!