初学者对于I/O流的小节-下

**

初学者对于I/O流的小节-下

**

**

- 对象的序列化与反序列化

对象的序列化的 意思 就是把一个 Obj 转换为一个byte 序列 。
反之 就是 反序列化

序列化流 ObjectOutputStream 是过滤流
反序列化流就是 ObjectInputStream

注: 所要保存的 Obj 必须实现 序列化接口! 这个接口里面没有任何方法
如下类 首先是序列化 之前创建了一个 这个 Student的 类 里面有学号姓名身高 三个属性

    //对 对象进行序列化的实质 就是要对于对象保存
    public static void main(String[] args) {
        File file = new File("d://Student.obj");
        //这里文件后缀名可以自定义
        try {
            OutputStream out = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(out);
            Student stu = new Student("20222", "小名", 180);
            oos.writeObject(stu);
            oos.flush();
            oos.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

对象的反序列化

File file = new File("d://Student.obj");//找到刚才的文件
        try {
            InputStream in = new FileInputStream(file);
            ObjectInputStream ois = new ObjectInputStream(in);
            Student stu1 = (Student)ois.readObject();
            System.out.println(stu1.toString());

        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

注:
1.有一种特殊情况 当 我对象中的 一个类 不想被序列化的时候 只需要在类定义的时候 加上transient 关键字 就可以了。
2.如果一个类的父类实现了序列化接口,那么他的子类可以序列化。
3.在子类进行反序列化的时候,如果其父类没有实现序列化接口,那么其父类的构造方法会被调用

- New Io –NIO
顾名思义 就是新的IO 库
原来也就是上文所提到的,i/o 是使用流的方式去处理数据,而Nio 是用块的方式去处理数据。
基础实例

public static void main(String[] args) {

        //向内存申请 8 个字节的空间  的 一块缓存
        ByteBuffer buf= ByteBuffer.allocate(8);

        System.out.println(buf.position());//头指针的位置
        System.out.println(buf.limit());//限制指针的位置
        System.out.println(buf.capacity());//容量大小
        System.out.println("之后");
        buf.put((byte)11);//写入一个元素
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());
        System.out.println("之后");

        buf.flip();//因为在添加的时候 这个头指针 也就是 position 会随着增加元素的操作 往后移动
        //调用flip 方法就可以使得 position 回到开始的位置
        System.out.println(buf.position());
        System.out.println(buf.limit());
        System.out.println(buf.capacity());

        //取值 
        for (int i = 0; i < buf.remaining(); i++) {   
            //remaining 返回当前位置 与限制之间的元素数字!!
            System.out.println(buf.get(i));
        }

    }

加上文件通道 利用文件通道实现文件拷贝

public static void copy(File src,File dest)
    {
        try {
            FileInputStream in = new FileInputStream(src);
            FileOutputStream out = new FileOutputStream(dest);
            FileChannel fcIn = in.getChannel();//获取文件通道
            FileChannel fcOut = out.getChannel();

            ByteBuffer buf = ByteBuffer.allocate((int)src.length());//分配一个大小等于目标文件大小的内存块
            fcIn.read(buf);
            buf.flip();
            fcOut.write(buf);
            fcIn.close();
            fcOut.close();
            in.close();
            out.close();



        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


    }
  • RandomAccessFile
    这个类既可以读取文件,又可以写文件。有两种模式打开文件 rw 和 r
    内部有文件指针,打开文件的的时候 指针在开头。
public static void main(String[] args) {
        try {
            RandomAccessFile raf = new RandomAccessFile("d://a.txt", "rw");
            raf.writeInt(18);
            raf.writeUTF("世界");
            raf.seek(0);//开始读取之前 指针指定到初始的位置
            //开始读取
            int i = raf.readInt();
            String str = raf.readUTF();
            System.out.println(str+ i);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }

此文章为自己总结 ,欢迎大家改正批评! 不喜勿喷

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值