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
- java.io.ObjectOutputStream代表对象输出流,它的writeObject(Object obj)方法可对参数指定的obj对象进行序列化,把得到的字节序列写到一个目标输出流中。只有实现了Serializable和Externalizable接口的类的对象才能被序列化。
- 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关键字_瞬态关键字