什么是序列化?什么是反序列化?序列化使用场景?
- 序列化: 将数据结构或对象转换成二进制字节流的过程。
- 反序列化:将在序列化过程中所生成的二进制字节流转换成数据结构或者对象的过程。
- 使用场景:如果我们需要持久化 Java 对象比如将 Java 对象保存在文件中,或者在网络传输 Java 对象,这些场景都需要用到序列化。反之将网络中或者文件中序列化的二进制流转换成java对象,就需要反序列。
- 综上:序列化的主要目的是通过网络传输对象或者说是将对象存储到文件系统、数据库、内存中。
Java 序列化中如果有些字段不想进行序列化,怎么办?
- 对于不想进行序列化的变量,使用 transient 关键字修饰。
- transient 关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被 transient 修饰的变量值不会被持久化和恢复。
- transient使用限制:
- transient 只能修饰变量,不能修饰类和方法
- transient 修饰的变量,在反序列化后变量值将会被置成类型的默认值。例如,如果是修饰 int 类型,那么反序列后结果就是 0。
- static 变量因为不属于任何对象(Object),所以无论有没有 transient 关键字修饰,均不会被序列化。
获取用键盘输入常用的两种方法?
-
通过 Scanner:
Scanner input = new Scanner(System.in); String s = input.nextLine(); input.close(); -
通过 BufferedReader:
BufferedReader input = new BufferedReader(new InputStreamReader(System.in)); String s = input.readLine(); input.close();
什么是 I/O ?
- 从计算机组成来说,就是将通过输入设备将数据传输给CPU进行运算,运算完成后将数据通过输出设备进行输出,数据的输入和输出的过程就是I/O(input/output)。
- I/O发生在内核态,用户进程只是向操作系统发起了I/O的系统调用。
UNIX 系统下,常见的I/O模型?
- 同步阻塞 I/O:应用程序发起I/O调用,操作系统准备数据,传输数据完成,然后调用结束。
- 同步非阻塞 I/O:应用程序发起I/O调用,然后直接返回,同时开始轮询查询数据是否准备完成,数据准备完成后,开始同步传输数据,数据传输完成,调用结束。
- I/O 多路复用:应用发起I/O调用,然后直接返回,同时由select去轮询数据准备的状态,如果数据准备完成后,开始同步传输数据,数据传输完成,调用结束。
- 异步 I/O:异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
Java 中 3 种常见 IO 模型?
BIO (Blocking I/O):同步阻塞 IO 模型中,应用程序发起 read 调用后,会一直阻塞,直到内核把数据拷贝到用户空间。
NIO (Non-blocking/New I/O):Java 中的 NIO 于 Java 1.4 中引入,对应 java.nio 包,提供了 Channel , Selector,Buffer 等抽象。NIO 中的 N 可以理解为 Non-blocking,不单纯是 New。它支持面向缓冲的,基于通道的 I/O 操作方法。 对于高负载、高并发的(网络)应用,应使用 NIO。
-
AIO (Asynchronous I/O):AIO 也就是 NIO 2。Java 7 中引入了 NIO 的改进版 NIO 2,它是异步 IO 模型,异步 IO 是基于事件和回调机制实现的,也就是应用操作之后会直接返回,不会堵塞在那里,当后台处理完成,操作系统会通知相应的线程进行后续的操作。
netty使用过AIO,因为速度提升不明显,就还是使用了NIO。
Java 中 I/O 流分为几种?
- 按照流的流向分:可以分为输入流和输出流。
- 按照操作单元划分:可以划分为字节流和字符流。
- 按照流的角色划分:为节点流和处理流。
I/O涉及到的类?
- Java IO 流共涉及 40 多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来的。
- InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流
- OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流
- IO流主要使用了装饰器设计模式和适配器设计模式
既然有了字节流,为什么还要有字符流?
- 不管是文件读写还是网络发送接收,信息的最小存储单元都是字节,那为什么 I/O 流操作要分为字节流操作和字符流操作呢?
- 字符流是由 Java 虚拟机将字节转换得到的,因为这个转换过程还是非常耗时,并且,如果我们不知道编码类型也很容易出现乱码问题。所以, I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。