IO体系

129 阅读3分钟
BIO、NIO、AIO有什么区别?

一、同步阻塞I/O(BIO):

同步阻塞I/O,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器就需要启动一个进行处理,如果这个连接不做任何事情会造成不必要的线程开销,可以通过线程池机制来改善。BIO方式适用于连接数目比较小且固定的架构,这种方式对服务端资源要求比较高,并发局限于应用中,在jdk1.4以前是唯一的io现在,但程序直观简单易理解。

二、同步非阻塞I/O(NIO)

同步非阻塞I/O,服务器实现模式为一个请求到一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。NIO方式适用于连接数目且连接比较短(轻操作)的架构,比如聊天服务器,并发局限于应用中,编程比较复杂,jdk1.4开始支持

三、异步非阻塞I/O(AIO):

异步非阻塞I/O,服务器实现模式为一个有效请求一个线程,客户端的IO请求都是由操作系统先完成了再通知服务器用其启动线程进行处理。AIO方式适用于连接数目多且连接比较长(重操作)的架构,比如相册服务器,充分调用OS参与并发操作,编程比较复杂,jdk1.7开始支持。

Files的常用方法都有哪些?
Files.exists() 检测文件路径是否存在
Files.createFile() 创建文件
Files.createDirectory() 创建文件夹
Files.delete() 删除文件或者目录
Files.copy() 复制文件
Files.move() 移动文件
Files.size() 查看文件个数
Files.read() 读取文件
Files.write() 写入文件
既然有了字节流,为什么还要有字符流?

字符流是由Java虚拟机将字节转换得到的,问题就出在这个过程还算是非常耗时的,并且,如果我们不知道编码类型就很容易出现乱码问题。所以,I/O 流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。

什么是java序列化? 什么情况下需要序列化?

序列化: 将Java对象转换成字节流的过程 反序列化: 将字节流转换成Java对象的过程 当 Java 对象需要在网络上进行传输 或者 持久化存储到文件中时, 就需要对 Java 对象进行序列化处理。 序列化的实现:类实现 Serializable 接口,这个接口没有需要实现的方法。实现 Serializable 接口是为了告诉 jvm 这个类的对象可以被实例化。

Java序列化中如果有些字段不想进行序列化,怎么办?

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

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

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

方法1:通过 Scanner

Scanner input = new Scanner(System.in);
String s = input.nextLine();
input.close();

方法2:通过BufferedReader

BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
String s = input.nextLine();