ホームページ  >  記事  >  Java  >  Java でテキスト ファイルの最終行を効率的に読み取るにはどうすればよいですか?

Java でテキスト ファイルの最終行を効率的に読み取るにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-07 20:15:03668ブラウズ

How to efficiently read the last line of a text file in Java?

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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。