Java学习第二十一天

一、序列流

什么是序列流
    序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.
使用方式
    整合两个: SequenceInputStream(InputStream, InputStream)
        FileInputStream fis1 = new FileInputStream("a.txt");            //创建输入流对象,关联a.txt
        FileInputStream fis2 = new FileInputStream("b.txt");            //创建输入流对象,关联b.txt
        SequenceInputStream sis = new SequenceInputStream(fis1, fis2);  //将两个流整合成一个流
        FileOutputStream fos = new FileOutputStream("c.txt");           //创建输出流对象,关联c.txt

        int b;
        while((b = sis.read()) != -1) {                                 //用整合后的读
            fos.write(b);                                               //写到指定文件上
        }

        sis.close();
        fos.close(); 

二、序列流整合多个

整合多个: SequenceInputStream(Enumeration)
    FileInputStream fis1 = new FileInputStream("a.txt");    //创建输入流对象,关联a.txt
    FileInputStream fis2 = new FileInputStream("b.txt");    //创建输入流对象,关联b.txt
    FileInputStream fis3 = new FileInputStream("c.txt");    //创建输入流对象,关联c.txt
    Vector<InputStream> v = new Vector<>();                 //创建vector集合对象
    v.add(fis1);                                            //将流对象添加
    v.add(fis2);
    v.add(fis3);
    Enumeration<InputStream> en = v.elements();             //获取枚举引用
    SequenceInputStream sis = new SequenceInputStream(en);  //传递给SequenceInputStream构造
    FileOutputStream fos = new FileOutputStream("d.txt");
    int b;
    while((b = sis.read()) != -1) {
        fos.write(b);
    }

    sis.close();
    fos.close();

三、内存输出流

什么是内存输出流
    该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
使用方式
    创建对象: new ByteArrayOutputStream()
    写出数据: write(int), write(byte[])
    获取数据: toByteArray()
        FileInputStream fis = new FileInputStream("a.txt");
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        int b;
        while((b = fis.read()) != -1) {
            baos.write(b);
        }

        //byte[] newArr = baos.toByteArray();               //将内存缓冲区中所有的字节存储在newArr中
        //System.out.println(new String(newArr));
        System.out.println(baos);
        fis.close();

四、内存输出流之面试题

定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)
        FileInputStream fis = new FileInputStream("a.txt");             //创建字节输入流,关联a.txt
        ByteArrayOutputStream baos = new ByteArrayOutputStream();       //创建内存输出流
        byte[] arr = new byte[5];                                       //创建字节数组,大小为5
        int len;
        while((len = fis.read(arr)) != -1) {                            //将文件上的数据读到字节数组中
            baos.write(arr, 0, len);                                    //将字节数组的数据写到内存缓冲区中
        }
        System.out.println(baos);                                       //将内存缓冲区的内容转换为字符串打印
        fis.close();

五、对象操作流ObjecOutputStream

什么是对象操作流
    该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化和反序列化的操作.
使用方式
写出: new ObjectOutputStream(OutputStream), writeObject()

        public class Demo3_ObjectOutputStream {

            /**
             * @param args
             * @throws IOException 
             * 将对象写出,序列化
             */
            public static void main(String[] args) throws IOException {
                Person p1 = new Person("张三", 23);
                Person p2 = new Person("李四", 24);
        //      FileOutputStream fos = new FileOutputStream("e.txt");
        //      fos.write(p1);
        //      FileWriter fw = new FileWriter("e.txt");
        //      fw.write(p1);
                //无论是字节输出流,还是字符输出流都不能直接写出对象
                ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt"));//创建对象输出流
                oos.writeObject(p1);
                oos.writeObject(p2);
                oos.close();
            }

        }

六、对象操作流ObjectInputStream

    读取: new ObjectInputStream(InputStream), readObject()
        public class Demo3_ObjectInputStream {

            /**
             * @param args
             * @throws IOException 
             * @throws ClassNotFoundException 
             * @throws FileNotFoundException 
             * 读取对象,反序列化
             */
            public static void main(String[] args) throws IOException, ClassNotFoundException {
                ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt"));
                Person p1 = (Person) ois.readObject();
                Person p2 = (Person) ois.readObject();
                System.out.println(p1);
                System.out.println(p2);
                ois.close();
            }

        }

七、对象操作流优化

将对象存储在集合中写出
Person p1 = new Person("张三", 23);
Person p2 = new Person("李四", 24);
Person p3 = new Person("马哥", 18);
Person p4 = new Person("辉哥", 20);

ArrayList<Person> list = new ArrayList<>();
list.add(p1);
list.add(p2);
list.add(p3);
list.add(p4);

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("f.txt"));
oos.writeObject(list);                                  //写出集合对象

oos.close();

读取到的是一个集合对象
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("f.txt"));
        ArrayList<Person> list = (ArrayList<Person>)ois.readObject();   //泛型在运行期会被擦除,索引运行期相当于没有泛型
                                                                        //想去掉黄色可以加注解                    @SuppressWarnings("unchecked")
        for (Person person : list) {
            System.out.println(person);
        }

    ois.close();
注意
    要写出的对象必须实现Serializable接口才能被序列化
    不用必须加id号
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值