博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RandomAccessFile 类的使用——基本使用
阅读量:3962 次
发布时间:2019-05-24

本文共 3194 字,大约阅读时间需要 10 分钟。

该类继承的是Object类,而不是任何流类,该类支持读取和写入(读写一体)随机访问文件(这里随机指的是可以自定义位置读写)。

相关方法

//构造方法/*mode模式,常用的有两种:rw打开以便读取和写入; r以只读方式打开*/RandomAccessFile(File file, String mode);RandomAccessFile(String name, String mode);//成员方法,除了以下几个方法,可以在read和write加上基本类型的符号,表示针对某一类型进行读写int read(); //读取一个数据字节String readLine(); String readUTF(); //读取字符串void readFully(byte[] b);void readFully(byte[] b, int off, int len);void write(int b);void writeUTF(String str);//返回文件长度,返回值是longlong length();//自定义读取,根据16进制字节码设置指针 偏移【量】,默认是以十六进制字节码的开头位置位参照void seek(long pos); //从当前位置跳过字节int skipBytes(int n);

注意事项

写入和读取的数据类型的顺序必须一一对应,顺序不可以变化

//写入封装方法public static void write() throws Exception{
//1创建对象 RandomAccessFile raf=new RandomAccessFile("ran.txt", "rw"); //2写入 raf.writeUTF("张三"); ---------------------------------------| raf.writeInt(20); ----------------------------------------| raf.writeDouble(170.5); | raf.writeBoolean(true); | | raf.writeUTF("李四"); | raf.writeInt(22); | raf.writeDouble(180.5); | raf.writeBoolean(false); | | //3关闭 | raf.close(); | System.out.println("写入完毕"); |} |//读取封装方法 |public static void read() throws Exception{
| //1创建对象 | RandomAccessFile raf=new RandomAccessFile("ran.txt", "r"); | | //2读取 | String name = raf.readUTF(); ------------------------------------| int age = raf.readInt(); ----------------------------------------| double height = raf.readDouble(); boolean b = raf.readBoolean(); System.out.println(name+" "+age+" "+height+" "+b); //3关闭 raf.close();}//该方式读取的还是张三的信息,如果需要读取李四的信息,则需要使用seek()或者skipBytes()方法

seek()和skipBytes()方法的执行过程和区别

执行原理分析

//同样以上面的代码为例,将写入的文件使用 EditPlus 打开,并使用Hx十六进制查看文件信息,如下:00 06 E5 BC A0 E4 B8 89  00 00 00 14 40 65 50 0000 00 00 00 01 00 06 E6  9D 8E E5 9B 9B 00 00 0016 40 66 90 00 00 00 00  00 00 /** 【00 06】表示的是占位6个字节的字符串,说明其后的6个位置【E5 BC A0 E4 B8 89】表示“张三”*  Int占4个字节,所以【00 00 00 14】表示的是年龄age,14的十六进制转十进制就是20*  同理,double类型占位8个字节,【40 65 50 00 00 00 00 00】表示170.5,最后的【01】表示true*  综上所述,seek要定位在李四位置,即【00 06】的位置,相当于开头的【00】位置,偏移【量】为21*/raf.seek(21);raf.skipBytes(21);

两种方法的区别

/** seek()方法,是指针的偏移量,始终以开头位置为参照,所以如下的代码不会报错*/raf.seek(21);raf.seek(21);/*** skipBytes()方法是跳过,始终以前一个位置为参照,所以会出现EOF Exception,读取到文件末尾的异常*/raf.skipBytes(21);raf.skipBytes(21);

使用 readFully() 方法完成复制操作案例

public class TextDemo01 {
public static void main(String[] args) throws Exception {
RandomAccessFile file = new RandomAccessFile("file.txt", "rw"); file.writeUTF("这是一个UTF字符串"); file.writeBoolean(true);// 占1个字节 file.writeShort(395);// 占2个字节 file.writeLong(2325451l);// 占8个字节 System.out.println("——————文件复制(从file到fileCopy)——————"); file.seek(0);//从开头位置读取 RandomAccessFile fileCopy = new RandomAccessFile("fileCopy.txt", "rw"); int len = (int) file.length();// 取得文件长度,返回值是long,注意转型 byte[] b = new byte[len]; //全部读取 file.readFully(b); fileCopy.write(b); System.out.println("复制完成!"); }}

转载地址:http://bxgzi.baihongyu.com/

你可能感兴趣的文章
[HTML5] 关于HTML5(WebGL)的那点事
查看>>
自我反思
查看>>
初识网络编程
查看>>
东北赛选拔教训
查看>>
hash
查看>>
涨姿势了:求两个分子的最大公倍数
查看>>
快速幂
查看>>
vector.reserve and resize &&vector与map结合
查看>>
最长公共子序列
查看>>
计算几何
查看>>
求解方程
查看>>
太弱了。。水题
查看>>
位运算(含应用)
查看>>
野指针与空指针
查看>>
图文混排效果
查看>>
urllib2.urlopen超时问题
查看>>
魏兴国:深入浅出DDoS攻击防御
查看>>
使连续的参考文献能够中间用破折号连起来
查看>>
Discover Feature Engineering, How to Engineer Features and How to Get Good at It
查看>>
36辆车,6条跑道,无计时器,最少几次比赛可以选出前三
查看>>