你能告诉我这两种从输入流中读取字节的方法是做什么的吗?

can you tell me what those 2 methods which reads bytes from an Input stream do?

我正在尝试了解 b+ 树的实现。我不明白这个重载方法到底做了什么。为什么在以 Inputsteam is 作为参数的第一个方法中声明 4 个变量,即 i1、i2、i3 和 i4。在使用ObjectInput in作为参数的第二种方法中,我理解它是returns一个从0到255的字节,为什么结果=251?解释每一行及其作用会很有帮助。

第一种方法:

    public final static int readLuposInt(final InputStream is) throws IOException {
        final int i1 = is.read();
        if (i1 < 0) {
            return i1;
        }
        final int i2 = is.read();
        if (i2 < 0) {
            return i2;
        }
        final int i3 = is.read();
        if (i3 < 0) {
            return i3;
        }
        final int i4 = is.read();
        if (i4 < 0) {
            return i4;
        }
        return (0xFF & i1) | ((0xFF & i2) | ((0xFF & i3) | (0xFF & i4) << 8) << 8) << 8;

}

重载方法:

public final static int readLuposInt(final ObjectInput in) throws IOException {
        final int i0 = in.read();
        if (i0 <= 251){
            return i0;
        }
        int result = 251;
        int offset = 1;
        for (int i = 1; i <= i0 - 251; i++) {
            result += in.read() * offset;
            offset <<= 8;
        }
        return result;
    }

您可以使用 调试器 来找到以下结果。

第一种方法 从输入流中读取一个 4 字节 整数 。它似乎存储为 little-endian 值。

  • 顺序读取字节
  • ff 缺少任何字节,-1 已 returned。
  • 到return的完整整数,由shifting左侧的高位字节进行计算。

示例:

  • 数字2293742表示十六进制数22 FF EE,将倒序存储:0xEE 0xFF 0x22 0x00
  • 现在数据被读取了
    • i1 = 0xEE
    • i2 = 0xFF
    • i3 = 0x22
    • i4 = 0x00
  • 现在计算 return 值:
    • (0xFF & i4) << 8 = (0xFF & 0x00) << 8 = 0x0000
    • ((0xFF & i3) | (0xFF & i4) << 8) << 8) = ((0x22 | 0x0000) << 8) = (0x0022 << 8) = 0x002200
    • ((0xFF & i2) | ((0xFF & i3) | (0xFF & i4) << 8) << 8) << 8 = (0xFF | 0x002200) << 8 = 0x0022FF00
    • (0xFF & i1) | ((0xFF & i2) | ((0xFF & i3) | (0xFF & i4) << 8) << 8) << 8 = 0xEE | 0x0022FF00 = 0x0022FFEE

第二种方法 从流中读取 unicode 字符,编码为 UTF-8 编码。关于 unicode 及其字符编码可以说很多,请参阅 Wikipedia 它是如何工作的。