Java随机读写文件

目录

1. 构造方法

2. 文件指针

3. 读写操作

4. 应用示例


       文件输入输出流类(FileInputStream和FileOutputStream)实现了对磁盘文件的顺序读写,然而在实际的应用中,经常需要在文件的任意位置读或写数据,并且要求同时进行读和写操作。为此,Java还提供了一个功能更强大、使用更方便的RandomAccessFile类,该类可以实现对文件的随机读写。RandomAccessFile类定义在java.io包中,它与InputStream和OutputStream类在一个层次,是Object类的直接子类。RandomAccessFile类支持文件任意位置的读取而不只是顺序读取。

1. 构造方法

       RandomAccessFile类的构造方法如下:

RandomAccessFile(String name, String mode)通过指定的文件名来创建随机访问文件对象
RandomAccessFile(File file, String mode)过指定的File对象来创建随机访问文件对象

       其中,参数mode表示对文件的访问模式,其取值如下:

  • “r”:表示以只读的方式打开文件,如果调用对象的写操作将会导致抛出IOException异常;
  • “rw”:表示以读写的方式打开文件,如果文件不存在,则尝试创建新的文件;
  • “rwd”:表示以读写的方式打开文件,相对于“rw”模式,还要求对文件内容的更新同步写入到基础存储设备中;
  • “rws”:表示以读写的方式打开文件,相对于“rw”模式,还要求对文件的内容或元数据的更新都同步写入到基础存储设备中。

       创建RandomAccessFile对象时,如果指定的文件不存在则会抛出FileNotFoundException异常,因此,在RandomAccessFile对象时需要增加相应的try-catch语句。

       例如,

RandomAccessFile rafile;

try {

    rafile=new RandomAccessFile("D:\\examples\\book.txt","rwd");

} catch (FileNotFoundException e) {

    e.printStackTrace();

}

2. 文件指针

       为了支持对文件的随机读写,RandomAccessFile类设置了文件指针,该指针以字节位单位,通过从文件头开始计算的偏移量来指明当前读写的位置。RandomAccessFile类提供了如下方法来操作文件的指针:

long getFilePointer()返回文件指针的当前位置
void seek(long pos)将文件指针定位到pos位置
int skipByte(int n)

跳过输入流中的n个字节不读,并返回实际跳过的字节数。

long length()返回文件的长度

       文件的位置从0开始,通过seek()方法可以将指针指向任何位置。

       例如,

rafile.writeInt(10); //向文件中写入一个整型值(长度为4

rafile.writeDouble(20.15);//向文件写入一个双精度浮点值(长度为8

System.out.println("len="+rafile.length());//len=12

rafile.seek(4);//将文件定位到位置4

System.out.println(rafile.readDouble());//20.5

3. 读写操作

       RandomAccessFile类除了提供了与InputStream和OutputStream类似的read()和write()方法外,还提供了直接读写各种基本类型数据的方法。

       RandomAccessFile类中用于读文件操作的主要方法如下:

方法功能描述
int read()从文件的当前位置开始读取一个字节的数据
int read(byte[] b)从文件的当前位置开始读取最多b.length个字节的数据存储在数组b中,并返回实际读取的字节数
int read(byte[] b, int off, int len)从文件的当前位置中读取最多len个字节的数据存放到字节数组b中从off开始的位置,并返回实际读取的字节数
boolean readBoolean()从文件当前位置开始读取一个布尔值
char readChar()从文件当前位置开始读取一个字符
byte readByte()从文件当前位置开始读取一个byte类型的值
short readShort()从文件当前位置开始读取一个短整型值
int readInt()从文件当前位置开始读取一个整型值
long readLong()从文件当前位置开始读取一个长整型值
float readFloat()从文件当前位置开始读取一个单精度浮点数
double readDouble()从文件当前位置开始读取一个双精度浮点数
String readUTF()从文件当前位置开始读取一个UTF格式的字符串
String readLine()从文本文件当前位置开始读取一行

       RandomAccessFile类中用于写文件操作的主要方法如下:

方法功能描述
void write(int b)向文件写入指定的字节数据
void write(byte[] b)将b.length个字节从指定的byte数组中写入到文件中
void write(byte[] b, int off, int len)将一个指定的byte数组中从off开始的len个字节写入文件中
void writeBoolean()在文件的当前位置写入一个布尔值
void writeByte(int v)在文件的当前的位置写入一个byte型值(只写入v的最低位字节)
void writeBytes(String s)按照字节序列的形式将一个字符串写入文件的当前位置
void writeChar(int v)在文件的当前位置写入一个字符(只写入v的最低2位字节)
void writeChars(String s)按照字符序列的形式将一个字符写入文件的当前位置
void writeShort(int v)在文件的当前位置写入一个短整型值(只写入v的最低2位字节)
void writeInt(int v)在文件的当前位置写入一个整型值
void writeLong(long v)在文件的当前位置写入一个长整型值
void writeFloat(float v)在文件的当前位置写入一个单精度浮点值
void writeDouble(double v)在文件的当前位置写入一个双精度浮点值
void writeUTF(String str)在文件的当前位置写入一个UTF格式的字符串,其长度是2个字节的长度信息加上字符串所占字节数(英文字符的长度为1个字节,中文汉字的长度为3个节)

4. 应用示例

       下面程序创建一个文本文件,然后利用RandomAccessFile类写入3个学生的信息,然后再将其读取出来写在控制台中。

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo {
	public static void main(String[] args) {
		try {
			RandomAccessFile accessFile=new 
                           RandomAccessFile("D:\\examples\\student.txt","rwd");
			long pos[]=new long[3];
			pos[0]=0;//第1个学生的初始位置
			accessFile.writeInt(1);
			accessFile.writeUTF("张三");
			accessFile.writeDouble(90);
			pos[1]=accessFile.getFilePointer();//第2个学生初始位置
			accessFile.writeInt(2);
			accessFile.writeUTF("李四");
			accessFile.writeDouble(80);
			pos[2]=accessFile.getFilePointer();//第3个学生初始位置
			accessFile.writeInt(3);
			accessFile.writeUTF("王五");
			accessFile.writeDouble(75);
			
			for(int i=0;i<3;i++) {
				accessFile.seek(pos[i]);//移到第i个学生初始位置
				int no=accessFile.readInt();
				String name=accessFile.readUTF();
				double score=accessFile.readDouble();
				System.out.println("编号:"+no+",姓名:"+name+",分数:"+score);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
}

程序运行结果如下:

编号:1,姓名:张三,分数:90.0

编号:2,姓名:李四,分数:80.0

编号:3,姓名:王五,分数:75.0

  • 15
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值