JAVA I/O的基本概念

 

java中有几种类型的流? JDK为每种类型的流提供了一些抽象类以供继承,请说出他们分别是哪些类?

答: 字节流,字符流。字节流继承于InputStream OutputStream,字符流继承于InputStreamReader OutputStreamWriter。

基本概念

①.Java IO方式有哪些?

传统java.io包:对文件进行了抽象、通过输入流输出流进行IO

java.net包: 网络通信同样是IO行为

java.nio包:Java1.4中引入了NIO框架

java7的NIO2:引入了异步非阻塞IO方式

 

②.按照阻塞方式分类

BIO: 同步、阻塞

NIO:同步、非阻塞

NIO2/AIO:异步、非阻塞

 

③.传统java.io包中的IO有什么特点?

基于stream模型实现

提供了常见的IO功能: File抽象、输入输出流

交互方式:同步、阻塞的方式

在读写动作完成前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。

 

④.Stream(流)到底是什么?有什么用?

Out:代表能产出数据的数据源对象

In:代表能接受数据的数据源对象

作用:为数据源和目的地搭建一个传输通道

⑤.java.io包的好处和缺点

优点:代码简单、直观

缺点:IO效率、扩展性存在局限性,会成为应用性能的瓶颈

 

⑥.java.net下的网络信的IO行为

java.net下的网络API:Socket、ServerSocket、HttpURLConnection

这些也都属于同步阻塞IO类库

 

⑦.NIO框架是什么?

Java 1.4中引入

位于java.nio 包

提供了 Channel、Selector、Buffer 等新的抽象

 

⑧.NIO的特点?

可以构建多路复用的、同步非阻塞 IO 程序

同时提供了更接近操作系统底层的高性能数据操作方式。

 

⑨.NIO2或者AIO是什么?

NIO 2,又称为AIO(Asynchronous IO)。

在 Java 7 中,对NIO进一步改进。

引入了异步非阻塞 IO 方式,也

异步 IO 操作基于事件和回调机制—应用操作直接返回,而不会阻塞,当后台处理完成后,操作系统会通知相应线程进行后续工作。

 

⑩.nio和io相比性能优势在于哪里?

IO面向流,从Stream中逐步读取数据,并且没有缓冲区。

NIO面向面向缓冲区,数据整体操作更加高效。

IO是阻塞的,当前线程在没有数据可读时会出现阻塞。

NIO是非阻塞的,通过Selector选择器选择合适的Channel进行数据操作。当一个Channel没有数据时,会切换到有效的Channel处理其他io,更搞笑。

 

⑪.NIO的性能就一定比IO高?如果是带缓冲的IO和NIO相比呢?

传统的IO理论上是没有NIO快的: 用IO进行一个字节一个字节的读取。

但是如果合理使用,如带缓冲区的IO(BufferedInputStream、BufferedReader)时会很快。

此外根据测试在进行文件拷贝等IO操作时,会发现NIO并没有比IO更快,甚至在个别场景还会出现NIO更慢的情况

IBM官方指明:JDK1.4时已经将java.io以nio为基础重新进行了实现,可以利用一些NIO的特性。因此处理方面的性能并不比NIO差。

 

⑫.NIO的真正优势并不是体现在速度上?

随着JDK1.4对IO进行了重构。NIO在速度上的优势并不存在了。

NIO真正优势体现在:

分散和聚集: 利用Scatter/Gather委托操作系统完成数据分散和聚集的工作

文件锁定功能:

网络异步IO: 非阻塞IO、IO多路复用(解决服务端多线程时的线程占用问题)

 

⑬同步和异步的区别?

同步-synchronous

异步-asynchronous

同步是一种可靠的有序运行机制,同步操作时,后续的任务会等待当前调用的返回。

异步中,其他任务不会等待当前调用返回,通常依靠事件、回调等级制来实现任务间次序关系

 

⑭阻塞和非阻塞的区别?

阻塞-blocking

非阻塞-non-blocking

阻塞操作时,当前线程会处于阻塞状态,无法进行其他任务,只有当满足一定条件时,才继续执行

非阻塞状态,不会去等待IO操作结束,会立即返回。相应操作会在后台处理

 

⑮阻塞和同步就是低效的?

需要根据应用的实际场景。有些时候必须要进行阻塞和同步。

 

 

猜你喜欢

转载自blog.csdn.net/qq_34823218/article/details/106698972