文章目录
一、 RandomAccessFile简介
-
RandomAccessFile既可以读取文件内容,也可以向文件输出数据。同时,RandomAccessFile支持“随机访问”的方式,程序快可以直接跳转到文件的任意地方来读写数据。
-
由于RandomAccessFile可以自由访问文件的任意位置,所以如果需要访问文件的部分内容,而不是把文件从头读到尾,使用RandomAccessFile将是更好的选择。
-
与OutputStream、Writer等输出流不同的是,RandomAccessFile允许自由定义文件记录指针,**RandomAccessFile可以不从开始的地方开始输出,因此RandomAccessFile可以向已存在的文件后追加内容。**如果程序需要向已存在的文件后追加内容,则应该使用RandomAccessFile。
-
RandomAccessFile的方法虽然多,但它有一个最大的局限,就是只能读写文件,不能读写其他IO节点。
-
RandomAccessFile的一个重要使用场景就是网络请求中的多线程下载及断点续传。
二、RandomAccessFile中的方法
1. RandomAccessFile的构造函数
1. public RandomAccessFile(String name, String mode)
2. public RandomAccessFile(File file, String mode)
mode
2. 重要方法
// 从此文件中读取最多 b.length 个字节的数据到一个字节数组中。此方法会阻塞,直到至少有一个字节的输入可用,当读取到文件末尾时返回 -1
public int read(byte b[], int off, int len) throws IOException {
return readBytes(b, off, len);
}
// 将指定字节数组中的b.length个字节写入此文件,从当前文件指针开始。
public void write(byte b[]) throws IOException {
writeBytes(b, 0, b.length);
}
public native long getFilePointer() //返回文件记录指针的当前位置
void seek(long pos ) //将文件指针定位到pos位置
三、RandomAccessFile的使用
package IODemos;
import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
public class RandomAccessFileDemo {
public static void main(String[] args) {
String filePath = "C:\\Users\\HR\\Desktop\\JavaIO\\RandomAccessFile.txt";
File file = new File(filePath);
RandomAccessFileDemo rafDemo = new RandomAccessFileDemo();
rafDemo.readAndWrite(file);
}
//写文件 另外指定位置读取文件
public void readAndWrite(File file){
try {
if (!file.exists()) {
file.createNewFile();
}
}catch (IOException e){
e.printStackTrace();
}
try {
RandomAccessFile raf = new RandomAccessFile(file, "rw");
String str1 = "晴天,阴天,多云,小雨,大风,中雨,小雪,雷阵雨"; // 要写入的字符串
String str2 = new String(str1.getBytes("GBK"),"ISO-8859-1"); // 编码转换
raf.writeBytes(str2);
System.out.println("当前指针位置: "+raf.getFilePointer());
raf.seek(6); //移动文件指针
System.out.println("从文件头跳过6个字节。。。");
byte[] buffer = new byte[2];
int len;
while ((len = raf.read(buffer, 0, 2)) != -1) {
String s = new String(buffer, 0, len, "gbk"); //读文件 编码转换
System.out.print(s);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}