使用 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中文网其他相关文章!