从自定义文件开始写入自定义字节数

时间:2016-04-14 23:12:08

标签: java buffer

如何从带有偏移量的输入流中读取并将一定数量的字节写入输出流?

例如,目标是从InputStream跳过512字节,用512字节偏移写入1024字节到OutputStream,如果缓冲区本身被定义,也可以缓冲为4096个字节。

1 个答案:

答案 0 :(得分:0)

使用称为自适应缓冲区的技术。例如,首先定义一个字节数组来存储数据,以及所需的缓冲区大小:

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

然后使用此代码,我现在将解释:

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);

}

让我们打破代码:

int maxBuf = FS_BUFFER > size ? size : FS_BUFFER;

这里我们首先检查要写入的实际大小是否小于缓冲区本身。如果是,则将要从RandomAccessFile读取的最大字节数设置为文件大小,以便一次性从磁盘读取文件。

如果所需的字节数大于缓冲区,只需使用缓冲区大小作为要读取的最大字节数。

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;

现在我们检查一下,如果剩下要读取的字节数小于缓冲区,如果是,我们将下一次传递的最大字节数设置为剩余的读取字节数。 / p>

bufferedOutputStream.write(buff, 0, b);

在这里,我们对OutputStream进行实际写作。

那么,这段代码会做什么,从RandomAccessFile读取到*OutputStream一定数量的字节,并使缓冲区适应剩余的写入量,文件大小本身就是数据量小于缓冲区或预设缓冲区。这导致两个*Streams

之间的缓冲数据流不变