黑马程序员技术交流社区

标题: 关于RandomAccessFile对象的问题 [打印本页]

作者: 我为你着迷    时间: 2014-12-22 21:17
标题: 关于RandomAccessFile对象的问题
  1. import java.io.*;
  2. class RandomAccessFileDemo
  3. {
  4.         public static void main(String[] args) throws IOException
  5.         {
  6.                         writeText();
  7.                         readText();
  8.         }
  9.         
  10.         public static void readText() throws IOException
  11.         {
  12.                 RandomAccessFile raf=new RandomAccessFile("raf.txt",rw);
  13.                
  14.                 raf.seek(8);//不明白。
  15.                
  16.                 byte[] buf=new byte[4];
  17.                 raf.read(buf);
  18.                 String name=new String(buf);
  19.                 int age=raf.readInt();
  20.                 System.out.println(name);
  21.                 System.out.println(age);
  22.                
  23.                 raf.close();
  24.         }
  25.         
  26.         
  27.         public static void writeText() throws IOException
  28.         {
  29.                 RandomAccessFile  raf=new RandomAccessFile("raf.txt",rw);
  30.                
  31.                 raf.write("李四".getBytes());
  32.                 raf.writeInt(87);
  33.                 raf.write("王五".getBytes());
  34.                 raf.write(97);
  35.                
  36.                 raf.close();
  37.         }
  38. }
复制代码
大家好 你们这句话是怎么理解的?就是改变指针位置的这个方法raf.seek(8);
视频里说是从一个8位往后读,那如果是这样的话那应该不对呀。因为一个字节
是代表一个8位吧,而下边的writeText()功能中写了一个李四和87,这就是8个
字节了呀,所以8个字节应该是64位才对呀,应该是从64位往后才可以读到王五
和97的吧。
所以哪位大神可以帮小的分析下呀  你要多少黑马币我都给你啊!


作者: kerner    时间: 2014-12-22 22:37
本帖最后由 kerner 于 2014-12-22 22:44 编辑

public void seek(long pos)          throws IOException设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。偏移量的设置可能会超出文件末尾。偏移量的设置超出文件末尾不会改变文件的长度。只有在偏移量的设置超出文件末尾的情况下对文件进行写入才会更改其长度。
参数:pos - 从文件开头以字节为单位测量的偏移量位置,在该位置设置文件指针。 抛出: IOException - 如果 pos 小于 0 或者发生 I/O 错误。
  1.         public static void readText() throws IOException
  2.         {
  3.                 RandomAccessFile raf=new RandomAccessFile("raf.txt","rw");
  4.                
  5.                 raf.seek(8);//不明白。
  6.                
  7.                 byte[] buf=new byte[4];
  8.                 raf.read(buf);
  9.                 String name=new String(buf);
  10.                 int age=raf.read(); //readInt()是读四个字节。
  11.                 System.out.println(name);
  12.                 System.out.println(age);
  13.                
  14.                 raf.close();
  15.         }
复制代码



你黑马币真多,有币任性,送我黑马币啊。。。。。。

作者: 我为你着迷    时间: 2014-12-22 22:52
kerner 发表于 2014-12-22 22:37
public void seek(long pos)          throws IOException设置到此文件开头测量到的文件指针偏移量,在该位 ...

后来我又听了一遍视频 因为该对象里边封装的是一个数组,通过指针来操作数组,其实8就是一个角标. 那你说为什么是8*0  8*1  8*2呢   难不成就是为了一个规律嘛  亲
作者: 后悔药    时间: 2014-12-22 22:56
我是来拿黑马币的
作者: kerner    时间: 2014-12-22 23:35
我为你着迷 发表于 2014-12-22 22:52
后来我又听了一遍视频 因为该对象里边封装的是一个数组,通过指针来操作数组,其实8就是一个角标. 那你说 ...

和8没有任何关系啊,
                raf.write("张三".getBytes());         //四个字节
                raf.writeInt(97);                                //四个字节
                raf.write("小强".getBytes());        //四个字节
                raf.writeInt(99);                                //四个字节  一共写入16个字节
           
write(99)只写了一个字节哦
你读出来时,也要按照相应顺序和字节数。
作者: 我为你着迷    时间: 2014-12-23 00:08
kerner 发表于 2014-12-22 23:35
和8没有任何关系啊,
                raf.write("张三".getBytes());         //四个字节
               ...

没看懂你啥意思  write(99)怎么写了一个字节了啊 这不是写了4个字节嘛  
作者: kerner    时间: 2014-12-23 00:13
我为你着迷 发表于 2014-12-23 00:08
没看懂你啥意思  write(99)怎么写了一个字节了啊 这不是写了4个字节嘛

具体要偏移多少和8没有关系,读取的顺序要和你写入顺序相照应。
write(int)是写入一个字节(低8位),writeInt(int)是写入四个字节.
作者: outsider1020    时间: 2014-12-23 11:20
此类的实例支持对随机访问文件的读取和写入.raf.seek(n),将指针掉到需要插入的位置




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