当前位置: 首页 > 工具软件 > Bible Reader > 使用案例 >

面试之Java圣经8

南宫凯康
2023-12-01

今天来说说IO

一、IO是什么?

IO就是input和output。简单的解释就是输入和输入,针对不同的操作对象,可以划分为磁盘I/O模型,网络I/O模型,内存映射I/O, Direct I/O、数据库I/O等,只要具有输入输出类型的交互系统都可以认为是I/O系统。那么Java是怎么操作这些IO呢。

二、JavaIO体系

Java 的 I/O 大概可以分成以下几类:

  • 磁盘操作:File
  • 字节操作:InputStream 和 OutputStream
  • 字符操作:Reader 和 Writer
  • 对象操作:Serializable
  • 网络操作:Socket
  • 新的输入/输出:NIO

2.1磁盘操作:

        1. File类主要是JAVA为文件这块的操作(如删除、新增等)而设计的相关类

        2. File类的包名是java.io,其实现了Serializable, Comparable两大接口以便于其对象可序列化和比较

2.2字节和字符操作:

        字节流:数据流中最小的数据单元是字节.

        字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节(无论中文还是英文都是两个字节)。

字节和字符流的区别:

         1. 字节流适合所有类型文件的数据传输,因为计算机字节(Byte),是电脑中表示信息含义的最小单位。字符只能够处理纯文本数据,其他数据类型不行,但是字符流处理文本比字节流处理文本要方便。

        2.在读写文件需要对内容按行处理,处理行级别选择字符流,只是读写文件,与内容无关选择字节流。

JavaIO中的设计模式

        使用装饰器和适配器模式

        适配器模式:把一个类的接口变成客户端所期望的接口,而使两个原本接口不匹配放在一起工做

Reader reader = new INputStreamReader(inputStream);

        装饰器模式:一种动态的往一个类中添加行为的模式,装饰器模式相比于子类更加灵活,其在于给某个对象加而不是整个类加。

new BufferedInputStream(new FileInputStream( inputStream));

阻塞IO和非阻塞IO

        IO操作包括:对于硬盘的读写,对于socket的读写及外设的读写。

        当用户发起一个IO请求操作时,内核就去查看读取的数据是否就绪,对于阻塞IO来说,如果数据没有就绪,则会一直等待,指导数据就绪,对于非阻塞IO来说,如果数据没有就绪,则会返回一个标志信息告知用户线程当前读取的数据未就绪,当数据就绪之后,便将数据拷贝到用户线程。这样才算完成了一个完整的IO请求操作。

BIO、NIO、AIO的区别

        BIO:同步并阻塞,在服务器中实现模式为一个连接一个线程,当客户端发起读写请求时,服务器就需要启动一个线程进行处理,如果这个连接不做任何事情,就会造成不必要的开销。当前也可以通过线程池机制来改善。

        NIO:同步并非阻塞,在服务器实现的模式为一个请求一个线程,客户端发送的请求都会注册到多路复用器上,多路复用器轮询有连接IO请求操作才会启动一个线程进行处理,NIO一般适用于连接数剧目比较多,连接毕竟短的架构

        AIO异步并非阻塞,在服务器实现模式为一个有限有效请求一个线程,当客户端的IO请求都是通过操作系统先完成之后,在通知服务器去启动线程进行处理。一般适用于连接数目比较多,连接比较长的架构。


总结

IO操作

 类似资料: