2010-11-22 5 views
0

ベスト/高速メソッドを表示してください。Javaバイナリファイルをロードする

1)非常に小さいバイナリファイルをメモリにロードしています。例えば、アイコン。

2)サイズが512Mb +の非常に大きなバイナリファイルの読み込み/読み込み。たぶん私はメモリマップされたIOを使用する必要がありますか?

3)サイズ/スピードについて考える必要はありませんが、すべてのバイトをメモリに読み込みます。

ありがとうございます!

P.S.多分簡単な質問を申し訳ありません。それを閉じないでください)

P.S.2。 C#のアナログ質問のMirror;メモリについては

答えて

5

がファイルをマッピングし、JavaはNIOパッケージを持っていますMemory Mapped Files

は小さなファイルのバイトストリームクラスをチェックアウト:Byte Stream

大きなファイルのためのバッファリングI/Oチェックアウト:Buffered Stream

2

小さなファイルをメモリに読み込む最も簡単な方法は次のとおりです。

// Make a file object from the path name 
File file=new File("mypath"); 
// Find the size 
int size=file.length(); 
// Create a buffer big enough to hold the file 
byte[] contents=new byte[size]; 
// Create an input stream from the file object 
FileInputStream in=new FileInutStream(file); 
// Read it all 
in.read(contents); 
// Close the file 
in.close(); 

実生活では、 I/Oエラーの場合には、いくつかのtry/catchブロックが必要です。

大きなファイルを読んでいる場合は、避けることができれば、一度にすべてをメモリに読み込まないことを強くお勧めします。それを読んでチャンクで処理します。これは非常にまれなアプリケーションで、メモリ内に500MBのファイルをまとめて保持する必要があります。

JavaではメモリーマップI/Oはありません。それが必要な場合は、本当に大きなバイト配列を作成するだけです。

+1

一度にすべて読むことをお勧めしません。私はDataInputyStream.readFully()を使用することをお勧めします。 –

+1

JDK 1.4以降ではnioを提供しています.MappedByteBufferはメモリマップされたI/Oとして動作するはずです。 – secmask

+1

さて、私はそのクラスに精通していませんでした。 I/Oポートがマジックメモリの場所にマップされていた私の前のWindowsの時代に、少なくとも私がこの言葉を理解したように、実際にはメモリマップされたI/Oではありません。これは、シミュレートされた配列マップI/Oによく似ています。しかし、何でも。それはあなたのために働く場合、クール。 – Jay

関連する問題