【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, Listemps){ 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 ListreadFromFile(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