您当前的位置: 首页 >  Java

星拱北辰

暂无认证

  • 0浏览

    0关注

    1205博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

【Java】格式化的文件I/O

星拱北辰 发布时间:2019-12-11 13:46:33 ,浏览量:0

定义接口 规范文件操作类型
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;
    }

}
关注
打赏
1660750074
查看更多评论
立即登录/注册

微信扫码登录

0.0420s