Day18个人总结

一、对象流

作用:

1、让对象在不同网络上进行传递

2、将对象存入文件,需要讲对象序列化,所谓的序列化就是将对象转化为字节的过程

对象流:就是将对象序列化以后的字节存储到本地

具体实现过程分为以下几步:

1、创建要存储的类(类中属性加上transient修饰符值将不会被写入文件)

2、使创建的类实现序列化接口

    这里需要注意的是类在实现序列化接口(implements Serializable)会有告警,是因为有给这个类发布版本信息发布版本信息如下:

 

3、使用这个类创建对象并且赋值

4、创建对象流

5、将对写入文件

对象流的读写:

对象流的特点是需要先写后读取,多个对象流的读取时按照存储顺序来读取的,并且不能跳过任何一个对象。

对象流写入和读取代码如下:(关键代码)

ObjectOutputStream oos1 = null;
       //创建person对象
       Person person1 = new Person("kobe",18);
       Person person2 = new Person("TD",19);
       ObjectInputStream ois1 = null;
       try {
           fos1 = new FileOutputStream(new File("a.txt"));
           //创建对象以及要写入的文件
           oos1 = new ObjectOutputStream(fos1);
           //将对象序列化写入到文件中
           oos1.writeObject(person1);
           oos1.writeObject(person2);
          
           //创建要读取文件的对象
           ois1 = new ObjectInputStream(new FileInputStream(new File("a.txt")));
           //这个类本身就是person类型 所以可以向下转型
           Person object1 = (Person)ois1.readObject();
           System.out.println(object1);
           Person object2 = (Person)ois1.readObject();
           System.out.println(object2);
       }

二、转换流

作用以及使用目的:

转换流是将字节流和字符流相互转换的一个过程,将字节流转换为字符流是为了提高执行效率,反之是为了增加字符流的使用范围。

转化流使用如下:(关键代码)

try {
utf-8格式 打印输出到控制台
           isr1 = new InputStreamReader(new FileInputStream(new File("b.txt")),"utf-8");
           osw1 = new OutputStreamWriter(new FileOutputStream(new File("c.txt")), "gbk");
          
           char[] chars = newchar[10];
           int num
           while((num = isr1.read(chars)) != -1){
utf-8之后打印到控制台
              //System.out.println(chars);
              //以GBk的格式写入到c.txt
              osw1.write(chars, 0, num);
           }
       }

三、标准输入输出以及重定向错误流

作用:

标准输入流(System)是为了读取控制台用户输入内容,标准输出流可以将内容从控制台输出,输出流又叫打印流(PrintWriter),可以打印将内容打印到文件,或者将内容打印到控制台,具体可以通过构造方法实现控制如下:

java 对象流有啥用 java对象流传输_对象流

 

具体使用如下:(关键代码)

try {
           // 可以将内容写入到 文件中
           PrintWriter writer = new PrintWriter(new File("a.txt"));
           writer.write("哈哈哈哈哈");
           writer.println("heheheh");
           writer.append("xixixi");
           writer.flush();
       } catch (FileNotFoundException e) {
           // TODO Auto-generated catch block
           e.printStackTrace();
       }
       // 可以将内容写到控制台上
       PrintWriter writer2 = new PrintWriter(System.out);
       writer2.write("哈哈哈哈哈");
       writer2.println("heheheh");
       writer2.append("xixixi");
       writer2.flush();
    }

 

重定向错误流:

重定向错误流重定方向标准输入输出流到文件,可以定向到任意文件

使用如下:(关键代码)

FileInputStream fis;
       try {
           fis = new FileInputStream("a.txt");
           System.setIn(fis);// 重新定向 标准输入流
           //   重定向需要放在  标准输入流之前
           InputStream is = System.in;
           byte[] b = newbyte[80];
           int count = is.read(b);
           System.out.println(new String(b,0,count));
           // 标准输出流的重定向
           PrintStream ps = new PrintStream("d.txt");
           System.setOut(ps);// 标准输出流的重定向
           PrintStream ps2 = System.out;
           ps2.print("阴天下雨了");
           ps2.flush();
           // 标准错误流的重定向
           System.setErr(ps);
           PrintStream ps3 = System.err;
           ps3.print("过了会天晴了");
           ps3.flush();
       }

四、内存流

内存流作用:

运行在内存中的流执行效率高,跟其他流不同的是,内存流是以内存为参照物,写入内存使用:ByteArrayOutputStream对象,读取文件使用ByteArrayInputStream对象使用如下:

 

使用如下:(关键代码)

ByteArrayOutputStream baos = new ByteArrayOutputStream();
       try {
           // 向内存中写入内容
           baos.write("呵呵呵呵".getBytes());
           baos.flush();
           // toByteArray() 将流中的内容 转成byte数组
           byte[] b= baos.toByteArray();
           // 创建 内存输入流
           ByteArrayInputStream bais = new ByteArrayInputStream(b);
           byte[] b2  = newbyte[50];
           int count = bais.read(b2);
           System.out.println(new String(b2,0,count));
       }

各个方法:

ByteArrayOutputStream

 

java 对象流有啥用 java对象流传输_System_02

 

注:writeTo(OutputStream out)方法内置自动刷新功能写入读取文件更加方便使用如下:

FileInputStream fis = null;
       ByteArrayOutputStream baos = null;
       try {
            fis = new FileInputStream(new File("a.txt"));
           baos = new ByteArrayOutputStream();
          
           byte[] bs = newbyte[10];
           int count = 0;
           while((count= fis.read(bs))!=-1){
              // 写到内存
              baos.write(bs, 0, count);
              baos.flush();
           }
          
          
           // 将内存中数据写到本地文件中
           // writeTo 等同于  上个类中自己写的 writeFile
           baos.writeTo(new FileOutputStream(new File("w.txt")));
       }
ByteArrayInputStream

 

 

java 对象流有啥用 java对象流传输_学习java总结_03

 

五、装饰着模式

概念:在原有基础上增加新的功能而不改变原有的方法,增加功能,提高效率,比如子类继承父类的方法,重写父类方法时不改变父类的方法,在原有方法上则增加一些功能。