Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。2万件84テキストファイルの末尾から指定した行数のテキストを効率的に取り出したいです。コマンドのようなものです。・・・}br.close();このようなファイルの先頭から順番に1行ずつ取得する方法を応用して最後のn行を取り出すことは出来るのですが、この方法だとファイルサイズが大きい時に処理時間が長くなってしまいます。ファイルの末尾から1行ずつ取り出す方法はあるでしょうか?対象のテキストファイルは以下の想定です。パッケージに参考になりそうなものがありました。似ているので、使い方が直観的です。ファイル全体をブロックに分割されているとしてから、末尾ブロックから読みだしていました。エンコーディングに対応する部分が興味を引く感じ。個の銅バッジReversedLinesFileReaderいいですね。文字コードの指定もできて素晴らしいです。|4ファイルをシーケンシャルに読んでいくのではなく、ランダムアクセスする必要があります。SeekableByteChannel(Java7)を使用し、ファイル位置を指定しながら必要なデータを末尾から取得します。1024);channel.read(buffer);あとはアクセスしている位置を保持し、繰り返し取得しながら改行コード(データを逆から辿るならばCRLFとLFが混在していたとしてもLF='\n'の個数のみをカウントすれば良い)を見つけて必要な行数分データを取っていくロジックにすれば良いです(このロジックの場合、ファイルサイズが1024byteより小さい場合の考慮が必要となります)。取得したバイトデータを指定された文字コードで変換するには以下のようにします。"UTF-8");この変換処理は欲しいデータ分たまったあと一気にすれば良いです(指定行数分の取得ロジック部では改行コードのバイトデータをチェックしていれば良い)。|1Java8ならFiles.linesが良いかと思います。http://docs.oracle.com/javase/8/docs/api/java/nio/file/Files.html#lines-java.nio.file.Path-それ以前ならjava.io.LineNumberReaderクラスを使うのはどうでしょう。6:18>...この方法だとファイルサイズが大きい時に処理時間が長くなってしまいます。わたしのこちらの回答時の前提としては、Javaバイトコードのステップ数が減る方法を優先して考えていました。ライブラリ側処理で性能を担保する想定です。この文脈での「ファイルサイズが大きい」と「処理時間が長く」とはどれぐらいのオーダーを想定したものでしょうか。ファイルサイズとして、1行が1000文字以上、もしくは行数が1万行以上、などです。ほかにも、想定するJavaVMの実行環境の違いはどうでしょうか。PCやサーバ上でしょうか、Androidスマートフォン上での実行でしょうか。メモリ上でも、OSでのIOバッファによるブロック読み込みも結果に影響するでしょう。ファイルを読み込む場合と、ディスクキャッシュによりメモリ上に読み混み済みの場合で結果が大きく変化するでしょう。あわせて、Java側から呼ばれるライブラリが使うJNIのパフォーマンス計測と比較するでしょう。別のシーケンシャルなアクセス方法を提示されても解決しないのではないでしょうか。|回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。