黑马程序员技术交流社区

标题: 一个RandomAccessFile的问题 [打印本页]

作者: lygku    时间: 2015-7-14 18:12
标题: 一个RandomAccessFile的问题
毕老师的视频中关于RandomAccessFile介绍,代码如下:
我插入了几个条数据,第一条姓名是三个字,占六个字节,标红的位置代表读取的一次读取的数组长度,其中写6才会正常读取,包括后面的年龄,也会正常显示,但是写其他数字都不行,大于6的 ,显示 李阿四5僐?,明显把后面数字读进去了,小于6呢,比如写4 ,姓名正常被截取前两个,但是年龄显示:-876333693.,接口就是只要数组长度等于姓名字节长度就正常,其他都不行,但是一定要固定数组长度吗,我想着是用户的姓名是不固定的,怎么能固定长度呢,感觉不靠谱啊


class CollectionsDemo {

                        public static void main(String[] args) throws IOException,EOFException{

                                                 writeFile();
                                                 readFile();

                                                       
                                                        
}

                  public static  void readFile()throws IOException,EOFException{
                         
                          RandomAccessFile raf = new RandomAccessFile("demo.txt","r");
                          byte[] buf = new byte[10];
                          raf.read(buf);
                         
                          String name = new String(buf);
                          int age = raf.readInt();               
                          System.out.println(age+"...."+name);
                          raf.close();       
                  }

public static void writeFile()throws IOException{

                          RandomAccessFile raf = new RandomAccessFile("demo.txt","rw");

                          raf.write("李阿四".getBytes());

                          raf.writeInt(897798798)       
                          raf.write("王五".getBytes());
                          raf.writeInt(33);
                          raf.close();                
                  }


}


作者: a12366456    时间: 2015-7-14 18:12
当然不靠谱,原因是无论write()方法还是writeInt()方法写入到文本文件中时,都是字节型数据按照文件编码格式编码后的字符,write()方法是写入字节数组的长度字节的数据,writeInt()方法则一次固定写入4字节长度的数据,当你反过来读这个文本文件时,这个时候这个文本文件对于你来说全部内容都是字符,数字也是字符,然后按照一定的编码把字符再翻译回字节型数组,你再调用read()方法或者readInt()方法时,操作的就是这个字节数组,如果是read()方法就会根据你的字节数组的长度,从上次读取结尾的下一字节开始读取这么长字节的数据,按照一定编码格式翻译成字符,如果是readInt()方法就从上次读取结尾的下一字节开始固定读取四个字节的数据,翻译成一个int型整数。并不是说read()方法就读取数据中的字符型数据,readInt就读取数据中的int型数据。包括readLong()等方法都是从上次读取结尾的下一字节开始,只是读取的字节长度不同,翻译成的数据类型不同。当你read()方法的字节数组长度不等于你写入的字符串的长度时,翻译出的字符肯定会错,而且影响后面readint()方法,因为读取开始的字节位置跟着前面也错了,翻译出的数字也会出错。所以,当你写三个汉字时,字节数组长度只有为6时,才不会出错。如果想实现读取age、name属性的效果,就应该使用像XML、JSON等等这种有结构的数据文件
作者: as604049322    时间: 2015-7-17 22:08
byte[] buf = new byte[10];
raf.read(buf);
把897798798当2个汉字读了
你一次读了10个字节,,
作者: lygku    时间: 2015-7-21 14:55
a12366456 发表于 2015-7-18 01:21
当然不靠谱,原因是无论write()方法还是writeInt()方法写入到文本文件中时,都是字节型数据按照文件编码格 ...

明白了 谢谢
作者: 加多宝    时间: 2015-7-22 21:58
张冠李戴王五
作者: teng13114    时间: 2016-1-16 09:58
学到了。太棒了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2