私はJavaでファイルリーダーオブジェクトを持っています。Javaでのファイル操作
ファイルをロードすると、ファイル全体がロードされるか、ファイルポインタのみがCのようにロードされます。アプリケーション(プロデューサ)がファイルへの書き込みを継続し、他のアプリケーション(コンシューマ)が開始されます。数分後にファイルを読むと、アプリケーションプロデューサが書き込むすべてのファイルデータを読みたいと思う。
私は検索しようとしましたが、答えを得ることができませんでした。
私はJavaでファイルリーダーオブジェクトを持っています。Javaでのファイル操作
ファイルをロードすると、ファイル全体がロードされるか、ファイルポインタのみがCのようにロードされます。アプリケーション(プロデューサ)がファイルへの書き込みを継続し、他のアプリケーション(コンシューマ)が開始されます。数分後にファイルを読むと、アプリケーションプロデューサが書き込むすべてのファイルデータを読みたいと思う。
私は検索しようとしましたが、答えを得ることができませんでした。
「ファイルを読み込むとき」と書いたときの意味を理解できません。サンプルコードはここで役立ちます。 How to Askをご覧ください。
Reader
で "読み込み"のように聞こえることがあれば、メモリにデータがあります。これがテキストデータ(FileReader
を使用していると仮定した場合)の場合は、BufferedReader
を使用する方がよいでしょう。バッファリングされるだけでなく、テキストファイルの方が便利です。
答えが間違っている場合は、いくつかのコードを投稿して、あなたが話していることを知ってください。そして歓迎!
FileReader
は、FileInputStream
とよく似ています。つまり、ファイルを最初に開いたときに、すぐに実際に読み込まれるデータはほとんどありません。ファイルの内容は、最初にread
のうちのいくつかのものが読み込まれていません。その時点で、要求を満たすのに十分な時間が読み込まれます。また、BufferedReaderを使用している場合はバッファです(おそらく、 OSとJVM上で)。
私は「Cのアナログのように機能する」と言いますが、それは意味します。 FileReader
は読み取り用に開かれ、FileWriter
は書き込み用に開かれます。同時に読み書き用にファイルを開いておくことに問題がある可能性があります。特に、Windowsはあまり好きではありません。あなたが移植性を気にしているのであれば、別の方法を探してみたいかもしれません。alphazero's answerは有望ですが、試したことはありません。
ベストと標準的なアプローチは、Java NIO memory mapped filesを使用することです。各書き込みでMappedByteBuffer.force()を使用して、コンシューマプロセスがダーティページファイルをフラッシュすることを保証します。コンシューマーは(必要に応じて他のプロセスで)同じファイルを読み取りモードでマップすることができます。