正在做一个交作业用的本地小型数据库,在删除属性的部分,听老师的建议把原来的内容用新内容覆盖。但在关于定长写入读取的部分有了错误。代码如下
写入部分:
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?顿时迷茫了,有大神帮帮忙,检查一下代码吗?