高手的存在,就是让服务10亿人的时候,你感觉只是为你一个人服务......

RandomAccessFile文件读写

目录
  1. 1. 读取任意位置的数据
  2. 2. 在文件结尾写入
  3. 3. 向指定位置插入数据

NIO中关于文件读写常用RandomAccessFile类。乍一看跟InputStreamOutputStream有关系,但实际上它一个完全独立的类,直接继承Object,里面的方法都是自己实现。

RandomAccessFile提供很多方法来操作文件,它最大的优势就是通过seek()方法直接跳到任意地方来读写数据。

先在D盘中创建RandomAccessFile.txt文件,写入

aaaaaaaaaabbbbbbbbbbccccccccccdddddddddd

读取任意位置的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
* 读取任意位置的数据,初始位置为0,seek(seekPointer)移动位置
*
*/

public static void randomRed() {
try {

int seekPointer = 10;
String filePath = "D:\\RandomAccessFile.txt";
// 以读的方式建立一个RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(filePath, "r");

raf.seek(seekPointer);// 移动文件指针
byte[] buff = new byte[1024];

int hasRead = 0;

while ((hasRead = raf.read(buff)) > 0) {
System.out.println(new String(buff, 0, hasRead));

}

} catch (Exception e) {
e.printStackTrace();
}

}

打印输出:

bbbbbbbbbbccccccccccdddddddddd


在文件结尾写入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/**
* 在文件结尾写入
*
*
*/

public static void randomWrite() {
try {
String filePath = "D:\\RandomAccessFile.txt";
// 以读写的方式建立一个RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(filePath, "rw");

// 将记录指针移动到文件最后
raf.seek(raf.length());
raf.write("gggggggggg".getBytes());

byte[] buff = new byte[1024];

int hasRead = 0;
raf.seek(0);

while ((hasRead = raf.read(buff)) > 0) {
System.out.println(new String(buff, 0, hasRead));

}

} catch (Exception e) {
e.printStackTrace();
}
}

打印输出:

aaaaaaaaaabbbbbbbbbbccccccccccddddddddddgggggggggg


向指定位置插入数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
/**
* 向指定位置插入数据
*/

public static void insertOnPointer() {
try {
File tmp = File.createTempFile("tmp", null);
tmp.deleteOnExit();// 在JVM退出时删除

String filePath = "D:\\RandomAccessFile.txt";
int seekPointer = 10;
// 插入的内容
String insertContent = "iiiiiiiiii";

// 以读写的方式建立一个RandomAccessFile对象
RandomAccessFile raf = new RandomAccessFile(filePath, "rw");
// 创建一个临时文件夹来保存插入点后的数据
FileOutputStream tmpOut = new FileOutputStream(tmp);
FileInputStream tmpIn = new FileInputStream(tmp);
raf.seek(seekPointer);

/** 将插入点后的内容读入临时文件夹 **/
byte[] buff = new byte[1024];
int hasRead = 0;
while ((hasRead = raf.read(buff)) > 0) {
tmpOut.write(buff, 0, hasRead);
}
// 返回原来的插入处
raf.seek(seekPointer);
// 追加需要追加的内容
raf.write(insertContent.getBytes());
// 最后追加临时文件中的内容
while ((hasRead = tmpIn.read(buff)) > 0) {
raf.write(buff, 0, hasRead);
}
} catch (Exception e) {
e.printStackTrace();
}
}

打印输出:

aaaaaaaaaaiiiiiiiiiibbbbbbbbbbccccccccccdddddddddd