JAVA基础复习二十二-IO流-其它流

一、序列流

* 1.什么是序列流
    * 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.
* 2.使用方式
    * 整合两个: 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();

三、内存输出流

* 1.什么是内存输出流
    * 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
    * 即只是把磁盘上的内容全都读取到内存中保存,而不是输出(可能修改)到磁盘。
* 2.使用方式
    * 创建对象: 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.toString());
        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();

五、对象操作流ObjectOutputStream(序列化)

序列化:就是将内存中的数据写入磁盘,
反序列化:就是将磁盘上的数据读到内存。
* 1.什么是对象操作流
    * 该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化和反序列化的操作.之前的字节字符流都是写入写出byte字节,或者char字符的。这个可以写入写出对象。
* 2.使用方式
* 写出: new ObjectOutputStream(OutputStream), writeObject()
/**
    * @param args
    * @throws IOException 
    * 将对象写出,序列化
*/

Person p1 = new Person("张三", 23);
Person p2 = new Person("李四", 24);

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt"));//创建对象输出流
    oos.writeObject(p1);
    oos.writeObject(p2);
    oos.close();

六、对象操作流ObjectInputStream(反序列化)

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();

八、对象操作流加上id号

    * 对象操作流要写出的对象必须实现Serializable接口才能被序列化,可以加上id,这样如果没有对象更新后没有序列化就进行反序列化操作的时候,报错就会有对应id提示,id就相当于是版本一样。
    * 不用必须加id号

九、随机访问流概述和读写数据

* A:随机访问流概述
    * RandomAccessFile类主要是可以在多线程下载的时候通过seek()方法发挥作用,比如可以指定第一条线程从0-100w个字节开始下载,然后seek(1000001),让第二个线程同时从1000001个字节开始下载,以此类推。
    * RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
    * 支持对随机访问文件的读取和写入。
  • B:read(),write(),seek()

十、数据输入输出流

* 1.什么是数据输入输出流
    * DataInputStream, DataOutputStream可以按照基本数据类型大小读写数据。之前只能操作byte和char
* 例如按Long大小写出一个数字, 写出时该数据占8字节. 读取的时候也可以按照Long类型读取, 一次读取8个字节.
* 2.使用方式
* DataOutputStream(OutputStream), writeInt(), writeLong() 

        DataOutputStream dos = new DataOutputStream(new FileOutputStream("b.txt"));
        dos.writeInt(997);
        dos.writeInt(998);
        dos.writeInt(999);

        dos.close();
* DataInputStream(InputStream), readInt(), readLong()

        DataInputStream dis = new DataInputStream(new FileInputStream("b.txt"));
        int x = dis.readInt();
        int y = dis.readInt();
        int z = dis.readInt();
        System.out.println(x);
        System.out.println(y);
        System.out.println(z);
        dis.close();

十一、Properties的概述和作为Map集合的使用

* A:Properties的概述
    * Properties 类表示了一个持久的属性集。
    * Properties 可保存在流中或从流中加载。
    * 属性列表中每个键及其对应值都是一个字符串。 

十二、Properties的特殊功能使用

* A:Properties的特殊功能
    * public Object setProperty(String key,String value)
    * public String getProperty(String key)
    * public Enumeration<String> stringPropertyNames()

十三、Properties的load()和store()功能)(了解)

load()就是可以加载一个配置文件(反序列化),通过上面的方法修改后,再通过store()方法修改配置文件(序列化)。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值