【求助】代码问题,关于RandomAccessFile类的定长写入读取

正在做一个交作业用的本地小型数据库,在删除属性的部分,听老师的建议把原来的内容用新内容覆盖。但在关于定长写入读取的部分有了错误。代码如下
写入部分:

for (int i = 0; i < num; i++) {//写入定长属性名
                randoms.writeBytes(RandomAccessFiles.format(attris[i], 20, attris[i].length()));
            }
            randoms.write("\r\n".getBytes());
            for (int i = 0; i < num; i++) {//写入定长类型
                randoms.writeBytes(RandomAccessFiles.format(types[i], 10, types[i].length()));
            }
            randoms.write("\r\n".getBytes());
            for (int i = 0; i < num; i++) {//写入长度
                randoms.writeInt(length[i]);
            }
            randoms.write("\r\n".getBytes());
            for (int i = 0; i < num; i++) {//写入是否主键
                randoms.writeBoolean(key[i]);
            }
            randoms.write("\r\n".getBytes());
            for (int i = 0; i < num; i++) {//写入是否允许空值
                randoms.writeBoolean(isnull[i]);
            }
            randoms.write("\r\n".getBytes());
            randoms.close();

这是读取和替换的部分,指针位置是没问题的。value里保存删除后的新内容,最后一并写入

            int x = 0;
            byte[] b = new byte[20];
            for (int i = 0; i < num; i++) {
                random.read(b, 0, 20);
                if (new String(b).trim().equals(attri)) {       //查找属性名
                    x = i;
                }else {
                    value.append(new String(b));
                }
            }
            random.readLine();//将换行符读掉
            value.append("\r\n");
            s = random.readLine();//类型组
            System.out.println(s.length());
            System.out.println(s);
            s = s.substring(0 ,x*10) + s.substring((x + 1)*10, s.length());   //数据类型
            //System.out.println(s);
            value.append(s + "\r\n");
            s = random.readLine();
            System.out.println(s.length());
            s = s.substring(0 ,x*4) + s.substring((x + 1)*4, s.length());   //数据长度
            //System.out.println(s);
            value.append(s + "\r\n");
            s = random.readLine();
            System.out.println(s.length());
            s = s.substring(0, x) + s.substring(x + 1, s.length());     //是否key
            //System.out.println(s);
            value.append(s + "\r\n");
            s = random.readLine();
            System.out.println(s.length());
            s = s.substring(0, x) + s.substring(x + 1, s.length());     //是否null
            //System.out.println(s);
            value.append(s + "\r\n");

因为属性组、长度组、标志组都是定长的,删除的时候也只要定长搜索到要删除的属性是第几个,然后用substring方法就可以越过被删除的数据。但是后续测试中发现,substring方法偶尔会出现越界、偶尔不会,但删除了非对应属性的类型。尤其在读取长度那里,用readline方法读取后输出长度,(测试时输入了4个属性,writeInt应该写入四个4字节长度),竟然是9?顿时迷茫了,有大神帮帮忙,检查一下代码吗?

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问