Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从自定义文件开头写入自定义字节数_Java_Buffer - Fatal编程技术网

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

Java 从自定义文件开头写入自定义字节数,java,buffer,Java,Buffer,如何从具有偏移量的输入流读取数据,并将一定数量的字节写入输出流 例如,目标是从输入流中跳过512字节,并使用512字节的偏移量将1024字节写入输出流,但如果缓冲区本身被定义为4096字节,则也要进行缓冲。使用一种称为自适应缓冲区的技术。例如,首先定义要存储数据的字节数组,以及所需的缓冲区大小: private static final int FS_BUFFER = 4096; private byte[] buff = new byte[FS_BUFFER]; 然后使用下面的代码,我现在将

如何从具有偏移量的输入流读取数据,并将一定数量的字节写入输出流


例如,目标是从
输入流
中跳过512字节,并使用512字节的偏移量将1024字节写入
输出流
,但如果缓冲区本身被定义为
4096
字节,则也要进行缓冲。

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

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

}
在这里,我们首先检查要写入的实际大小是否小于缓冲区本身。如果是,请将从
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;
在这里,我们执行对
输出流的实际写入

因此,这段代码将要做的是,从RandomAccessFile读取到一个
*OutputStream
一定数量的字节,并使缓冲区适应剩余的写入量、文件大小(如果数据量小于缓冲区)或预设的缓冲区。这会在两个
*流之间产生恒定的缓冲数据流

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