转换流与JSON

转换流:

FileReader读数据默认UTF-8,用他读GBK会乱码

InputStreamReader类:

Read的子类,字符输入流,继承AutoCloseable接口,不能单独使用,是一个包装流,将字节流转换成字符流

OutputStreamWriter类:

Writer的子类,字符输出流,继承AutoCloseable接口,不能单独使用,是一个包装流,将字节流转换为字符输出流,默认GBK加载输出

Ssystem.lineSeparator() //换行

打印流:

PrintStreaam(字节)

System.out.setOut() //把流对象替换

System.out.println()中out属于变量默认public static final修饰,初值为null,属于PrintStream,PrintStream属于FilterOutputStream。


import java.io.IOException;
import java.io.PrintStream;

public class Test2 {
    public static void main(String[] args) {
       try( PrintStream printStream = new PrintStream("D:\\kaifamiao\\java\\zuoye\\day15test1.txt");){
           printStream.println(1);
           char[] chars = {'s','d','e','v'};
           printStream.print(chars);
           System.out.println(1);
           System.setOut(printStream);  //会把System.out.println(2);从控制台转换到文件中输出
           System.out.println(2);
       }catch (IOException e){
           System.out.println(e.getMessage());
       }

    }
}

数据流:

DataOutputStream(数据输出流)

包装流,构造中可以传入(FileOutputStream)

write(byte[] b,int off,int len)

write(int b)

writeBoolean(true)

writeDouble()

writeByte()

DataInputStream(数据输入流)

包装流,构造中可以传入(FileInputStream),底层依赖InputStream

注:写顺序和读顺序必须一样否则会乱码

使用对象流读取对象信息

浅拷贝:创建一个新对象,将原始对象的值复制到新对象中,只复制对象属性值,若存在引用数据类型,拷贝引用值。引用数据类型1中包含引用数据类型2,会复制引用数据类型的属性值给新对象,但是引用数据类型2是地址。在重写方法中直接return super.clone();

注:clone()属于Object的方法,抛出CloneNotSupportedException要实现Cloneable接口,重写clone()。

**深拷贝:**创建一个新对象,并将原始对象的所有成员变量(包括引用类型)递归的复制到新对象中,默认情况下,clone()是浅拷贝,要是实现深拷贝,在对象的clone()方法中进行额外的处理,递归的复制引用类型的成员变量。引用数据类型1中包含引用数据类型2,复制引用数据类型1的属性,创建2的对象,并将2的属性赋值给2的对象,并返回。

注:如果不实现Cloneable接口,重写clone()会抛出异常.

序列化:

将对象的属性放入文本文件中

核心:保存对象状态,对象状态可存储

反序列化:从文本文件中获取对象信息

Serializable接口:

标记接口,表示一个类具有序列化能力

序列化实现:二进制,平台无关

ObjectOutputStream:包装字节流,实现AutoCloseable接口,可以传入OutputStream

void writeObject(Object o)

反序列化:

ObjectInputStream:包装流,实现AutoCloseable接口,可以传入InputStream

Object readObject()

写入文件在读出,引用数据类型== :false,equals():true, 序列化和反序列化是深刻隆

transient关键字:修饰成员变量,表示该字段不会参与序列化过程,用于排除敏感‘不必要字段

serialversionUID:用于版本控制,确保序列化与反序列化的兼容性,不写,可能会抛出InvalidClassException

若不显示指定seralvw=ersionUID,java会依据类结构自动生成

private static final long seralVersionUID = 1l;

若值没变化,修改字段值可以序列化or反序列化,若值改变,不可。

解析JSON:

应用场景:数据传输,配置文件

特点:

  1. 简洁
  2. 可读
  3. 跨语言
  4. 数据结构:数组,对象等

lombok注解:

@NoArgsConstructor和@AllArgsConstructor:生成无参构造函数和带参数构造函数

@Data:等价同时使用@Getter、@Setter、@ToString、@EqualsAndHashCode,生成所有这些方法。

fastjson:转换对象和JSON字符串

gson:谷歌的一个转换对象和JSON字符串的jar包

hutool-all:一个java工具包

jackson-annotaions、jackson-databind、jackson-core:jackson转换对象和JSON字符串


import java.io.Serializable;
import java.util.Objects;

public class Student1 implements Serializable {

    private static final long seralVersionUID = 1l;
    private String name;
    private int age;
    public Student1(){}

    public Student1(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Student1 student)) return false;
        return age == student.age && Objects.equals(name, student.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
        return "Student1{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

fastjson

import com.alibaba.fastjson2.JSON;

public class FastjsonTest {
    public static void main(String[] args) {
        Student1 s = new Student1("张三",25);
        String jsonString = JSON.toJSONString(s);//将对象转换成字符串
        System.out.println(jsonString);
        Object parse = JSON.parse(jsonString);  //将字符串转换成json对象,但是不能调用对象的属性
        Student1 student = JSON.parseObject(jsonString, Student1.class);  //传入json字符串形式的对象和运行时类型,转换成对象,可调用属性
        student.getAge();

        System.out.println(parse);


    }
}

Hutool

import cn.hutool.json.JSONUtil;

public class HutoolTest {
    public static void main(String[] args) {
        Student1 student = new Student1("张三",2);
        String jsonStr = JSONUtil.toJsonStr(student);  //将对象转换成json字符串
        System.out.println(jsonStr);
        Student bean = JSONUtil.toBean(jsonStr, Student.class);

    }
}

Gson

import com.google.gson.Gson;

public class GsonTest {
    public static void main(String[] args) {
        Gson gson = new Gson();
        String student = """
                {
                "name" : "张三",
                "age" : 5
                }
                """;
        Student student1 = gson.fromJson(student, Student.class);  //将json格式的字符串转换成对象
        System.out.println(student1);
        String json = gson.toJson(student1);  //将对象转换成json字符串
        System.out.println(json);

    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值