将代码分成小块,例如,要读取一个字节块(在您的情况下为 8 个字节),您需要知道 3 件事:
- 在哪个文件中读取
- 从哪里开始阅读
- 要读取多少字节/块的大小
将此视为一个步骤将为您提供一种返回 byte[] 数组的方法,将上述 3 个点作为参数,例如:
private byte[] readByteBlock(InputStream in, int offset, int noBytes) throws IOException {
byte[] result = new byte[noBytes];
in.read(result, offset, noBytes);
return result;
}
下一步是打开文件并为文件中的每个字节块调用此方法。您从位置 0 开始读取文件,调用该方法一次,对结果执行一些操作,然后在位置 = (previousPos) + blockSize 处重新调用它。这段代码可以放在另一种方法中,例如:
public byte[][] toByteArray(File file, int byteBlockSize) throws IOException {
InputStream in = new FileInputStream(file);
long noOfBlocks = (long) Math.ceil((double)file.length() / (double)byteBlockSize);
byte[][] result = new byte[(int)noOfBlocks][byteBlockSize];
int offset = 0;
for(int i = 0; i < result.length; i++) {
result[i] = readByteBlock(in, offset, byteBlockSize);
}
return result;
}
这将返回一个 byte[][] 数组,第一个索引为 byteBlockNumber(前 8 个字节,第二个 8 个字节,第三个 8 个字节,...),第二个索引为每个单独的字节:
byte[0][0]: the first byte block's first byte
byte[0][7]: the first byte block's second byte
byte[1][2]: the second byte block, third byte
etc..
在上面的示例代码中,byte[][] 数组的初始化如下:
long noOfBlocks = (long) Math.ceil((double)file.length() / (double)byteBlockSize);
byte[][] result = new byte[noOfBlocks][byteBlockSize];
因此,块数是文件中的总字节数除以字节块的大小(在您的示例中为 8)。假设文件有 9 个字节并且块大小为 8,这将导致 1,sth 并四舍五入为 1,所以最后一个字节没有空间,这就是为什么 Math.ceil() 用于四舍五入的原因该师给出。Math.ceil(9 / 8) -> 2,这 2 个足以容纳 8 个字节的第一个块,以及第二个块中的最后一个字节。