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条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥100 Jenkins自动化部署—悬赏100元
    • ¥15 关于#python#的问题:求帮写python代码
    • ¥20 MATLAB画图图形出现上下震荡的线条
    • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
    • ¥15 perl MISA分析p3_in脚本出错
    • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
    • ¥15 ubuntu虚拟机打包apk错误
    • ¥199 rust编程架构设计的方案 有偿
    • ¥15 回答4f系统的像差计算
    • ¥15 java如何提取出pdf里的文字?