問題タブ [filechannel]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票する
4 に答える
7076 参照

java - Java NIO MappedByteBuffer OutOfMemoryException

私は本当に困っています:FileChannelsとsを使用して数GBを超える巨大なファイルを読みたい-私が見つけたすべてのドキュメントは、メソッドMappedByteBufferを使用してファイルをマップするのはかなり簡単であることを示唆しています。FileChannel.map()もちろん、すべてのBufferメソッドが位置、制限、および容量にintを使用するため、2GBに制限がありますが、それより下のシステムの暗黙の制限についてはどうでしょうか。

実際には、私はOutOfMemoryExceptionsに関して多くの問題を抱えています!そして、実際に限界を定義する文書はまったくありません!では、int-limitに収まるファイルを、MappedByteBuffer例外を取得せずに1つまたは複数のsに安全にマップするにはどうすればよいですか?

試す前に、ファイルのどの部分を安全にマップできるかをシステムに尋ねることはできますFileChannel.map()か?どのように?この機能に関するドキュメントが非常に少ないのはなぜですか?

0 投票する
3 に答える
1213 参照

java - マップメソッドを呼び出した後、Java 7 ファイルチャネルが正しく閉じない

私は sc2replay 解析ツールに取り組んでいます。MPQLIB http://code.google.com/p/mpqlib/の上に構築します

残念ながら、このツールはファイルチャネルを使用して bzip ファイルを読み取り、map(MapMode.READ_ONLY, hashtablePosition, hashTableSize);

その関数を呼び出した後、ファイル チャネルを閉じても、その過程でファイルは解放されません。具体的には、ファイルの名前を変更/移動することはできません。

この問題は Java 7 で発生し、Java 6 では問題なく動作します。

これを複製するための簡単なコード スニペットを次に示します。

fc.map をコメントアウトすると、ファイルの名前を変更できます。

PS ここからFileChannel を閉じる必要がありますか?

ファイルチャネルとファイルストリームの両方を閉じる必要はないと述べています。これは、一方を閉じると他方が閉じられるためです。また、どちらかまたは両方を閉じようとしましたが、それでも機能しませんでした。

Java 7 で FileChannel.map を使用してデータを読み取った後にファイルの名前を変更する方法はありますか?

0 投票する
2 に答える
488 参照

c++ - C++ のファイル チャネル

Java には、ファイル チャネルから読み取ることができるFileChannelがあります。読み始めたいチャンネルの位置を設定することもできます。

C++/C で同様の関数はありますか?

0 投票する
1 に答える
559 参照

java - RandomAccessFileオブジェクトの初期化方法を変更すると、FileChannelのパフォーマンスが変わるのはなぜですか?

ディスク上のボトルネックがJavaに書き込むコードを書き直す可能性を調査しています。javadocは、以下の最初の2つのコードループが次の2つのループとは異なるパフォーマンスを示す理由を明確にしていません。

このコードを実行すると、次のようなものが生成されます。

ご覧のとおりc.force(true)、少し遅くなります。RandomAccessFile「rwd」モードを使用すると、速度がさらに低下するのはなぜですか。「rwd」であってc.force(true)はならず、同等です。

0 投票する
1 に答える
644 参照

java - Java FileLock の解放に問題がある

私は nio をあまり使ったことがなく、FileLock の解放に問題があります。基本的に、JVM-A では、次のようなファイルに NON-SHARABLE 書き込みロックがあります。

次に、JVM-B で、同じファイルに次のような SHARABLE 読み取りロックを作成しようとします。

私の問題は、JVM-B が永久にループし、SHARABLE 読み取りロックを取得できないことです。JVM-A が実行writeLock.release(); writeChannel.close();writeFile.close();、JVM-A が終了して実行されなくなったとしても、JVM-B はファイルの SHARABLE 読み取りロックを取得できません。

それで、私はここで何が欠けていますか?

0 投票する
1 に答える
1024 参照

