编写一个带缓存的对文本文件进行读写操作的java程序。 (1)可以读取不同位置的信息 (2)可以把数据写入到不同的位置
时间: 2024-02-06 08:10:31 浏览: 50
下面是一个简单的实现,它使用一个HashMap来缓存已经读取的文件块。我们使用RandomAccessFile类来读写文件,它允许我们在文件中随机访问位置。
```
import java.io.*;
import java.util.*;
public class BufferedFileIO {
private Map<Long, byte[]> buffer = new HashMap<>();
private RandomAccessFile file;
public BufferedFileIO(String filename) throws FileNotFoundException {
this.file = new RandomAccessFile(filename, "rw");
}
public synchronized byte[] read(long position, int length) throws IOException {
// 查看缓存中是否已经存在该块
if (buffer.containsKey(position)) {
byte[] cachedData = buffer.get(position);
// 如果缓存中的数据长度足够,直接返回
if (cachedData.length >= length) {
return Arrays.copyOfRange(cachedData, 0, length);
}
// 如果不够,从文件中读取剩余部分
byte[] data = new byte[length];
System.arraycopy(cachedData, 0, data, 0, cachedData.length);
file.seek(position + cachedData.length);
file.read(data, cachedData.length, length - cachedData.length);
buffer.remove(position);
buffer.put(position, data);
return data;
} else {
byte[] data = new byte[length];
file.seek(position);
file.read(data, 0, length);
buffer.put(position, data);
return data;
}
}
public synchronized void write(long position, byte[] data) throws IOException {
// 先将数据写入文件
file.seek(position);
file.write(data);
// 如果缓存中存在该块,更新缓存
if (buffer.containsKey(position)) {
buffer.remove(position);
}
buffer.put(position, data);
}
public synchronized void flush() throws IOException {
// 将所有缓存中的数据写入文件
for (Long position : buffer.keySet()) {
byte[] data = buffer.get(position);
file.seek(position);
file.write(data);
}
buffer.clear();
}
public synchronized void close() throws IOException {
flush();
file.close();
}
}
```
使用示例:
```
try (BufferedFileIO fileIO = new BufferedFileIO("test.txt")) {
// 读取前10个字节
byte[] data = fileIO.read(0, 10);
System.out.println(new String(data));
// 写入"Hello World!"
fileIO.write(5, " World!".getBytes());
// 读取整个文件
data = fileIO.read(0, (int) fileIO.getFile().length());
System.out.println(new String(data));
} catch (IOException e) {
e.printStackTrace();
}
```
阅读全文