qq_45143191 2019-07-09 10:06
浏览 275

【求助】代码问题,关于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?顿时迷茫了,有大神帮帮忙,检查一下代码吗?

  • 写回答

0条回答

    报告相同问题?

    悬赏问题

    • ¥15 phython路径名过长报错 不知道什么问题
    • ¥15 深度学习中模型转换该怎么实现
    • ¥15 HLs设计手写数字识别程序编译通不过
    • ¥15 Stata外部命令安装问题求帮助!
    • ¥15 从键盘随机输入A-H中的一串字符串,用七段数码管方法进行绘制。提交代码及运行截图。
    • ¥15 TYPCE母转母,插入认方向
    • ¥15 如何用python向钉钉机器人发送可以放大的图片?
    • ¥15 matlab(相关搜索:紧聚焦)
    • ¥15 基于51单片机的厨房煤气泄露检测报警系统设计
    • ¥15 Arduino无法同时连接多个hx711模块,如何解决?