java - FileChannel と ByteBuffer を使用してファイルから Java オブジェクトの文字列プロパティを読み書きする方法

以下は、String を ByteBuffer に入れる方法を示すサンプル クラスです。このようなファイルに文字列を書き込むことはできますが、逆シリアル化するときにタイトルを再度読み取るためにバイト配列のサイズを知る方法がわかりません。

0 投票する
2 に答える
7497 参照

java - どのように待ってファイルをロックするか

他のプログラムが特定のファイルのロックを解除するまで待ってから、そのロック解除されたファイルを開きます。

私は多くの解決策に出くわしましたが、どれも有用ではありません、ここに私のコードがあります-

このコードを実行すると、ファイルは他のWindowsプロセスによってロックされることがわかっているので、他のプロセスがロックを解放するまで待ってから、ロック解除されたファイルに進みます。ロックされたファイルを開こうとするとFileNotFoundException、「」のようになります(The process cannot access the file because it is being used by another process)

channel = new RandomAccessFile(file, "rw").getChannel();上記のコードでは、同じ例外が行 " "でスローされるため、ロックが取得されるのを待つことができません。

これについて私を助けてください、基本的に私は他のプロセスがファイルのロックを解放したという通知を受け取りたいです、そしてその時まで、私はwait()したいです。

0 投票する
1 に答える
234 参照

java - FileChannels を自動的に閉じる方法はありますか?

現在、多数 (60k ~ 100k) の比較的大きなファイルへのランダム アクセスを必要とするアプリケーションを開発しています。ストリームを開いたり閉じたりするのはかなりコストのかかる操作であるため、必要がなくなるまで、最大のファイルの FileChannel を開いたままにしておくことをお勧めします。

問題は、この種の動作が Java 7 の try-with ステートメントでカバーされていないため、すべての FileChannel を手動で閉じる必要があることです。しかし、ソフトウェア全体で同じファイルに同時にアクセスできるため、これはますます複雑になりすぎています。

登録されたパスごとに開いている FileChannel インスタンスを追跡できる ChannelPool クラスを実装しました。次に ChannelPool を発行して、パスが特定の間隔でプール自体によって弱く参照されるだけのチャネルを閉じることができます。私はイベントリスナーのアプローチを好みますが、GC をリッスンする必要もありません。

チャネルを手動で閉じる必要があるため、Apache CommonsのFileChannelPoolは私の問題に対処しません。

この問題に対するよりエレガントな解決策はありますか? そうでない場合、実装をどのように改善できますか?

編集: fgeの答えのおかげで、私は今、まさに必要なものを手に入れました。ありがとう!

0 投票する
0 に答える
333 参照

java - 名前付きパイプに割り当てられたファイル チャネルで transferto/from を使用できます

1 つのプログラムが名前付きパイプから読み取り、読み取ったデータをソケットに書き込むセットアップがあります。別のプログラムがソケットからデータを読み取り、別の名前付きパイプにデータを書き込みます。これは、ノード全体の Linux 上にあります。Java FileChannels で通常の読み取りと書き込みを行うとすべて正常に動作しますが、より効率的にしようとして transferTo を使用してソケットチャネルで名前付きパイプデータを送信すると、transferTo は常に 0 バイトの転送で返されます。データ transferFrom の受信はより決定的です。名前付きパイプでシークを実行しようとすると、例外が発生します (名前付きパイプではシークは許可されません)。私は不可能なことをしようとしていますか?名前付きパイプで transferTo および/または transferFrom を使用して運が良かった人はいますか?

ありがとう。

0 投票する
1 に答える
180 参照

java - FileChannelのIOUtils.closeQuitely

ApacheライブラリメソッドIOUtils.closeQuitelyがFileChannelでうまく機能することを知りたかったのです。引数としてCloseableが必要であり、FileChannelは階層で実装しているようです。しかし、将来的に問題に直面することはできますか。どんな経験でも共有してください。