日期:2014-05-20  浏览次数:20882 次

弄了半天居然发现RandomAccessFile是这么一回事?
我本来写了个可以存入信息的地址簿,使用RandomAccessFile类来随机读写.当然可以使用GUI查看.反正说也说不清了.我就直接说下下面的一个测试程序来说明我的问题:

Java code

import java.io.*;

class test {
  public static void main(String[] args) throws IOException{
    RandomAccessFile r = new RandomAccessFile("heihei.txt", "rw");

    r.writeChar('a');
    r.writeChar('b');
    r.writeChar('c');
    //这样文件的内容不就应该是abc了吗?

    r.seek(2); //指针设置在a后.
    r.writeChar('d'); //文件理应变成adbc,但貌似不是这么回事,如下

    StringBuffer strBuf = new StringBuffer();
    r.seek(0); //指针归回初始位置
    strBuf.append(r.readChar()); 
    strBuf.append(r.readChar());
    strBuf.append(r.readChar()); 
    strBuf.append(r.readChar());

    System.out.println(strBuf); //结果是adc
  }
}


居然没有料到RandomAccessFile有自动更新文件的功能,如果你将指针放在文件中间,不是在指针位置插入内容,而是逐步更新内容,此时文件大小不会增加,除非你把指针放在文件末尾.
这也就是我的地址簿出错的原因,如果我在中间插入内容的话,就会出现原来的莫部分丢失的情况.

无语,真的无语,弄了半天才发现原来是这里出了问题.真不知道Java语言开发者的大脑怎么想的.

------解决方案--------------------
哈哈 , 学习了
------解决方案--------------------
这个是当然应该这样设计的!是你自己的用法有问题而已,因为RandonAccessFile的用处就是为了方便移动到相应位置并进行数据修改的。因为一个文件可能经常需要修改内容

至于你想要的插入功能,一般的操作系统都不支持的。因为这个从文件在硬盘上的存储分析就知道插入内容并不是一个简单的操作就可以完成的,实际上都是必须将相应的内容复制才可以完成的。


我好像也没有知道哪种语言可以直接在文件插入一段内容,即使有它内部应该也是将内容复制移动完成的