黑马程序员技术交流社区
标题:
一个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