バイト配列にインポートするファイルの一部を読み取る方法はありますか?ファイルの一部をJavaのバイト配列にコピーする
ファイル全体をバイト配列に変換する方法しか見つからないため、非常に重いメモリが必要です。
バイト配列にインポートするファイルの一部を読み取る方法はありますか?ファイルの一部をJavaのバイト配列にコピーする
ファイル全体をバイト配列に変換する方法しか見つからないため、非常に重いメモリが必要です。
私はRandomAccessFile
を使用したい:
public static byte[] readFileSegment(File file, long index, int count) {
RandomAccessFile raf = new RandomAccessFile(file, "r");
byte[] buffer = new byte[count];
try {
raf.seek(index);
raf.readFully(buffer, 0, count);
return buffer;
} finally {
raf.close();
}
}
あり、メモリマップファイル、NIOなどで他の選択肢がある - しかし、これは簡単でなければなりません。
RandomAccessFile、またはskipでFileInputStreamを使用できます。
私のお気に入りは、それだけであなたが使用しているものをメモリにロードし、ほとんどのヒープを使用しないように、メモリマップファイルを使用することです(関係なく、あなたが使用してどのくらいの)
確かに - あなたは、あなたと同じようにほぼ同じ手順を実行しますファイル全体をバイト配列に読み込みます。ただし、配列に追加するのではなく、ファイルの一部を破棄します。
これは、セクションの境界をどのように検出するかという非常に関連性の高い問題を提起します。特定のセンチネルバイト(例:11111111
)のようなものなら、これは簡単です。いくつかの固定オフセットが必要な場合は、最初のnバイトを破棄し、次のように保存してください。mバイトを保存するとさらに簡単です。
バイトシーケンスの何らかの種類が検出されている場合は、それまでにマッチした部分のローカル変数を維持する必要があるため、少し複雑になります。一致しない場合は破棄します配列全体が一致すると判明した場合は、配列全体または出力にすべてを追加します。
しかし、コンセプトは簡単です。すべてをロードしている場合と同じようにファイルからバイトを読み込みますが、実際には出力配列に入れてください欲しいです。
これは実際に私は特定のバイトサイズまでのファイルの先頭部分を取得するために必要な方法で私の仕事:
try
{
int myDesiredCapacity = 100000; // 100KB
FileInputStream is = new FileInputStream(otherFile);
FileChannel fileChannel = is.getChannel();
ByteBuffer byteBuffer = ByteBuffer.allocate(myDesiredCapacity);
byte[] bytes;
int byteCount = fileChannel.read(bb);
if(byteCount >= 0)
{
bb.flip();
bytes = bb.array();
FileOutputStream fileOutputStream = new FileOutputStream(targetFile);
fileOutputStream.write(bytes);
fileOutputStream.close();
bb.clear();
}
}
catch(IOException e)
{
e.printStackTrace();
}
をあなたは二番目のパラメータ欠けている:のRandomAccessFileのRAF =新しいのRandomAccessFile(ファイルを、 "r"); –
また、intではなくlongをサポートする必要があります。ここに私のバージョンがあります:http://tinybrain.de/1006742 –
@StefanReich:両方とも、ありがとう。 (私は '長い'エンドポイントを提供するのではなく、 'count'の3番目のパラメータを保持しています)。 –