?写在前面?
🧭Java IO流学习 🎉 内容回顾 Java IO流介绍及文件操作 Java IO字节流 Java IO字符流 Java IO节点流和处理流 Java IO对象处理流以及序列化 📢今天我们进行 Java IO RandomAccessFile 的学习,感谢你的阅读,内容若有不当之处,希望大家多多指正,一起进步!!! ??如果觉得博主文章还不错,可以👍三连支持?一下哦😀
Java IO RandomAccessFile
RandomAccessFile
1. RandomAccessFile 是IO体系中功能最丰富的文件内容访问类,即可以读取文件内容,也可以向文件中写入内容。而其他的流都是有方向,要么是读取的流,要么是写操作的流 2. RandomAccessFile 的程序可以 直接跳到文件的任意位置来读取和写入内容 ,该对象的文件记录指针位于文件头(在0位置),当读/写n个字节后,文件记录指针也会向后移动n个字节,除此之外,RandomAccessFile可以自由移动指针,即可以向前,也可以向后
构造函数
public RandomAccessFile(String name, String mode)
public RandomAccessFile(File file, String mode)
RandomAccessFile 构造函数有两个参数,其中第一个参数都是表示文件路径或者File实例。第二个参数指定的是mode,该参数是用来指定RandomAccessFile的访问模式,有 4 种值
- “r” 以只读方式来打开指定文件夹。如果试图对该RandomAccessFile执行写入方法,都将抛出IOException异常。
- “rw” 以读,写方式打开指定文件。如果该文件尚不存在,则试图创建该文件。
- “rws” 以读,写方式打开指定文件。相对于”rw” 模式,还要求对文件内容或元数据的每个更新都同步写入到底层设备。
- “rwd” 以读,写方式打开指定文件。相对于”rw”模式,还要求对文件内容每个更新都同步写入到底层设备。
特殊的方法
1. 返回文件指针的位置
long getFilePointer();
2. 将文件指针移动到指定的pos文件 pos <= length()
void seek(long pos);
从指定位置读取文件
读取电脑磁盘上 letter.txt 文件,从文件中第3个字符开始读取,文件路径: e:\Java\letter.txt。 代码示例:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileTest01 {
public static void main(String[] args) {
String pathFile = "e:\\Java\\letter.txt";
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(pathFile, "r");
randomAccessFile.seek(3);
byte[] bytes = new byte[4];
int readLength = 0;
while ((readLength = randomAccessFile.read(bytes)) != -1) {
System.out.print(new String(bytes,0,readLength));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (randomAccessFile != null) {
randomAccessFile.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果: 🚀解读: 代码示例中以 只读模式 创建了RandomAccessFile对象,此时只能读取文件内容,而不能写入。又因为调用了seek(3) 方法,把文件指针的偏移量移动到3的位置,也就是从3字节开始读取数据。
向文件中追加内容
向电脑磁盘上 letter.txt 文件的末尾追加“Java”内容,文件路径: e:\Java\letter.txt。 代码示例:
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileTest02 {
public static void main(String[] args) {
String pathFile = "e:\\Java\\letter.txt";
RandomAccessFile randomAccessFile = null;
try {
randomAccessFile = new RandomAccessFile(pathFile,"rw");
long length = randomAccessFile.length();
randomAccessFile.seek(length);
randomAccessFile.write("Java".getBytes());
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (randomAccessFile != null) {
randomAccessFile.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
运行结果:
向文件指定位置插入内容
向电脑磁盘上 letter.txt 文件中字母c后追加“Java”内容,文件路径: e:\Java\letter.txt。因为直接插入会把字母c后的内容覆盖,所以我们先把字母c后的内容读取出来保存在一个临时文件中,待内容追加完成后,再次把临时文件中的内容写入原文件后。 代码示例:
import java.io.*;
public class RandomAccessFileTest {
public static void main(String[] args) throws IOException {
String path = "e:\\Java\\letter.txt";
int index = 3;
String content = "Java";
appendContent(path,index,content);
}
public static void appendContent(String path,Integer index, String content) {
File file = new File(path);
if (!file.exists()) {
System.out.println("文件不存在");
return;
}
RandomAccessFile raf = null;
try {
raf = new RandomAccessFile(file,"rws");
if (index > raf.length()) {
System.out.println("插入位置越界");
return;
}
File tempFile = File.createTempFile("temp", null);
tempFile.deleteOnExit();
RandomAccessFile tempRaf = new RandomAccessFile(tempFile,"rw");
raf.seek(index);
byte[] bytes = new byte[100];
int readLen = 0;
while((readLen = raf.read(bytes)) != -1) {
tempRaf.write(bytes,0,readLen);
}
raf.seek(index);
raf.write(content.getBytes());
tempRaf.seek(0);
while((readLen = tempRaf.read(bytes)) != -1) {
raf.write(bytes,0,readLen);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (raf != null) {
try {
raf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
运行结果:
|