将文件从n个字节复制到n个缓冲字节

  • 本文关键字:字节 缓冲 复制 文件 java
  • 更新时间 :
  • 英文 :


考虑以下代码:

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)跳到正确的位置,读取和写入从1012startPos)到2134endPos)的字节数,即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

最新更新