天天看点

JAVA常见笔试面试总结(四)(IO流)

1.什么是绝对路径,什么是相对路径?

绝对路径:包括盘符在内的完整路径

相对路径:在当前文件目录下的文件路径

在开发中尽量使用绝对路径

2.描述一下File类,及其作用

一.这个类的对象可以对应着一个文件或者一个文件目录

二.File中的方法都是对文件的操作,而不是对文件中内容的操作

三.File类的对象通常作为IO流中具体类的构造器的形参

四.renameTo方法:A.renameTo(B),要求A必须存在,B一定不存在,并且方法执行结束,A被删除,在B的位置出现文件

3.IO流的分类方式

IO流有两种分类方式:

节点流(程序与文件直接连接),处理流(依赖于节点流,相当于包裹着节点流)

字符流(处理文本文件),字节流(处理类似图片,视频等文件)

其中节点流包括:FileInputStream,FileOutputStream,FileReader,FileWriter

4.常用的IO流简介

一.字符流

JAVA常见笔试面试总结(四)(IO流)

其中BufferedReader和BufferWriter为缓冲流,比较常用

二.字节流

JAVA常见笔试面试总结(四)(IO流)

5.什么是序列化和反序列化

序列化:将java中的对象转化成字节流的过程叫做序列化

反序列化:将字节流转化成java中对象的过程叫做反序列化

6.序列化中SerialVersionUID有什么作用?

主要作用:Java 的序列化机制是通过在运行时判断类的serialVersionUID来验证版本一致性的;如果你改变啦一个类的属性,那么已经被序列化的java对象将无法恢复,因为此时该类的serialVersionUID已经发生改变,不能匹配

7.Transient关键词

该关键字,只能修饰属性,表示该属性不被序列化,注意:被static关键字修饰的变量也不能被序列化,因为static修饰的属性是属于类的,序列化是针对对象而言的;Transient关键字对final修饰的变量无效

8.实现序列化机制的对象对应的类的要求

该类实现Serializable接口

该类的属性也必须实现Serializable接口

给该类提供一个序列版本号

属性声明为static或者transient的,不可以实现序列化

9.IO,NIO,AIO区别

一.首先需要明确几个概念:

IO中的同步,异步,阻塞,非阻塞

同步I/O 每个请求必须逐个地被处理,一个请求的处理会导致整个流程的暂时等待,这些事件无法并发地执行。用户线程发起I/O请求后需要等待或者轮询内核I/O操作完成后才能继续执行。

异步I/O 多个请求可以并发地执行,一个请求或者任务的执行不会导致整个流程的暂时等待。用户线程发起I/O请求后仍然继续执行,当内核I/O操作完成后会通知用户线程,或者调用用户线程注册的回调函数。

阻塞 某个请求发出后,由于该请求操作需要的条件不满足,请求操作一直阻塞,不会返回,直到条件满足。

非阻塞 请求发出后,若该请求需要的条件不满足,则立即返回一个标志信息告知条件不满足,而不会一直等待。一般需要通过循环判断请求条件是否满足来获取请求结果。

同步和异步着重点在于多个任务执行过程中,后发起的任务是否必须等先发起的任务完成之后再进行。而不管先发起的任务请求是阻塞等待完成,还是立即返回通过循环等待请求成功。

而阻塞和非阻塞重点在于请求的方法是否立即返回(或者说是否在条件不满足时被阻塞)。

二.IO和NIO

IO:同步阻塞式IO

NIO:同步非阻塞式IO

IO是面向流的,NIO是面向缓冲的;

IO是阻塞的,NIO是非阻塞的;

IO是单线程的,NIO 是通过选择器来模拟多线程的;

三.NIO中的一些概念以及如何实现非阻塞

Buffer:BIO将数据直接读写到Stream对象中 ,NIO的数据操作都是在缓冲区中进行的,缓冲区实际上是一个数组,常见类型ByteBuffer,CharBuffer,ShortBuffer,IntBuffer,LongBuffer,FloutBuffer,DoubleBuffer

Channel:在NIO中被用来支持批量式IO操作的一种抽象,与流不同,通道是双向的

Selector:选择器,它提供一种高效机制,不断轮询注册在其上的Channel,找出处于就绪状态,通过SelectionKey取得就绪的Channel集合,进行后续的IO操作

在NIO中,一个线程 Thread 使用一个选择器 Selector 通过轮询的方式去监听多个通道 Channel 上的事件,从而让一个线程就可以处理多个事件,避免啦多个线程切换造成的性能上的浪费

通过配置监听的通道 Channel 为非阻塞,那么当 Channel 上的 IO 事件还未到达时,就不会进入阻塞状态一直等待,而是继续轮询其它 Channel,找到 IO 事件已经到达的 Channel 执行,这就是NIO实现非阻塞的关键

四.AIO

AIO:非阻塞异步通信模式,基于事件和回调机制,采用异步通道实现异步通信

对AIO来说,它不是在IO准备好时再通知线程,而是在IO操作已经完成后,再给线程发出通知。因此AIO是不会阻塞的,此时我们的业务逻辑将变成一个回调函数,等待IO操作完成后,由系统自动触发。

AIO实现异步的关键:

read/write方法都是异步的,完成后会主动调用回调函数,配合异步通道实现AIO异步