黑马程序员技术交流社区

标题: 看视频遇到的IO问题,求大神解惑 [打印本页]

作者: ifinver    时间: 2014-10-11 09:53
标题: 看视频遇到的IO问题,求大神解惑
RandomAccessFile类是同时具备读写功能的随机访问文件的类,实现了DataInput接口和DataOutput接口,封装了文件指针,类似c++的File类,可以对任意位置上的字节进行增删改查操作。 我用每20个字节存一个人的信息(姓名和年龄),前16位存姓名,后4位存年龄比如存三个字的姓名时,三个汉字6个字节,整数4字节,所以存储的结果是:0-5字节位上是姓名,6-15字节位没操作过,16-19字节位上是整数。 问题是这样,我取数据的时候,由于不知道这个人的名字是几个汉字,所以就不知道占几个字节,所以只能把0-15字节位上的字节转换成字符串,然而转换后的字符串有乱码,像这样:

请问怎么解决啊。。。

贴下代码。
存储的代码如下
  1.         public static void Write(RandomAccessFile raf) throws IOException{
  2.                 String[] names = {"张小三","李小四","王五"};
  3.                 for(int i = 0;i < names.length;i++){
  4.                         //每20个字节存一个人信息,跳到第i个20字节的位置上写第i个人
  5.                         raf.seek(20*i);
  6.                         //在0-16字节上写入姓名,
  7.                         raf.write(names[i].getBytes());
  8.                         //指针跳到第17个字节上写年龄
  9.                         raf.seek(20*i+16);
  10.                         raf.writeInt(30);//假设都是30岁
  11.                         //问题大约出在这,三个字是6个字节,
  12.                         //所以0-5字节上是姓名,6-15字节上没写过数据,16-19字节上是一个整数
  13.                 }               
  14.         }
复制代码

读取的代码:
  1. public static void Read(RandomAccessFile raf) throws IOException{
  2.                 int count  = 3;       
  3.                 byte[] name = new byte[16];
  4.                 for(int i = 0;i < count;i++){
  5.                         raf.seek(20*i);
  6.                         //读取前16位
  7.                         int len = raf.read(name);
  8.                         //将前16位字节转成字符串
  9.                         String str = new String(name,0,len);
  10.                         System.out.println(str);
  11.                         //读取后4位的整数
  12.                         raf.seek(20*i+16);
  13.                         System.out.println(raf.readInt());
  14.                 }       
复制代码
主函数
  1. public static void main(String[] args) throws IOException {
  2.                 RandomAccessFile raf = new RandomAccessFile("D:\\a.txt","rw");
  3.                 Write(raf);
  4.                 Read(raf);
  5.                
  6.                 raf.close();
  7.                
  8.         }
复制代码







作者: 水竹    时间: 2014-10-11 10:47
本帖最后由 水竹 于 2014-10-11 10:49 编辑


不知你在哪里看到的乱码,反正我在控制台输出没问题。
实在不想看到乱码的话,String类有个trim方法可以去除字符串首尾空格(空白,写错了):
public String trim()返回字符串的副本,忽略前导空白和尾部空白。

作者: ifinver    时间: 2014-10-11 19:09
水竹 发表于 2014-10-11 10:47
不知你在哪里看到的乱码,反正我在控制台输出没问题。
实在不想看到乱码的话,String类有个trim方法可以去 ...

啊 谢谢 你不提醒都忘了trim()了。。
我在Eclipse里面看到的乱码。。我也在cmd控制台试了下,果然没乱码。。。。
0.0




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