1、了解RandomAccessFile
RandomAccessFile是Java提供的可以对文件内容进行访问的类,既可以对文件内容进行读取操作,也可以写入新的内容,并且RandomAccessFile支持随机访问文件,即访问文件内容的任意位置, 常应用于断点续传。
2、RandomAccessFile操作文件内容的基本流程
1. 了解Java的文件模式
Java在硬盘上的文件是以byte byte byte ……形式储存的,是数据的集合。
2. 访问要操作的文件
访问文件有两种可选模式:读写模式(“rw”)、只读模式(“r”);
RandomAccessFile raf = new RandomAccessFile(file,"rw");
//可指定访问模式
当为读写模式时,如果文件不存在会自动创建,但在只读模式下不会,必须要求文件事先存在。
同时还存在有文件指针这一概念,在访问文件时,指针在文件内容的起始位置,即 pointer = 0;
3. 写入操作
raf.write(int b);
//只写一个字节,即后8位,同时指针指向下一位置,准备再次写入
4. 读取操作
int b = raf.read();
//读一个字节
5. 及时关闭
文件读写完成后一定要关闭,否则可能会出现意想不到的错误。
——来自Oracle官方说明
3、使用RandomAccessFile
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.Arrays;
public class RafDemo {
public static void main(String[] args)throws IOException {
//创建目录
File demo = new File("demo");
if(!demo.exists()){
demo.mkdir();
}
//创建文件
File file = new File(demo,"raf.dat");
if(!file.exists()){
file.createNewFile();
}
//指定访问文件的方式
RandomAccessFile raf = new RandomAccessFile(file,"rw");
//查看打开文件时的指针位置
System.out.println(raf.getFilePointer());
//写入操作
/*
* char类型是16位
* 所以实际上'A'、'B'都各自只写了一个字节,即后8位
*/
raf.write('A');
raf.write('B');
//此时指针位置应指向2
System.out.println(raf.getFilePointer());
//Java内最大整数
int i = 0x7fffffff;
/*
* int类型是32位,0x7fffffff转为二进制是
* 01111111 11111111 11111111 11111111
* 如果要使用write方法将i写入文件
* 则需要写4次
*/
raf.write(i>>>24);
raf.write(i>>>16);
raf.write(i>>>8);
raf.write(i);
//此时指针位置应指向6
System.out.println(raf.getFilePointer());
/*
* 当然RadomAccessFile提供了直接写入int的方法writeInt()
* 上面分步骤写入的方法只是writeInt()在底层执行的操作
*/
raf.writeInt(i);
String s = "书";
byte[] gbk = s.getBytes("gbk");
raf.write(gbk);
/*
* 查看当前文件长度
* 中文占2个字节
* 前面两次输入i占用8个字节
* 开始的字符'A'、'B'都各自只写了一个字节
* 因此长度为12
*/
System.out.println(raf.length());
//读取操作
/*
* 执行前必须把文件指针移到头部
* 一次性读取需要移动到起始位置,即0
*/
raf.seek(0);
/*
* 一次性读取
* 开辟一个字节数组,长度为raf.length(),返回值是long型
* 把文件中的内容全部读取到该字节数组中
*/
byte[] buf = new byte[(int)raf.length()];
raf.read(buf);
System.out.println(Arrays.toString(buf));
//[65, 66, 127, -1, -1, -1, 127, -1, -1, -1, -54, -23]
//转换成字符串输出
String s1 = new String(buf);
System.out.println(s1);
//AB�???�???书
//以十六进制输出
for (byte b : buf) {
System.out.print(Integer.toHexString(b&0xff)+" ");
}
//41 42 7f ff ff ff 7f ff ff ff ca e9
//及时关闭
raf.close();
}
}
版权声明:欢迎转载,欢迎扩散,但转载时请标明作者以及原文出处,谢谢合作! ↓↓↓