相对于文本文件,二进制文件读写快,定位快而准,下面是代码示例:

import java.io.DataInput;
import java.io.DataOutput;
import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.RandomAccessFile;
import java.util.ArrayList;
import java.util.List;

class Employee{
    public static int RecordSize=72;// 总计8+30*2+4=72字节,算准总字节数对于连续读取很重要
    private long id;// long类型似占8字节
    private String name;
    public static int NameSize=30;// 预计名称最多30个字符,占30*2=60字节
    private int age;// int类型占4字节

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

    public String toString(){
        return "ID="+id+" name:"+name+" age:"+age;
    }

    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;
    }
}

public class Test3{
    public static void main(String[] args) throws Exception{
        // 准备数据
        List<Employee> ls=new ArrayList<Employee>();

        final int AMOUT=10;
        for(long i=0;i<AMOUT;i++){
            ls.add(new Employee(i,"克隆人-"+i,(int)(i %100)));
        }

        // 写入
        DataOutputStream out=new DataOutputStream(new FileOutputStream("C:\\Users\\IBM_ADMIN\\Desktop\\emp.dat"));
        for(Employee emp:ls){
            writeEmp(out,emp);
        }

        // 挨个读取
        RandomAccessFile in=new RandomAccessFile("C:\\Users\\IBM_ADMIN\\Desktop\\emp.dat","r");
        int len=(int)(in.length()/Employee.RecordSize);

        for(long i=0;i<len;i++){
            in.seek(i*Employee.RecordSize);

            Employee emp=readEmp(in);
            System.out.println(emp.toString());
        }
    }

    private static void writeEmp(DataOutput out,Employee emp) throws Exception{
        writeString(emp.getName(),Employee.NameSize,out);
        out.writeLong(emp.getId());
        out.writeInt(emp.getAge());
    }

    private static Employee readEmp(DataInput in)  throws Exception{
        String name=readString(Employee.NameSize,in);
        long sn=in.readLong();
        int age=in.readInt();

        return new Employee(sn,name,age);
    }

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

    // 读入最大长度为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();
    }
}

输出如下:

ID=0 name:克隆人-0 age:0
ID=1 name:克隆人-1 age:1
ID=2 name:克隆人-2 age:2
ID=3 name:克隆人-3 age:3
ID=4 name:克隆人-4 age:4
ID=5 name:克隆人-5 age:5
ID=6 name:克隆人-6 age:6
ID=7 name:克隆人-7 age:7
ID=8 name:克隆人-8 age:8
ID=9 name:克隆人-9 age:9

Java读写二进制文件示例的更多相关文章

  1. Java 读写文件示例

    import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; public class T ...

  2. 【转】JAVA 读写二进制文件

    原文网址:http://shiminghua234.blog.163.com/blog/static/263912422011619102350866 import java.io.*; /** * ...

  3. 【转】java读写二进制文件的解决方法

    原文网址:http://www.jb51.net/article/36940.htm 接口:Writerable 复制代码代码如下: package com.geoway.pad.common; im ...

  4. Java读写文件方法总结

    Java读写文件方法总结 Java的读写文件方法在工作中相信有很多的用处的,本人在之前包括现在都在使用Java的读写文件方法来处理数据方面的输入输出,确实很方便.奈何我的记性实在是叫人着急,很多时候既 ...

  5. java读写文件大全

     java读写文件大全 最初java是不支持对文本文件的处理的,为了弥补这个缺憾而引入了Reader和Writer两个类,这两个类都是抽象类,Writer中 write(char[] ch,int o ...

  6. 【转】C++读写二进制文件

    原文网址:http://blog.csdn.net/lightlater/article/details/6364931 摘要: 使用C++读写二进制文件,在开发中操作的比较频繁,今天有幸找到一篇文章 ...

  7. GeoJson的生成与解析,JSON解析,Java读写geojson,geotools读取shp文件,Geotools中Geometry对象与GeoJson的相互转换

    GeoJson的生成与解析 一.wkt格式的geometry转成json格式 二.json格式转wkt格式 三.json格式的数据进行解析 四.Java读写geojson 五.geotools读取sh ...

  8. Java读写文本文件操作

    package com.test; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; ...

  9. java 读写word java 动态写入 模板文件

    import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import ja ...

随机推荐

  1. MediaPlayer滑动不准的问题

    因为MediaPlayer在seekto是异步进行的,如果在滑动过程中暂停,会导致滑动不准确的情况,这时候就需要添加滑动完成的监听即setOnSeekCompleteListener

  2. CodeForces 738D Sea Battle

    抽屉原理. 先统计最多有$sum$个船可以放,假设打了$sum-a$枪都没打中$a$个船中的任意一个,那么再打$1$枪必中. #pragma comment(linker, "/STACK: ...

  3. 记一次Python爬虫开发经历

    为啥要做Python爬虫,是因为我去找电影的某个网站有点坑,它支持tag标签查询自己喜欢的电影,但是不支持双标签或者三标签查询.由于一个电影对应多种类型(tag),这就意味着,我需要进入这个电影介绍界 ...

  4. 【大视野入门OJ】1083:数组的二分查找

    Description 在1500个整数中查整数x的位置,这些数已经从小到大排序了.若存在则输出其位置,若不存在则输出-1. Input 第一行,一个整数x 后面1500行,每行一个整数 Output ...

  5. JZYZOJ1544 [haoi2016T2]放棋子 错排公式 组合数学 高精度

    http://172.20.6.3/Problem_Show.asp?ID=1544&a=ProbNF 看了题解才意识到原题有错排的性质(开始根本不知道错排是什么). 十本不同的书放在书架上. ...

  6. JZYZOJ 1375 双亲数 莫比乌斯反演

    http://172.20.6.3/Problem_Show.asp?id=1375 网上搜推理图. 有一段没有写莫比乌斯反演都快忘了..数学能力--,定理完全不会推,但是这道题整体来说应该是比较好写 ...

  7. CodeForces - 1004E Sonya and Ice Cream

    题面在这里! 挺智障的一个二分...我还写了好久QWQ,退役算啦 题解见注释... /* 先对每个点记录 向子树外的最长路 和 向子树内最长路,然后二分. 二分的时候枚举链的LCA直接做就好啦. */ ...

  8. [AGC026B]rng_10s

    题意:一个商店,第一天早上有$A$罐苹果汁,一个人每天上午都会来买$B$罐,每天晚上如果剩余罐数$\leq C$那么会增加$D$罐,问能否无限买 收集一个套路...? 首先如果$B\gt A$或者$B ...

  9. kong结合consul

    早期版本 ./etcdctl ls / --recursive /name /name1 /name1/wyc /name1/wu /name1/chao /name1/chao/age ------ ...

  10. 对学生排序 Exercise07_17

    import java.util.Scanner; /** * @author 冰樱梦 * 时间:2018年下半年 * 题目:对学生排序 * */ public class Exercise07_17 ...