【Java/BinaryFile】将雇员信息写入二进制文件,再从二进制文件将雇员信息读出来


【需求】

现需要将一批雇员数据存入文件,考虑到CSV文件的分隔符也可能出现在文字中而找出隐患,故决定启用二进制格式。

【雇员类】

package com.hy.binary;

class Emp {
    private long id;
    private String name;
    private int age;

    public Emp(long id,String name,int age){
        this.id=id;
        this.name=name;
        this.age=age;
    }

    public Emp(){
        this(-1,null,-1);
    }

    public String toString(){
        String msg=String.format("EMP:Id=%d name=%s age=%d",id,name,age);
        return msg;
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}

【写入类】

package com.hy.binary;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.List;

class BinaryFileWriter {
    public void write2File(String filename, List emps){

        try {
            DataOutputStream out = new DataOutputStream(new FileOutputStream(filename));

            // 先写入个数
            out.writeInt(emps.size());

            // 再逐个写入雇员
            for (Emp emp : emps) {
                out.writeLong(emp.getId());
                writeString(emp.getName(),10,out);
                out.writeInt(emp.getAge());
            }
        }catch(Exception ex){
            ex.printStackTrace();
        }
    }

    // 写入最大长度为size的字符串,不足写0
    private static void writeString(String str,int size,DataOutputStream out) throws Exception{
        for(int i=0;i){
            char c=0;
            if(i<str.length()){
                c=str.charAt(i);
            }
            out.writeChar(c);
        }
    }

    public static void main(String[] args){

        List emps=new ArrayList<>();
        emps.add(new Emp(1,"Andy",25));
        emps.add(new Emp(2,"Bill",35));
        emps.add(new Emp(3,"Cindy",45));
        emps.add(new Emp(4,"Douglas",55));
        emps.add(new Emp(5,"小沈阳",28));
        emps.add(new Emp(6,"宋小宝",38));
        emps.add(new Emp(7,"王小利",48));
        emps.add(new Emp(8,"尼古拉斯赵四",58));

        BinaryFileWriter writer=new BinaryFileWriter();
        writer.write2File("c:\\temp\\0310.dat",emps);
    }
}

【读取类】

package com.hy.binary;

import java.io.DataInput;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

class BinaryFileReader {
    public List readFromFile(String filename){
        try {
            RandomAccessFile in = new RandomAccessFile(filename, "r");

            List emps=new ArrayList<>();
            int count=in.readInt();
            for(int i=0;i){
                long id=in.readLong();
                String name=readString(10,in);
                int age=in.readInt();

                emps.add(new Emp(id,name,age));
            }

            return emps;
        }catch(Exception ex){
            ex.printStackTrace();
        }
        return null;
    }

    // 读入最大长度为size的字符串
    private static String readString(int size, DataInput in) throws Exception{
        StringBuilder sb=new StringBuilder();

        for(int i=0;i){
            char c=in.readChar();

            if(c==0){
                continue;
            }else{
                sb.append(c);
            }
        }

        return sb.toString();
    }

    public static void main(String[] args){
        BinaryFileReader reader=new BinaryFileReader();
        List emps=reader.readFromFile("c:\\temp\\0310.dat");
        for(Emp emp:emps){
            System.out.println(emp);
        }
    }
}

【读取类的输出】

EMP:Id=1 name=Andy age=25
EMP:Id=2 name=Bill age=35
EMP:Id=3 name=Cindy age=45
EMP:Id=4 name=Douglas age=55
EMP:Id=5 name=小沈阳 age=28
EMP:Id=6 name=宋小宝 age=38
EMP:Id=7 name=王小利 age=48
EMP:Id=8 name=尼古拉斯赵四 age=58

END

相关