1、什么是Java IO?
Java IO(Input/Output)是用于处理输入和输出操作的API,它允许程序与外部世界进行数据交互。
2、IO流有哪几类?
可以从三个不同的维度进行分类:
• 1、按照流的方向(输出输入都是站在程序所在内存的角度划分的)
• 输入流:只能从中读取数据【主要由InputStream和Reader作为基类】
• 输出流:只能向其写入数据【主要由outputStream和Writer作为基类】
• 2、按照流的操作颗粒度划分
• 字节流:以字节为单元,可操作任何数据【主要由InputStream和outPutStream作为基类】
• 字符流:以字符为单元,只能操作纯字符数据,比较方便【主要由Reader和Writer作为基类】
• 3、按照流的角色划分
• 节点流:可以从/向一个特定的IO设备(如磁盘,网络)读/写数据的流,也叫【低级流,主要由】
• 处理流:用于对一个已存在的流进行连接和封装,通过封装后的流来实现数据的读/写功能,也叫【高级流】
3、BIO、NIO、AIO是什么?各自的应用场景是什么?
BIO:同步阻塞I/O。一个连接一个线程,线程发起IO请求,不管内核是否准备好IO操作,从发起请求起,线程一直阻塞,直到操作完成。
NIO:同步非阻塞I/O。一个请求一个线程。服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。用户进程也需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问。
AIO:异步非阻塞I/O(注:JDK1.7升级了NIO类库,升级后的NIO类库被称为NIO2.0也就是AIO)。一个有效请求一个线程。用户进程只需要发起一个IO操作然后立即返回,等IO操作真正的完成以后,应用程序会得到IO操作完成的通知,此时用户进程只需要对数据进行处理就好了,不需要进行实际的IO读写操作,因为真正的IO读取或者写入操作已经由内核完成了。
适用场景
BIO:适用于连接数目比较小,并且一次发送大量数据的场景;
NIO:适用于连接数目多,连接比较短,常用于聊天服务器开发工作(榜上有名的Netty是很大的实践);
AIO:适用于连接数目多,连接比较长。这个目前市面上应用还不是很广泛。
4、如何将一个 java 将对象序列化到文件中?
答:在 java 能够序列化的类必须先实现 Serializable 接口,没有抽象的方法,只是起到了标记作用。
public class Test {
public static void main(String[] args) throws Exception {
// 对象输出流
ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(new File("D://obj")));
objectOutputStream.writeObject(new User("zhangsan", 100));
objectOutputStream.close();
// 对象输入流
ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(new File("D://obj")));
User user = (User) objectInputStream.readObject();
System.out.println(user);
objectInputStream.close();
}
}