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操作结束,会立即返回。相应操作会在后台处理
⑮阻塞和同步就是低效的?
需要根据应用的实际场景。有些时候必须要进行阻塞和同步。