定义接口 规范文件操作类型
import java.util.List;
/**
* 控制普通文件读取操作的类
* 一般来讲是换行读取、字符流
* @param 待存取的类型
*/
public interface IFileOperation {
/**
* 增
* @param object
*/
void add(T object);
/**
* 删
* @param object
*/
void delete(T object);
/**
* 查
* @return
*/
List getAll();
/**
* 改
* @param object
*/
void update(T object);
}
文本类型数据文件内容:
ID#Code#Name#Classification#Type
1#XXGNK#心血管内科#内科#临床
2#SJNK#神经内科#内科#临床
3#PTNK#普通内科#内科#临床
4#XHNK#消化内科#内科#临床
5#HXNK#呼吸内科#内科#临床
6#NFMK#内分泌科#内科#临床
7#SBNK#肾病内科#内科#临床
读写分析
插入操作,为简便起见,建议插在末尾。 删除操作,不建议在遍历中删除,因为迭代器遍历(增强for循环实质上是迭代器)中并发修改会fail-fast,抛出并发修改异常。 修改操作,在循环的时候也是,貌似写不进去的。 查询操作,很简单啦,查就完事。
建议全取出来再处理,毕竟IO真的慢,一直是一边IO一边操作也不太现实吧(这可不是数据库,数据库有些功能直接在SQL里指定了)。
实现类Mapper肯定是单例模式啦。 实现上面的接口,给一个类型,实现对应的增删改查方法。 另外,处理好读写格式很重要,其中我用的是多个“+”连接字符串,其实这么多的连接就完全可以用StringBuilder了。
public class DepartmentMapper implements IFileOperation {
private static DepartmentMapper mapper;
private DepartmentMapper() {}
/**
* 获取单例
* @return
*/
public static DepartmentMapper getInstance() {
if (mapper == null) {
mapper = new DepartmentMapper();
}
return mapper;
}
/**
* 根据传入对象插入部门
*/
@Override
public void add(Department object) {
if (object != null) {
List departmentList = getAll();
for (Department department : departmentList) {
if (department.getId().equals(object.getId())) {
return;
}
}
departmentList.add(object);
writeDepartment(departmentList);
}
}
/**
* 根据传入对象删除部门
*/
@Override
public void delete(Department object) {
List departmentList = getAll();
Department deleteObj = null;
for (Department department : departmentList) {
if (department.getId().equals(object.getId())) {
deleteObj = department;
break;
}
}
if (deleteObj != null) {
departmentList.remove(deleteObj);
}
writeDepartment(departmentList);
}
/**
* 获取所有部门
*/
@Override
public List getAll() {
List departmentList = new ArrayList();
try (Scanner scanner = new Scanner(new FileReader(DEPARTMENT_FILENAME))) {
scanner.nextLine();
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
departmentList.add(generateDepartment(line));
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
return departmentList;
}
/**
* 更新一个部门信息
*/
@Override
public void update(Department object) {
List departmentList = getAll();
Department temp = null;
for (Department department : departmentList) {
if (department.getId().equals(object.getId())) {
temp = department;
break;
}
}
temp= object;
writeDepartment(departmentList);
}
/**
* 完成修改后的写入
* @param departmentList
*/
private void writeDepartment(List departmentList) {
try (BufferedWriter tempWriter = new BufferedWriter(new FileWriter(DEPARTMENT_FILENAME));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(DEPARTMENT_FILENAME, true))) {
tempWriter.write("");
for (Department department : departmentList) {
String line = department.getId() + SPLIT_CHARACTER + department.getCode() + SPLIT_CHARACTER
+ department.getName() + SPLIT_CHARACTER + department.getClassification() + SPLIT_CHARACTER
+ department.getType() + "\n";
bufferedWriter.write(line);
}
} catch (IOException ioe) {
ioe.printStackTrace();
}
}
/**
* 一个被封装的方法,作用是把读出来的一行拆分组合为一个Department对象
* @param line
* @return
*/
private Department generateDepartment(String line) {
String[] strList = line.split(SPLIT_CHARACTER);
int id = Integer.parseInt(strList[0]);
String code = strList[1];
String name = strList[2];
String classification = strList[3];
String type = strList[4];
Department department = new Department(id, code, name, classification, type);
return department;
}
/**
* 依据科室名称找到科室
* @param name
* @return
*/
public Department getElementByName(String name) {
if (name == null) {
return null;
}
List departmentList = getAll();
for (Department department : departmentList) {
if (name.equals(department.getName())) {
return department;
}
}
return null;
}
}