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

来源:互联网 发布:科比个赛季数据统计 编辑:程序博客网 时间:2024/05/15 01:15

**

初学者对于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
原创粉丝点击