Java学习日记——DAY20

今天继续学习了IO流的内容,学习内容如下:

1.文件字节流操作:

实现二进制文件的复制

2.用ObjectInputStream和ObjectOutputStream实现将对象序列化在文件中的读写:

/*Student s1 = new Student(11,"小明");
        try(FileOutputStream fw = new FileOutputStream("读写对象.txt"); ObjectOutputStream out = new ObjectOutputStream(fw)) {
            out.writeObject(s1);
        }catch (IOException e){
            e.printStackTrace();
        }*/

        try(FileInputStream fis = new FileInputStream("读写对象.txt");ObjectInputStream ois = new ObjectInputStream(fis)){
            Student t= (Student) ois.readObject();
            System.out.println(t);
        }catch (IOException e){
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }

实现对对象的读写操作时必须注意该类必须实现Serializable或Externalizable接口;

3.Serializable和Externalizable

Serializable:

需要提供final static修饰的serialVersionUID进行版本号的统一,可以通过使用transient修饰符来修饰不需要序列化的成员,同时无法序列化static修饰的成员,如果序列化的成员是引用类型则该类型也必须可序列化;

Externalizable:

相比于Serializable更加灵活,也需要给出final static修饰的serialVersionUID进行版本号的统一,同时还需要对writeExternal和readExternal进行重写,在其中挑选想要被序列化的成员,Externalizable可以将transient修饰的成员序列化,并且Externalizable在反序列化的时候会默认调用无参构造方法;

二者的区别与联系:

Serializable序列化过程是递归,相对较缓慢,对于禁止序列化的成员使用transient修饰,在面对属性较多又有一些不需要进行序列化的变量过程较复杂,无法控制字段序列化和反序列化的形式,序列化在处理对象时,不会默认调用构造方法,缺失了构造方法内的逻辑;

而Externalizable序列化更加灵活,可以指定成员指定形式进行序列化,必须重写writeExternal和readExternal并且对于transient和static修饰的成员可以进行序列化,会默认调用无参构造函数;

4.标准输入输出

System.in:标准输入,默认对应的是键盘;

System.out标准输出,默认对应的是显示器;

System.err标准错误输出,默认对应的是显示器;

通过对于标准输入和标准输出流的修改完成文件的复制操作:

 try(FileInputStream fis =new FileInputStream("母文件.txt");BufferedInputStream bis =new BufferedInputStream(fis);
        FileOutputStream fos = new FileOutputStream("子文件.txt");){
            System.setIn(bis);
            System.setOut(new PrintStream(fos));
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            String s;
            while((s= br.readLine())!=null){
                System.out.println(s);
            }
        }catch (IOException e) {
            e.printStackTrace();
        }

5.ByteArrayInputStream和ByteArrayOutputStream

FileWriter,FileReader,FileInputStream,FileOutputStream,都是对于磁盘上文件的存取操作,java虚拟机无权访问硬盘上的资源,需要借助操作系统,java借助完了之后需要通知系统释放资源,所以我们把源头换为一块内存,直接使用java虚拟机的那块内存,使用完不用关闭;

所有的东西都可以转成字节数组,并且字节数组为二进制方便在网络上传输;

文件可以无限的往里面加数据,最终存储在磁盘中,但内存速度快,容量小,所以不建议进行数据量特别大的操作;

  String s = "abcdefg";
        byte[] bytes = s.getBytes();
        ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
        int v;
        v=bais.read();
        System.out.println((char)v);
        bais.mark(1);
        v=bais.read();
        System.out.println((char)v);
        v=bais.read();
        System.out.println((char)v);
        v=bais.read();
        System.out.println((char)v);
        bais.reset();
        v=bais.read();
        System.out.println((char)v);
        v=bais.read();
        System.out.println((char)v);

在使用ByteArrayInputStream时支持设立回档点(mark())和回档(reset())的操作,若没有进行回档点设立则默认回到初始位置;

6.DataInputStream和DataOutputStream

类似于ObjectInputStream和ObjectOutputStream对数据进行序列化存储,区别在于DataInputStream和DataOutputStream是对于常见类型数据如(int String char,double...)等数据进行序列化存取;

以上就是我的学习内容请大家批评斧正;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值