【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<Emp> 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<size;i++){ char c=0; if(i<str.length()){ c=str.charAt(i); } out.writeChar(c); } } public static void main(String[] args){ List<Emp> 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<Emp> readFromFile(String filename){ try { RandomAccessFile in = new RandomAccessFile(filename, "r"); List<Emp> emps=new ArrayList<>(); int count=in.readInt(); for(int i=0;i<count;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<size;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<Emp> 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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
2020-03-10 【Canvas与化学】硅元素
2020-03-10 Oracle中select子句取值先于order by子句执行而导致rownum伪列未按预期取值导致的问题
2020-03-10 【Canvas与艺术】蓝波纹白底黄星徽章
2019-03-10 [JS]两个常用的取随机整数的函数
2019-03-10 【Canvas与艺术】十角大楼