java io 二进制方式存储对象到文件

本文记录利用java 字节流把对象保存本地文件,然后读取到对象中。旨在练习常用javaio操作。

用到的java io流如下:

BufferedOutputStream 输出缓冲流,可以包装一个输出流,优化流的写入效率。
DataOutputStream 二进制输出流,可以包装一个输出流,用于向文件写入二进制数据。

BufferedInputStream 数据缓冲流,可以包装一个输入流,优化流的读取效率。
DataInputStream可以包装一个输入流,用于读取二进制内容。

代码如下:

//测试代码
public class TestIO {

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        List<User> users = new ArrayList<User>();
        for (int i = 0; i < 10; i++) {
            User user = new User();
            user.name = "张文X" + i;
            user.id = i;
            users.add(user);
        }

        // 新建文件
        File file = new File("user.data");
        boolean isExits = file.exists();
        if (!isExits) {
            try {
                file.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        if (file.exists()) {
            // 写数据
            BufferedOutputStream bufferOut = null;
            DataOutputStream dataOut = null;
            Path path = Paths.get(file.getPath());
            try {

                bufferOut = new BufferedOutputStream(
                        Files.newOutputStream(path));
                dataOut = new DataOutputStream(bufferOut);
                dataOut.writeInt(users.size());

                for (User user : users) {
                    user.write(dataOut);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                Utils.close(dataOut);
            }

            // 读数据
            BufferedInputStream bufferInput = null;
            DataInputStream dataInput = null;
            try {
                bufferInput = new BufferedInputStream(
                        new FileInputStream(file));

                dataInput = new DataInputStream(bufferInput);
                int size = dataInput.readInt();
                List<User> readUsers = new ArrayList<User>();
                for (int i = 0; i < size; i++) {
                    User user = new User();
                    user.read(dataInput);
                    readUsers.add(user);
                }
                printUser(readUsers);

            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } finally {
                Utils.close(dataInput);
            }

        }

    }

    /**
     * @param users
     *            打印读取数据
     */
    public static void printUser(List<User> users) {
        for (User user : users) {
            System.out.println(user.toString());

        }

    }

}
//关闭流工具类
public class Utils {

    // 关闭流
    public static void close(Closeable... clos) {
        for (Closeable clo : clos) {
            try {
                clo.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

}
//user实体类
public class User {
    public String name;
    public int id;

    //写入数据
    public void write (DataOutputStream out) throws IOException{

        out.writeUTF(name);

        out.writeInt(id);

    }

    //读取数据
    public void read(DataInputStream input) throws IOException{

        name  = input.readUTF();

        id = input.readInt();

    }

    @Override
    public String toString() {
        return "User [name=" + name + ", id=" + id + "]";
    }


}

运行结果:
这里写图片描述

希望本文对你有所帮助

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值