NIOベースのネットワークプログラミングの複雑さを隠す高品質のフレームワークがいくつかあります(mina、netty、grizzlyなど)。NIOベースのファイルシステムプログラミングを簡素化する同様のフレームワークはありますか?
たとえば、学習演習として、次の(すばらしい!)記事に基づいてディスクでバックアップされたマップを実装したいと思います:http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step。 html。
NIOベースのネットワークプログラミングの複雑さを隠す高品質のフレームワークがいくつかあります(mina、netty、grizzlyなど)。NIOベースのファイルシステムプログラミングを簡素化する同様のフレームワークはありますか?
たとえば、学習演習として、次の(すばらしい!)記事に基づいてディスクでバックアップされたマップを実装したいと思います:http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step。 html。
しかし、それは、Java の NIO FileChannelとMappedByteBufferが、ネットワーキングやセレクターのものほど複雑でなく、理解して使用するのが難しくないためですjava.nio
。
以下は、演習に適したディスクでバックアップされたマップ (NIO ランドでは「マップされたバイト バッファー」と呼ばれる) を作成する例です。
File file = new File("/Users/stu/mybigfile.bin");
FileChannel fc = (new FileInputStream(file)).getChannel();
MappedByteBuffer buf = fc.map(MapMode.READ_WRITE, 0, file.length());
他のBufferと同じようにバッファにアクセスできます。データはディスクとメモリの間を魔法のように素早く移動し、すべて Java と基盤となる OS の仮想メモリ管理システムによって管理されます。ただし、これをある程度制御できます。例: MappedByteBuffer の.force()
( 「このバッファの内容に加えられた変更を、マップされたファイルを含むストレージ デバイスに強制的に書き込む。」 ) および.load()
( 「このバッファの内容を物理メモリにロードする。」 ) 私は個人的にこれらを必要としたことはありません。
@Stuのコメントに追加します。ソケット接続が一度にすべてのデータを持っているわけではなく、代わりに多くの遅い接続をサポートする必要があるかもしれないことに注意する価値があります(特に開いているがデータがまだ送信されていない接続)
ただし、ファイルの場合、すべてのデータを一度に利用できます。通常、最大のパフォーマンスを得るには、一度に数個のファイルを開くだけで済みます(多くの場合、一度に1つずつで問題ありません)。複数のドライブ(まれ)から、または複数のサーバー(非常にまれ)または複数のネットワークインターフェイス(さらにまれ)を一度にいくつかのファイルにアクセスすると、パフォーマンスが向上します。それでも複雑さはそれほど高くなく、ロードするファイルごとにスレッドを作成するだけです。
ファイルが複雑になるのは、ログファイルを読み取ることだけです。読むとファイルのサイズが大きくなる可能性があるため、これは複雑です。ファイルの最後に到達し、後でさらにデータを見つけることができます。また、ログファイルをローテーションすることもできます。つまり、開いていたファイルが目的のファイルではなくなります。それでも、これに対処することはそれほど難しくなく、かなりまれな要件です。