• 使用RandomAccessFile类对文件进行读写


    1. RandomAccessFile类简介

      RandomAccessFile是Java提供用来访问一些保存数据记录的文件的类,可以进行读取操作,也可以进行写入操作,写入的数据则以byte的形式存储;支持随机访问,也就是可以访问文件的任意位置(通过文件指针实现)。

    2. 构造函数

    RandomAccessFile(String name, String mode)
    RandomAccessFile(File file, String mode)
    

      两个构造函数用法非常相似,name、file都是用于指定打开的文件路径和名称,mode则是指定打开文件的方式,常用的参数有两个"r"和"rw",也就是只读和读写。

      文件打开后,文件指针指向文件最开始,也就是pointer=0,可通过RandomAccessFile了的getFilePointer()方法查看。

    范例: 创建并打开一个数据文件。

    //创建目录
    File dir = new File("demo");
    if (!dir.exists()) {
    	dir.mkdir();
    }
    //创建文件
    File file = new File(dir, "test.dat");
    if (!file.exists()) {
    	file.createNewFile();
    }
    //实例化RandomAccessFile对象
    RandomAccessFile raf = new RandomAccessFile(file, "rw");
    //打开文件时指针位置在最前,即0
    System.out.println(raf.getFilePointer());
    

    3. 写入操作

    write(int i)
    write(byte[] b)
    write(byte[] b, int off, int len)
    

      第三个方法中的off为数组b中需要写入的数据的起始索引值,len则是要写入的长度。write方法每次写入一个字节,如果写入的数据超过一个字节,则写入后八位(如果这里不太理解,可看看:二进制运算基础)。

      另外,每写入一个字节,文件指针指向下一个字节。

    范例: 通过write()方法向文件中写入一个整型数。(沿用上面例子创建的对象)

    //write()方法每次只插入一个字节,大于一个字节的则写入后八位,因此写入一个整型数需要写入四次
    int num = 28;
    raf.write(num >>> 24);
    raf.write(num >>> 16);
    raf.write(num >>> 8);
    raf.write(num);
    

      当然,RandomAccessFile类也提供了更简便的方法writeXxx(),如果插入一个整型,可直接writeInt(i);,boolean的则为writeBoolean(),以此类推。但是要清楚的是,这些方法的还是通过上面的write()方法实现的。

    范例: 以下为RandomAccessFile类中writeInt()方法的方法体。

    public final void writeInt(int v) throws IOException {
        write((v >>> 24) & 0xFF);
        write((v >>> 16) & 0xFF);
        write((v >>>  8) & 0xFF);
        write((v >>>  0) & 0xFF);
        //written += 4;
    }
    

    4. 读取操作

    read(int i)
    read(byte[] b)
    read(byte[] b, int off, int len)
    

      与写入操作类似,读取操作是通过read()方法实现的,每次读取一个字节,同时文件指针指向下一个位置(通过seek()方法将指针移到读取位置)。同时,RandomAccessFile类也封装了readXxx()系列方法用于简便读取,原理和使用方法可参考写入操作,基本类似。

    范例: 将数据文件中的所有数据以整型形式读取出来。

    //读取文件,在读取前需要通过seek()方法把文件指针移到最前
    raf.seek(0);
    for (int i = 0; i*4 < raf.length(); i++) {
    	System.out.println(raf.readInt());
    }
    

    5. 关闭文件

      打开的文件一定要通过close()关闭,否则可能会出现不可预料的错误。

    6. 完整例子

    import java.io.File;
    import java.io.IOException;
    import java.io.RandomAccessFile;
    
    public class MyRandomAccessFile {
    
    	public static void main(String[] args) throws IOException {
    		//创建目录
    		File dir = new File("demo");
    		if (!dir.exists()) {
    			dir.mkdir();
    		}
    		//创建文件
    		File file = new File(dir, "test.dat");
    		if (!file.exists()) {
    			file.createNewFile();
    		}
    		
    		//实例化RandomAccessFile对象
    		RandomAccessFile raf = new RandomAccessFile(file, "rw");
    		//打开文件时指针位置在最前,即0
    		System.out.println(raf.getFilePointer());
    
    		//写入数据
    		int[] num = {28, 14, 56, 23, 98};
    		for (int i : num) {
    			raf.writeInt(i);
    		}
    		
    		//读取文件,在读取前需要通过seek()方法把文件指针移到最前
    		raf.seek(0);
    		for (int i = 0; i*4 < raf.length(); i++) {
    			System.out.println(raf.readInt());
    		}
    		
    		//操作结束后一定要关闭文件
    		raf.close();
    	}
    }
    
  • 相关阅读:
    SpringMVC简单总结-day02
    SpringMVC简单总结-day01
    SpringMVC通过Ajax处理数据,出现406问题
    Java特殊时间格式转化
    PyQuery用法详解
    解决:CentOS 7下yum install mysql-server无包可用问题
    数据库编程接口
    python高级文件操作
    python生成随机数、随机字符串
    【转】错误日志ID8021来源BROWSER导致电脑死机
  • 原文地址:https://www.cnblogs.com/joahyau/p/6722708.html
Copyright © 2020-2023  润新知