考虑以下代码:
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("/home/gala/falken_test/test_file"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("/home/gala/falken_test/out"));
int b;
byte[] buff = new byte[8096];
while ((b = bufferedInputStream.read(buff)) > -1) {
bufferedOutputStream.write(buff, 0, b);
System.out.println("Writing " + b);
}
bufferedInputStream.close();
bufferedOutputStream.close();
这将文件从点a(bufferedInputStream
)复制到点B(bufferedOutputStream
),每次8096
个字节,直到最后一次尝试大于文件本身,然后修剪缓冲区并读取剩余数据。这看起来像这样,这是System.out.println("Writing " + b);
的输出
Writing 8096
Writing 8096
...
Writing 8096
Writing 8096
Writing 5681
This took 14 ms
现在问题来了,我如何复制一定范围的字节?
例如,从1012
字节到2134
,如果文件例如为10000
字节长。
我正在写的是一个tar实现,其中许多文件被一个接一个地连接起来,它们之间有一个512
字节的头,它描述了头后面的字节。
然后我读取标题,跳过512字节的标题并开始写入文件,直到标题中指定了n字节的数据。
如何在不逐字节复制的情况下解决此问题?
您可以使用BufferedInputStream.skip(long)
跳到正确的位置,读取和写入从1012
(startPos
)到2134
(endPos
)的字节数,即2134-1012=1122
字节。
注意:我将缓冲区大小改为512,以显示它如何与示例位置配合使用。
BufferedInputStream bufferedInputStream = new BufferedInputStream(new FileInputStream("test_file"));
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new FileOutputStream("test_out"));
int CHUNK_SIZE = 512; // change to 8096
int startPos = 1012;
int endPos = 2134;
int bytesToRead = endPos - startPos;
int b;
byte[] buff = new byte[CHUNK_SIZE];
bufferedInputStream.skip(startPos - 1);
int currentChunkSize = Math.min(CHUNK_SIZE, bytesToRead);
while ((b = bufferedInputStream.read(buff, 0, currentChunkSize)) != -1) {
bufferedOutputStream.write(buff, 0, b);
System.out.println("Writing " + b);
bytesToRead -= b;
if (bytesToRead == 0) {
break;
}
currentChunkSize = Math.min(CHUNK_SIZE, bytesToRead);
}
bufferedInputStream.close();
bufferedOutputStream.close();
其输出为:
$ java -cp ReadWriteTest
Writing 512
Writing 512
Writing 98