2009-07-15 9 views
2

NIOベースのネットワークプログラミング(mina、netty、grizzlyなど)の複雑さを隠す高品質のフレームワークがいくつかあります。 NIOベースのファイルシステムプログラミングを単純化する類似のフレームワークはありますか?ネットワークではなくファイルシステム用のJava NIOフレームワーク?

たとえば、学習の練習として、私はこの(最高!)記事:http://www.javaworld.com/javaworld/jw-01-1999/jw-01-step.htmlに基づいてディスクバックアップマップを実装したいと思います。

答えて

6

ありません(ただし、...)

しかし、それがあるため、JavaのNIO FileChannelMappedByteBufferを理解し、ネットワーキングとSelectorもの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()「物理メモリにバッファのコンテンツをロードします。」)私がきたことはありませんこれらは個人的に必要でした。

3

@ Stuさんのコメントに追加します。ソケット接続は一度にすべてのデータを保持しているわけではありませんが、多くの低速接続をサポートする必要があります(開いているがデータはまだ送信されていません)

ファイルの場合、すべてのデータは一度にいくつかのファイルを開いて、パフォーマンスを最大限にする必要があります(通常は一度に1つだけです)。複数のドライブ(まれに)または複数のサーバー(まれに)または複数のネットワークインターフェイス一度にいくつかのファイルにアクセスしてもパフォーマンスが向上します(もっと稀です)。それでも複雑さは高くなく、読み込んでいるファイルごとにスレッドを作成するだけです。

ファイルが複雑な唯一の機会は、ログファイルを読み取ることです。これは、ファイルが読み込まれるにつれてサイズが大きくなることがあります。ファイルの最後に到達し、後でより多くのデータを見つけることができます。また、ログファイルを回転させると、開いていたファイルはもはや必要なファイルではなくなります。それでも、これは対処が非常に難しくなく、かなりまれな要件です。

+0

+1:ソケット接続に関する非常に良い点 –

関連する問題