简介
LocalFileArrayList我自己随便起的,没怎么思考,不一定是最适合的名字。搞这东西主要是有些需求用到的数据量太大了,在并不最求效率只最求结果的背景下,用文件来实现列表功能可以解决量大溢出的烦恼,而且还能保留List操作的丝滑手感,觉得有必要记录分享下。
在Java中,List
是一个非常常用的接口,用于存储元素集合。然而,标准的 List
实现(如 ArrayList
或 LinkedList
)都是基于内存的。在某些情况下,我们可能需要将列表持久化到文件中,以便在程序重启后仍然能够访问这些数据。本文将介绍如何实现一个基于文件的泛型列表 LocalFileArrayList
,它能够将数据存储在文件中,并且支持泛型,以确保类型的安全性。
核心概念
泛型
Java的泛型机制允许在编译时进行类型检查,从而避免类型转换的错误和运行时异常。在我们的 LocalFileArrayList
实现中,泛型 T
用于指定列表中元素的类型。
文件操作
LocalFileArrayList
通过文件系统来持久化数据。我们使用 File
类来表示文件,并通过 BufferedReader
和 BufferedWriter
进行文件的读写操作。
实现细节
构造函数
构造函数 LocalFileArrayList(String fileName, Class<T> type)
接受文件名和元素类型作为参数。如果文件已存在,则删除并重新创建,确保列表是空的。
public LocalFileArrayList(String fileName, Class<T> type) throws IOException {
this.file = new File(fileName);
this.type = type;
if (file.exists()) {
file.delete();
}
file.createNewFile();
}
读取和写入文件
我们定义了 readAllLines
和 writeAllLines
方法来分别读取和写入文件中的所有行。这些方法使用 BufferedReader
和 BufferedWriter
来优化读写性能。
private List<String> readAllLines() throws IOException {
BufferedReader reader = new BufferedReader(new FileReader(file));
List<String> lines = new ArrayList<>();
String line;
while ((line = reader.readLine()) != null) {
lines.add(line);
}
reader.close();
return lines;
}
private void writeAllLines(List<String> lines) throws IOException {
BufferedWriter writer = new BufferedWriter(new FileWriter(file));
for (String line : lines) {
writer.write(line);
writer.newLine();
}
writer.close();
}
类型转换
为了支持泛型,我们实现了 convertStringToType
和 convertTypeToString
方法来在字符串和泛型类型之间进行转换。目前,我们支持 Integer
和 String
类型,但可以根据需要扩展以支持更多类型。
private T convertStringToType(String value) {
if (type == Integer.class) {
return type.cast(Integer.parseInt(value));
} else if (type == String.class) {
return type.cast(value);
}
throw new IllegalArgumentException("Unsupported type: " + type);
}
private String convertTypeToString(T value) {
return value.toString();
}
List 接口方法实现
我们实现了 List
接口中的一些基本方法,如 add
、get
、remove
等。对于其他未实现的方法,我们抛出了 UnsupportedOperationException
。
@Override
public boolean add(T element) {
try (BufferedWriter writer = new BufferedWriter