java中RandomAccessFile类的讲解

本文详细介绍了如何使用 Java 中的 RandomAccessFile 类进行文件的随机读写操作,包括正确处理中文字符及整数的写入与读取,对比了 File 和 RandomAccessFile 的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

package cn.itcast.domian;

import java.io.Serializable;

public class Employee implements Serializable {

 /**
  *
  */
 private static final long serialVersionUID = 1L;
 private String name;
 private int age;
 public static  final int LEN = 8;
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public int getAge() {
  return age;
 }
 public void setAge(int age) {
  this.age = age;
 }
 public Employee(String name, int age) {
  if(name.length() > LEN)
  {
   name = name.substring(0, LEN);
  }else
  {
   while(name.length() < LEN)
   {
    //"\0000"是unicode编码的一个空的意思
    name += "\u0000";
   }
  }
  this.name = name;
  this.age = age;
 }
 
}

//这是RandomAccessFile的测试

package cn.itcast.test;

import java.io.RandomAccessFile;

import cn.itcast.domian.Employee;

public class AccessTest {
 //这样写入到基本是的数据,年龄显示出来的是乱码,因为记事本不支持unicode编码
 public static void main(String[] args) throws Exception {
  Employee employee1 = new Employee("张三", 258);
  Employee employee2 = new Employee("lixiaolu", 25);
  Employee employee3 = new Employee("maozedong", 45);
  RandomAccessFile randomAccessFile = new RandomAccessFile("accessTest.txt", "rw");
  //用write直接写入英文没问题,但是一旦写入中文就会出现问题,这是因为在java中一个中文也是一个字节,但是我们读取的时候,我们
  //的操作系统认为一个中文是两个字节,那时候就会出现错误,正确的处理方法是用writeChars()来写入中文
  //还有当我们当我们用write写入整数的时候,只占用了一个字节,但是如果我们的整数的范围大于字节的最大值的时候,就会出现截取高位的问题
  //所以我们用writeInt方法来写入整数
//  randomAccessFile.write(employee1.getName().getBytes());
  randomAccessFile.writeChars(employee1.getName());
//  randomAccessFile.write(employee1.getAge());
  randomAccessFile.writeInt(employee1.getAge());
  
//  randomAccessFile.write(employee2.getName().getBytes());
  randomAccessFile.writeChars(employee2.getName());
  randomAccessFile.writeInt(employee2.getAge());
  
//  randomAccessFile.write(employee3.getName().getBytes());
  randomAccessFile.writeChars(employee3.getName());
  randomAccessFile.writeInt(employee3.getAge());
  //千万要记得需要关闭这个文件,因为这个文件类的实现本身带有一些输入输出流
  randomAccessFile.close();
  
  //这是文件里的内容
  RandomAccessFile randomAccessFile2 = new RandomAccessFile("accessTest.txt", "rw");
  randomAccessFile2.skipBytes(20);
  String strName = "";
  for(int i = 0; i < 8; i++)
  {
   strName += randomAccessFile2.readChar();
  }
  
  //randomAccessFile2.read()是将记事本中的一个字节读取出来,randomAccessFile2.readInt()是将记事本中读取四个字节
  //randomAccessFile2.read(buffer)这是从记事本中读取buffer字节长度的字节数
  System.out.println(strName.trim() + "-->" + randomAccessFile2.readInt());
  
  strName = "";
  randomAccessFile2.seek(0);
  for(int i = 0; i < 8; i++)
  {
   strName += randomAccessFile2.readChar();
  }
  System.out.println(strName.trim() + "-->" + randomAccessFile2.readInt());
  
  strName = "";
  randomAccessFile2.seek(40);
  for(int i = 0; i < 8; i++)
  {
   strName += randomAccessFile2.readChar();
  }
  
  System.out.println(strName.trim() + "-->" + randomAccessFile2.readInt());
  randomAccessFile2.close();
 }

}
//File 和 RandomAccessFile的区别

只看名字就知道RandomAccessFile实现随机访问文件的功能,文档定义:随机存取文件的行为类似存储在文件系统中的一个大型字节数组。存在指向该隐含数组的光标或索引,称为文件指针;输进操纵从文件指针开始读取字节,并随着对字节的读取而前移此文件指针。假如随机存取文件以读取/写进模式创建,则输出操纵也可用;输出操纵从文件指针开始写进字节,并随着对字节的写进而前移此文件指针。写进隐含数组确当前末尾之后的输出操纵导致该数组扩展。该文件指针可以通过 getFilePointer 方法读取,并通过 seek 方法设置。

RandomAccessFile同时将FileInputStream和FileOutputStream整合到一起,而且支持将从文件任意字节处读或写数据,RandomAccessFile类提供一种机制,相当于在文件流中插进了一个指针,可以按需读取。

File只是对一个文件或目录的抽象,可以想象成是一个文件句柄、标识,这个类本身只提供对文件的打开,封闭,删除,属性访问等等;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值