gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 10:03:49 25 4
gpt4 key购买 nike

考虑这段代码:

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 字节,直到最后一个try 大于文件本身,然后它会修剪缓冲区并读取剩余的数据。看起来像这样,这是 System.out.println("Writing "+ b);

的输出
Writing 8096
Writing 8096

...

Writing 8096
Writing 8096
Writing 5681

This took 14 ms

现在问题来了,如何复制一定范围的字节?

例如,如果文件长度为 10000 字节,则从 1012 字节到 2134

我写的是一个 tar 实现,其中许多文件通过文件之间的 512 字节 header 相互连接,该 header 描述了 header 后面的字节。

然后我读取 header ,跳过 header 的 512 字节并开始写入文件,直到 header 中指定的 n 字节数据。

如何在不逐字节复制的情况下解决这个问题?

最佳答案

您可以使用BufferedInputStream.skip(long)跳过直到正确的 pos,并读取和写入从 1012 (startPos) 到 2134 (endPos) 的字节数code>),即 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

关于java - 将文件从 n 个字节复制到缓冲的 n 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36606849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com