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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 亦金亦水 中级黑马   /  2014-7-10 11:26  /  801 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

import java.io.*;
/*
* RandomAccessFile 随机读取访问
* 这类不算是IO体系中的子类
* 而是直接继承自Object,但是他是IO包中的成员,因为他具备读和写的功能
* 内部封装了一个数组,而且通过指针对数组中的元素进行操作
* 可以通过getFilePointer获取指针位置,同时可以通过Seek 改变指针的位置
*
* 其实完成读写的原理就是内部封装了,字节输入流和输出流
*
* 通过构造函数可以看出,该类值能操作文件,而且操作文件还有模式
* 模式:只读r, 读写:rw
* 如果模式为r,不会创建文件,会去读取一个已存在的文件,如果该文件不存在,则会出现异常。
* 如果模式为rw的话,而且该对象的构造函数要操作的文件不存在,会自动创建,如果存在,则不会覆盖
*
* */
public class RandomAccessFile_demo {
        public void RandomAccessFile_demo1() throws IOException{
                RandomAccessFile w = new RandomAccessFile("rd.txt","rw");
                w.write("李四".getBytes());//写入了四个字节,两个汉字,一个汉字占两个字节
                w.writeInt(98);/*此处写年龄时需要用writeInt方法,如果使用write方法,根据帮助文档,write是按照一个字节写入文件的方法
                98在一个字节之内,但是如果是258,则超过了一个字节,258转换二进制的后八位,并根据GBK表找对应的符号
                所以此处应该使用writeInt方法,按照四个字节写入文件
                */
                w.write("王五".getBytes());
                w.writeInt(120);
               
                w.seek(8*3);//将指针放在数组第8*3个位置,及以下操作从这个位置进行,意思是,上面写的李四、王五,加上年龄,一共是占了2*8个字节
                //效果是,王五和李四之间,空了8个字节,这就是该类的随机读写特有方法
                //效果:李四   b王五   x        张三   ?
                //w.seek(8*0),如果此处从8*0个位置开始写,则会把李四、98覆盖,这个方法的特有方式是指针可以前后移动,
                //相反,skipByte(8)方法,则是跳过8个字节,后进行读写操作,但是跳过后,就不能会跳了,指针无法往回移动。
                w.write("张三".getBytes());
                w.writeInt(170);
                w.close();
        }
        public void RandomAccessFile_demo2() throws IOException{
                RandomAccessFile r = new RandomAccessFile("rd.txt","rw");
                r.seek(8*3);//根据测试例子,从数组的第8*3的位置读取,即读出的是 张三 170
                byte[] bt = new byte[4];
               
                r.read(bt);//将文件读取,放到bt数组中,由于测试例子,李四是四个字节,所以此处读取bt.lengh的长度的数据存在四个字节数组中
                String name = new String(bt);//将存满的bt数组,转换成字符串
                System.out.println("name = "+name);//输出字符串
               
                int age = r.readInt();//根据测试例子,然后读取一个32位整数,即4个字节,由于之前存放的年龄就是四个字节,此处取出的是年龄
                System.out.println("age = "+age);
                r.close();
        }

}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马