javaIO-RandomAccessFile类


12.2  RandomAccessFile类

File类只是针对文件本身进行操作,而如果要对文件内容进行操作,则可以使用RandomAccessFile类,此类属于随机读取类,可以随机地读取一个文件中指定位置的数据,例如,现在假设在文件中保存了以下3个数据:

zhangsan,30。

lisi,31。

wangwu,32。

那么如果使用RandomAccessFile类读取"lisi"信息时,就可以将"zhangsan"的信息跳过,相当于在文件中设置了一个指针,根据此指针的位置进行读取。但是如果想实现这样的功能,则每个数据的长度应该保持一致,所以在设置姓名时应统一设置为8位,数字为4位,如图12-4所示。

 
(点击查看大图)图12-4  数据的保存

要实现功能,则必须依靠RandomAccess中的几种设置模式,然后在构造方法中传递此模式。此类的常用操作方法如表12-2所示。

表12-2  RandomAccessFile类的常用操作方法

序号

    

类型

    

1

public RandomAccessFile(File

file,String mode) throws FileNotFoundException

构造

接收File类的对象,

指定操作路径,但是在

设置时需要设置模式,

r为只读;w为只写;

rw为读写

2

public RandomAccessFile(String name,String 
mode) throws FileNotFoundException

构造

不再使用File类对象

表示文件,而是直

接输入了一个固定

的文件路径

3

public void close() throws IOException

普通

关闭操作

4

public int read(byte[] b) throws IOException

普通

将内容读取到一个byte数组中

5

public final byte readByte() throws IOException

普通

读取一个字节

6

public final int readInt() throws IOException

普通

从文件中读取整型数据

7

public void seek(long pos) throws IOException

普通

设置读指针的位置

8

public final void writeBytes(String s) throws 
IOException

普通

将一个字符串写入到文件中,

按字节的方式处理

9

public final void writeInt(int v) throws 
IOException

普通

将一个int型数据写入文件,

长度为4位

10

public int skipBytes(int n) throws IOException

普通

指针跳过多少个字节

需要注意的是,如果使用rw方式声明RandomAccessFile对象时,要写入的文件不存在,系统将自动进行创建。

12.2.1  使用RandomAccessFile类写入数据

下面写入12.2节的3个数据,为了保证可以进行随机读取,所以写入的名字都是8个字节,写入的数字是固定的4个字节。

范例:写文件

  
  
  1. package org.lxh.demo12.randomaccessdemo;  
  2. import java.io.File;  
  3. import java.io.RandomAccessFile;  
  4. public class RandomAccessFileDemo01 {  
  5.     // 直接抛出异常,程序中可以不用再分别处理  
  6.     public static void main(String[] args) 
    throws Exception {   
  7.         File f = new File("d:" + File.separator + 
    "test.txt"); // 指定要操  
  8. 作的文件  
  9.         RandomAccessFile rdf = null ;       // 
    声明一个RandomAccessFile类对象
     
  10.         rdf = new RandomAccessFile(f,"rw");// 
    以读写方式打开文件,会自动创建新
     
  11. 文件  
  12.         String name = null ;  
  13.         int age = 0 ;  
  14.         name = "zhangsan" ;              
    // 字符串长度为8  
  15.         age = 30 ;                       
    // 数字长度为4  
  16.         rdf.writeBytes(name);            
    // 将姓名写入文件之中  
  17.         rdf.writeInt(age) ;              
    // 将年龄写入文件之中  
  18.         name = "lisi    " ;             
    // 字符串长度为8  
  19.         age = 31 ;                     
    // 数字长度为4  
  20.         rdf.writeBytes(name);         
    // 将姓名写入文件中  
  21.         rdf.writeInt(age) ;          
    // 将年龄写入文件中  
  22.         name = "wangwu  " ;           
    // 字符串长度为8  
  23.         age = 32 ;                    
    // 数字长度为4  
  24.         rdf.writeBytes(name);         
    // 将姓名写入文件中  
  25.         rdf.writeInt(age) ;          
    // 将年龄写入文件中  
  26.         rdf.close() ;                
    // 关闭文件   
  27.     }  
写完后可以直接通过RandomAccess的方式进行随机读取。


12.2.2  使用RandomAccessFile类读取数据

读取时直接使用r的模式即可,以只读的方式打开文件。

读取时所有的字符串只能按照byte数组的方式读取出来,而且所有的长度是8位。

范例:随机读取

  
  
  1. package org.lxh.demo12.randomaccessdemo;  
  2. import java.io.File;  
  3. import java.io.RandomAccessFile;  
  4. public class RandomAccessFileDemo02 {  
  5.     // 直接抛出异常,程序中可以不用再分别处理  
  6.     public static void main(String[] args) 
    throws Exception {   
  7.         File f = new File("d:" + File.separator 
    "test.txt");// 指定要操作  
  8. 的文件  
  9.         RandomAccessFile rdf = null ;       
    // 声明一个RandomAccessFile  
  10. 类对象  
  11.         rdf = new RandomAccessFile(f,"r") ; 
    // 以读方式打开文件,会自动创建  
  12. 新文件  
  13.         String name = null ;  
  14.         int age = 0 ;  
  15.         byte b[] = new byte[8] ;           
    // 准备空间读取姓名  
  16.         rdf.skipBytes(12) ;  
  17.         for (int i = 0; i < b.length; i++) {  
  18.             b[i] = rdf.readByte();         
    // 循环读取出前8个内容  
  19.         }  
  20.         name = new String(b) ;            
    // 将读取出来的byte数组变为String  
  21.         age = rdf.readInt() ;             
    // 读取数字  
  22.         System.out.println("第二个人的信息 
    --> 姓名:"
     + name + ";年龄:" + age) ;  
  23.         rdf.seek(0) ;                     
    // 指针回到文件的开头  
  24.         b = new byte[8] ;                   
    // 准备空间读取姓名  
  25.         for (int i = 0; i < b.length; i++) {  
  26.             b[i] = rdf.readByte();       
    // 循环读取出前8个内容  
  27.         }  
  28.         name = new String(b) ;            
    // 将读取出来的byte数组变为String  
  29.         age = rdf.readInt() ;              
    // 读取数字  
  30.         System.out.println("第一个人的信息 
    --> 姓名:"
     + name + ";年龄:" + age) ;  
  31.         rdf.skipBytes(12) ;              
    // 跳过第1个人的信息  
  32.         b = new byte[8] ;                  
    // 准备空间读取姓名  
  33.         for (int i = 0; i < b.length; i++) 
    {  
  34.             b[i] = rdf.readByte();        
    // 循环读取出前8个内容  
  35.         }  
  36.         name = new String(b) ;            
    // 将读取出来的byte数组变为String  
  37.         age = rdf.readInt() ;             
    // 读取数字  
  38.         System.out.println("第三个人的信息 
    --> 姓名:"
     + name + ";年龄:" + age) ;  
  39.         rdf.close() ;                      
    // 关闭文件  
  40.     }  

程序运行结果:

  
  
  1. 第二个人的信息 --> 姓名:lisi    ;年龄:31 
  2. 第一个人的信息 --> 姓名:zhangsan;年龄:30 
  3. 第三个人的信息 --> 姓名:wangwu  ;年龄:32 

可以发现,程序中可以随机跳过12位读取信息,也可以回到开始点重新读取。

随机读写流可以实现对文件内容的操作,但是一般情况下操作文件内容往往会使用字节或字符流。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值