A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 我为你着迷 金牌黑马   /  2014-12-22 21:17  /  1048 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  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的吧。
所以哪位大神可以帮小的分析下呀  你要多少黑马币我都给你啊!

7 个回复

倒序浏览
本帖最后由 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.         }
复制代码



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

评分

参与人数 1黑马币 +20 收起 理由
我为你着迷 + 20 你把API文档里的内容给我撸下来了!!!!.

查看全部评分

回复 使用道具 举报
kerner 发表于 2014-12-22 22:37
public void seek(long pos)          throws IOException设置到此文件开头测量到的文件指针偏移量,在该位 ...

后来我又听了一遍视频 因为该对象里边封装的是一个数组,通过指针来操作数组,其实8就是一个角标. 那你说为什么是8*0  8*1  8*2呢   难不成就是为了一个规律嘛  亲
回复 使用道具 举报
我是来拿黑马币的

评分

参与人数 1黑马币 +10 收起 理由
我为你着迷 + 10 淡定

查看全部评分

回复 使用道具 举报
我为你着迷 发表于 2014-12-22 22:52
后来我又听了一遍视频 因为该对象里边封装的是一个数组,通过指针来操作数组,其实8就是一个角标. 那你说 ...

和8没有任何关系啊,
                raf.write("张三".getBytes());         //四个字节
                raf.writeInt(97);                                //四个字节
                raf.write("小强".getBytes());        //四个字节
                raf.writeInt(99);                                //四个字节  一共写入16个字节
           
write(99)只写了一个字节哦
你读出来时,也要按照相应顺序和字节数。
回复 使用道具 举报
kerner 发表于 2014-12-22 23:35
和8没有任何关系啊,
                raf.write("张三".getBytes());         //四个字节
               ...

没看懂你啥意思  write(99)怎么写了一个字节了啊 这不是写了4个字节嘛  
回复 使用道具 举报
kerner 中级黑马 2014-12-23 00:13:11
7#
我为你着迷 发表于 2014-12-23 00:08
没看懂你啥意思  write(99)怎么写了一个字节了啊 这不是写了4个字节嘛

具体要偏移多少和8没有关系,读取的顺序要和你写入顺序相照应。
write(int)是写入一个字节(低8位),writeInt(int)是写入四个字节.

评分

参与人数 1黑马币 +20 收起 理由
我为你着迷 + 20 很给力!

查看全部评分

回复 使用道具 举报
此类的实例支持对随机访问文件的读取和写入.raf.seek(n),将指针掉到需要插入的位置
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马