Java基础 -- 序列化transient关键字(字段反序列化)获取用键盘输入常用的两种方法(ScannnerBufferedReader)

Posted CodeJiao

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java基础 -- 序列化transient关键字(字段反序列化)获取用键盘输入常用的两种方法(ScannnerBufferedReader)相关的知识,希望对你有一定的参考价值。

1. 序列化

  • 序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。
  • 序列化是为了解决在对对象流进行读写操作时所引发的问题。序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

说明:

  • 当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象
  • 只能将支持 java.io.Serializable 接口的对象写入流中。每个 serializable 对象的类都被编码,编码内容包括类名和类签名、对象的字段值和数组值,以及从初始对象中引用的其他所有对象的闭包。

1.1 概念

  • 序列化:把Java对象转换为字节序列的过程。
  • 反序列化:把字节序列恢复为Java对象的过程。

1.2 用途

  • 把对象的字节序列永久地保存到硬盘上,通常存放在一个文件中。
  • 在网络上传送对象的字节序列。

1.3 对象序列化

序列化API

  1. java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。
  2. java.io.ObjectInputStream代表对象输入流,它的readObject()方法从一个源输入流中读取字节序列,再把它们反序列化为一个对象,并将其返回。

示例代码:

import java.io.*;
import java.util.Date;

public class ObjectSaver 
    public static void main(String[] args) throws Exception 
        /*其中的  D:\\\\objectFile.obj 表示存放序列化对象的文件*/


        //序列化对象
        ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("D:\\\\objectFile.obj"));
        Customer customer = new Customer("王麻子", 24);
        out.writeObject("你好!");    //写入字面值常量
        out.writeObject(new Date());    //写入匿名Date对象
        out.writeObject(customer);    //写入customer对象
        out.close();


        //反序列化对象
        ObjectInputStream in = new ObjectInputStream(new FileInputStream("D:\\\\objectFile.obj"));
        System.out.println("obj1 " + (String) in.readObject());    //读取字面值常量
        System.out.println("obj2 " + (Date) in.readObject());    //读取匿名Date对象
        Customer obj3 = (Customer) in.readObject();    //读取customer对象
        System.out.println("obj3 " + obj3);
        in.close();
    


class Customer implements Serializable 
    private String name;
    private int age;
    public Customer(String name, int age) 
        this.name = name;
        this.age = age;
    

    public String toString() 
        return "name=" + name + ", age=" + age;
    

运行结果:


2. transient关键字(字段反序列化)

对于不想进行序列化的变量,使用transient关键字修饰。

transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。


3. 获取用键盘输入常用的两种方法


3.1 Scanner

Scanner:

        Scanner scanner = new Scanner(System.in);
        String str = scanner.nextLine();
        scanner.close();
!凡是属于I/O流的不关闭都会一直占用资源,要养成 用完关闭的习惯

Scaner nextLine()方法
可以得到带空格的字符串的

这个方法会接受一个完整的字符串, 当用户按下Enter键才结束输入. 
即nextLine()方法返回的是Enter键之前的所有字符,
它是可以得到带空格的字符串的。

    public static void main(String[] args) 
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个字符串");
//        输入Hello World
        String str = input.nextLine();
//        输出Hello World
        System.out.println(str);
//      凡是属于I/O流的不关闭都会一直占用资源,要养成 用完关闭的习惯
        input.close();//关闭资源
    

运行结果:

Scanner next()方法
next()方法不能获得带有空格的字符串.

next()一定要读取到有效字符后才可以结束输入,
对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,
next()方法会自动将其去掉,只有在输入有效字符之后,
next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
简单的说, next()方法不能获得带有空格的字符串.
    public static void main(String[] args) 
        Scanner input = new Scanner(System.in);
        System.out.println("请输入一个字符串");
//        输入Hello World
        String str = input.next();
//        输出Hello
        System.out.println(str);
//      凡是属于I/O流的不关闭都会一直占用资源,要养成 用完关闭的习惯
        input.close();//关闭资源
    

运行结果:


3.2 BufferedReader

BufferedReader:

        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        String str = input.readLine();


以上是关于Java基础 -- 序列化transient关键字(字段反序列化)获取用键盘输入常用的两种方法(ScannnerBufferedReader)的主要内容,如果未能解决你的问题,请参考以下文章

阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_09 序列化流_4_transient关键字_瞬态关键字

Java拾遗Java transient关键字

Java transient关键字使用小结

Java中transient关键字

java中的transient关键字详解

Java 中关键字transient引出序列化与反序列化