2016-04-14 15 views
0

入力ストリームからオフセットを読み取り、出力ストリームに特定のバイト数を書き込む方法を教えてください。ファイルのカスタム開始からカスタムバイト数への書き込み

たとえば、InputStreamから512バイトをスキップし、512バイトのオフセットを使用してOutputStreamに書き込みますが、バッファ自体が4096バイトと定義されている場合はバッファリングされます。

答えて

0

適応バッファと呼ばれる手法を使用します。

int size = 1024; // the desired length of bytes 
raf.seek(512); // the desired input file offset 

RandomAccessFile raf = new RandomAccessFile(/* File here */ , "r"); 
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(/* output stream here */); 

int maxBuf = FS_BUFFER > size ? size : FS_BUFFER; 

for (int b, written = 0, left; (b = raf.read(buff, 0, maxBuf)) > 0;) { 

    written += b; 
    left = size - written; 

    maxBuf = left < FS_BUFFER ? left : FS_BUFFER; 
    bufferedOutputStream.write(buff, 0, b); 

} 

ダウンコードを破ることができます:

private static final int FS_BUFFER = 4096; 
private byte[] buff = new byte[FS_BUFFER]; 

は、私は今、説明するこのコードを使用する:例えば、最初にデータを格納するバイト配列、及び所望のバッファサイズを定義:

int maxBuf = FS_BUFFER > size ? size : FS_BUFFER; 

ここでは、書き込む実際のサイズがバッファそのものより小さいかどうかを確認します。そうである場合は、RandomAccessFileから読み取る最大バイト数をファイルサイズに設定して、ファイルが1回のパスでディスクから読み取られるようにします。

希望のバイト数がバッファより大きい場合は、読み込む最大バイト数としてバッファサイズを使用します。

for (int b, written = 0, left; (b = raf.read(buff, 0, maxBuf)) > 0;) 

ここでは、バイトの整数、書き込まれるデータの量、書き込むデータの量を定義します。次に、RandomAccessFileから読み込み、一度に読み込む最大バイト数をmaxBufとし、ファイルサイズとバッファサイズに基づいて定義したバイトをバッファに格納します。

written += b; 
left = size - written; 

ここでは、書き込むバイト数と、パス後に読み込むバイト数を計算します。

maxBuf = left < FS_BUFFER ? left : FS_BUFFER; 

ここチェックバイト数がバッファよりも小さい読み取るために放置した場合、それがある場合、我々は今、我々は左バイトの量に次のパスのために読み出されるバイトの最大数を設定します読む。

bufferedOutputStream.write(buff, 0, b); 

ここでは、OutputStreamへの実際の書き込みを行います。

これは、RandomAccessFileから特定のバイト数の*OutputStreamに読み込まれ、書き込む量、ファイルサイズ自体、またはデータ量がバッファ、またはプリセットバッファ。これにより、2つの間でバッファリングされたデータストリームが一定になります。*Streams

関連する問題