JAVA.SE转换流,序列化流,装饰者设计模式

1 转换流

1.1编码和解码

编码:把字符流转化为字节流比如说“a”->97(0110 0001)
解码:把字节转化为字符,97->a

1.2字符集

一个系统支持所有的字符集合(文字,标点符号,图形符号)

1.3字符编码

字符编码:比如字符a对应的码值为97

1.4常见的字符编码

ASCII:ASCII编码:规定所有字符都占用一个字节
GBK:GBK编码,规定所有字符都占用两个字节
Unicode UTF-8编码,规定每个字符都占用三个字节
注意:IDEA默认使用UTF-8,windows默认使用GBK编码
使用InputStreamReader解决读取中问问题
InputStreamReader extends Reader
构造方法
public InputStreamReader(InputStream in,String charsetName);//指定使用何种编码读文件
public InputStreamReader(InputStream in);//使用工具默认的编码去读文件(IDEA默认UTF-8)



package com.itcast.Text02;

import java.io.*;

public class Demo03 {
    public static void main(String[] args) throws IOException {
        InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream("1.txt"), "UTF-8");
        int read = inputStreamReader.read();
        System.out.println(read);
        inputStreamReader.close();
        

    }
}

1.5使用OutputStreamWriter写不同的编码中文

OutputStreamWriter extends Writer

public OutputStreamWriter(OutputStream out,String charsetName);//写文件时指定编码
public OutputStreamWriter(OutputStream out);//使用工具默认的编码写文本(IDEA是UTF-8)

package com.itcast.Text02;

import java.io.*;

public class Demo04 {
    public static void main(String[] args) throws IOException {
        OutputStreamWriter gbk = new OutputStreamWriter(new FileOutputStream("1.txt"), "GBK");

        gbk.write("你好,二哈");
        gbk.close();

    }
}

//GBK IDEA打开默认乱码,不乱码定义成UTF-8

在这里插入图片描述

文件转换编码:


package com.itcast.Text02;

import java.io.*;

public class Demo05 {
    public static void main(String[] args) throws IOException {
        InputStreamReader gbk = new InputStreamReader(new FileInputStream("1.txt"), "GBK");
        OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("2.txt"), "UTF-8");
        int len = 0;
        while ((len = gbk.read()) != -1) {
            writer.write(len);

        }
        writer.close();
        gbk.close();

    }
}



2.序列化流

2.1序列化流的介绍

序列化流:写出对象的流。ObjectOutputStream
反序列化流: 读取对象的流,OjectInputStream

2.2ObjectOutputStream的介绍和使用

需要实例化一个Java。io。Serializable接口
该接口没方法,一般称为标记接口
序列化操作


package com.itcast.Text02;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Demo06_Serializable {
    public static void main(String[] args) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("1.txt"));
        Dog dog = new Dog("旺财", "北京");

        objectOutputStream.writeObject(dog);
        objectOutputStream.close();
//保存的数据乱码
    }
}


反序列化:
ObjectInputStream的介绍和使用
public ObjectInputStream(InputStream in);
反序列化的操作

package com.itcast.Text02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Dmeo07 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("1.txt"));
        Dog object = (Dog) objectInputStream.readObject();
        System.out.println(object);
        objectInputStream.close();
        
    }
}


反序列化的两种常见异常:
ClassNotFoundException没有找到异常类
出现原因:序列化之后,反序列化之前,删除原来的那个异常类
InvalidClassException无效异常
序列化之后,反序列化之前修改了那个类

package com.itcast.Text02;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;

public class Demo08 {
    public static void main(String[] args) throws IOException {
        ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream("1.txt"));
        ArrayList<Dog> dogs = new ArrayList<>();
        dogs.add(new Dog("旺财", "北极"));
        dogs.add(new Dog("来福", "南极"));
        dogs.add(new Dog("阿斗", "蜀国"));
        dogs.add(new Dog("刘禅", "蜀国"));

        objectOutputStream.writeObject(dogs);
        objectOutputStream.close();

    }
}




package com.itcast.Text02;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class Demo09 {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream("1.txt"));
        ArrayList<Dog> dogs = (ArrayList<Dog>) objectInputStream.readObject();

        objectInputStream.close();
        for (Dog dog : dogs) {
            System.out.println(dog);

        }

    }
}


3.打印流

3.1打印流的介绍

1.打印流PrintStream
2.打印流中重写各种数据类型的print和println方法,打印数据时非常方便
3.打印流不会抛出IOException(会抛出别的Exception)

构造方法
    public PrintStream(String path);
	public PrintStream(File file);
	public PrintStream(OutputStream out);

成员方法:
	public void print(各种类型); //不带换行的打印
	public void println(各种类型); //带换行的打印

public class PrintStreamDemo {
    public static void main(String[] args) throws Exception {
    
        PrintStream ps1 = new PrintStream("p.txt");

     
        ps1.println('a');
        ps1.println(97);
        ps1.println(true);
        ps1.println(100);
        ps1.println("HelloWorld");
        ps1.close();
    }
}


4.装饰者设计模式

装饰模式的作用
装饰模式是在不改变元类,动态的扩展一个对象功能
装饰类与被装饰类必须实现同统一的接口
在装饰类中必须传入被装饰类的引用
在装饰类中需对扩展方法进行扩展
在装饰类中,不需要调用装饰类中的同名方法
案例:


package com.itcast.Text02;

public class Demo10 {
    public static void main(String[] args) {
        Liudehua l = new Liudehua();
        LiudehuaWrapper liudehuaWrapper = new LiudehuaWrapper(l);
        liudehuaWrapper.sing();
        liudehuaWrapper.dace();


    }

    interface SingStar {
        void sing();

        void dace();
    }

   private static class Liudehua implements SingStar {
        @Override
        public void sing() {
            System.out.println("啊哈,给我一杯忘情水");

        }

        @Override
        public void dace() {
            System.out.println("蹦砂卡拉卡");
        }
    }

    //装饰类
    static class LiudehuaWrapper implements SingStar {
        private Liudehua ldh;

        public LiudehuaWrapper(Liudehua ldh) {
            this.ldh = ldh;
        }

        @Override
        public void sing() {
            System.out.println("刘德华在北京鸟巢跳舞");
            ldh.sing();

        }

        @Override
        public void dace() {
            System.out.println("刘德华在北京西单跳舞");
            ldh.dace();

        }
    }



}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值