Java でテキスト ファイルの最後の行を効率的に読み取る
大きなテキスト ファイルの最後の行を効率的に読み取ることは、 Javaプログラミング。ファイルを 1 行ずつ読み取る標準的な方法は、ファイル全体を反復処理する必要があるため効率的ではありません。
より効率的な方法は、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 中国語 Web サイトの他の関連記事を参照してください。