做cpa联盟必须要有网站吗,分销网站开发,上海设计院,免费免费建网站1. 什么是IO
Java中I/O是以流为基础进行数据的输入输出的#xff0c;所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。
在Java类库中#xff0c;IO部分的内容是很庞大的#xff0c;因为它涉及的领…1. 什么是IO
Java中I/O是以流为基础进行数据的输入输出的所有数据被串行化(所谓串行化就是数据要按顺序进行输入输出)写入输出流。简单来说就是java通过io流方式和外部设备进行交互。
在Java类库中IO部分的内容是很庞大的因为它涉及的领域很广泛标准输入输出文件的操作网络上的数据传输流字符串流对象流等等等。
比如程序从服务器上下载图片就是通过流的方式从网络上以流的方式到程序中在到硬盘中。
2. 同步与异步阻塞与非阻塞的区别
同步一个任务的完成之前不能做其他操作必须等待等于在打电话
异步一个任务的完成之前可以进行其他操作等于在聊QQ
阻塞是相对于CPU来说的 挂起当前线程不能做其他操作只能等待
非阻塞,无须挂起当前线程可以去执行其他操作
3. 什么是BIO
BIO同步并阻塞服务器实现一个连接一个线程即客户端有连接请求时服务器端就需要启动一个线程进行处理没处理完之前此线程不能做其他操作如果是单线程的情况下我传输的文件很大呢当然可以通过线程池机制改善。BIO方式适用于连接数目比较小且固定的架构这种方式对服务器资源要求比较高并发局限于应用中JDK1.4以前的唯一选择但程序直观简单易理解。
4. 什么是NIO
NIO同步非阻塞服务器实现一个连接一个线程即客户端发送的连接请求都会注册到多路复用器上多路复用器轮询到连接有I/O请求时才启动一个线程进行处理。NIO方式适用于连接数目多且连接比较短轻操作的架构比如聊天服务器并发局限于应用中编程比较复杂JDK1.4之后开始支持。
5.什么是AIO
AIO异步非阻塞服务器实现模式为一个有效请求一个线程客户端的I/O请求都是由操作系统先完成了再通知服务器应用去启动线程进行处理AIO方式使用于连接数目多且连接比较长重操作的架构比如相册服务器充分调用操作系统参与并发操作编程比较复杂JDK1.7之后开始支持。.
AIO属于NIO包中的类实现其实IO主要分为BIO和NIOAIO只是附加品解决IO不能异步的实现在以前很少有Linux系统支持AIOWindows的IOCP就是该AIO模型。但是现在的服务器一般都是支持AIO操作
6. 什么Netty
Netty是由JBOSS提供的一个Java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具用以快速开发高性能、高可靠性的网络服务器和客户端程序。Netty 是一个基于NIO的客户、服务器端编程框架使用Netty 可以确保你快速和简单的开发出一个网络应用例如实现了某种协议的客户服务端应用。Netty相当简化和流线化了网络应用的编程开发过程例如TCP和UDP的socket服务开发。
Netty是由NIO演进而来使用过NIO编程的用户就知道NIO编程非常繁重Netty是能够能跟好的使用NIO。
7. BIO和NIO、AIO的区别
BIO是阻塞的NIO是非阻塞的
BIO是面向流的只能单向读写NIO是面向缓冲的, 可以双向读写
使用BIO做Socket连接时由于单向读写当没有数据时会挂起当前线程阻塞等待为防止影响其它连接需要为每个连接新建线程处理.然而系统资源是有限的,不能过多的新建线程线程过多带来线程上下文的切换从来带来更大的性能损耗因此需要使用NIO进行BIO多路复用使用一个线程来监听所有Socket连接使用本线程或者其他线程处理连接。
AIO是非阻塞 以异步方式发起 I/O 操作。当 I/O 操作进行时可以去做其他操作由操作系统内核空间提醒IO操作已完成不懂的可以往下看
8. IO流的分类 按照读写的单位大小来分
字符流 以字符为单位每次次读入或读出是16位数据。其只能读取字符类型数据。 (Java代码接收数据为一般为 char数组也可以是别的 )
字节流以字节为单位每次次读入或读出是8位数据。可以读任何类型数据图片、文件、音乐视频等。 (Java代码接收数据只能为 byte数组 )
按照实际IO操作来分
输出流从内存读出到文件。只能进行写操作。
输入流从文件读入到内存。只能进行读操作。
注意输出流可以帮助我们创建文件而输入流不会。
按照读写时是否直接与硬盘内存等节点连接分
节点流直接与数据源相连读入或读出。
处理流也叫包装流是对一个对于已存在的流的连接进行封装通过所封装的流的功能调用实现数据读写。如添加个Buffering缓冲区。意思就是有个缓存区等于软件和mysql中的redis
注意为什么要有处理流主要作用是在读入或写出时对数据进行缓存以减少I/O的次数以便下次更好更快的读写文件才有了处理流。
9. 五种IO模型
注意我这里的用户空间就是应用程序空间
1、阻塞BIOblocking I/O
A拿着一支鱼竿在河边钓鱼并且一直在鱼竿前等在等的时候不做其他的事情十分专心。只有鱼上钩的时才结束掉等的动作把鱼钓上来。在内核将数据准备好之前系统调用会一直等待所有的套接字默认的是阻塞方式。
2、非阻塞NIOnoblocking I/O
B也在河边钓鱼但是B不想将自己的所有时间都花费在钓鱼上在等鱼上钩这个时间段中B也在做其他的事情一会看看书一会读读报纸一会又去看其他人的钓鱼等但B在做这些事情的时候每隔一个固定的时间检查鱼是否上钩。一旦检查到有鱼上钩就停下手中的事情把鱼钓上来。 B在检查鱼竿是否有鱼是一个轮询的过程。
3、异步AIOasynchronous I/O
C也想钓鱼但C有事情于是他雇来了D、E、F让他们帮他等待鱼上钩一旦有鱼上钩就打电话给CC就会将鱼钓上去。
当应用程序请求数据时内核一方面去取数据报内容返回另一方面将程序控制权还给应用进程应用进程继 续处理其他事情是一种非阻塞的状态。
4、信号驱动IOsignal blocking I/O
G也在河边钓鱼但与A、B、C不同的是G比较聪明他给鱼竿上挂一个铃铛当有鱼上钩的时候这个铃铛就会被碰响G就会将鱼钓上来。
信号驱动IO模型应用进程告诉内核当数据报准备好的时候给我发送一个信号对SIGIO信号进行捕捉 并且调用我的信号处理函数来获取数据报。
5、IO多路转接I/O multiplexing
H同样也在河边钓鱼但是H生活水平比较好H拿了很多的鱼竿一次性有很多鱼竿在等H不断的查看每个鱼竿是否有鱼上钩。增加了效率减少了等待的时间。IO多路转接是属于阻塞IO但可以对多个文件描述符进行阻塞监听所以效率较阻塞IO的高。
IO多路转接是多了一个select函数select函数有一个参数是文件描述符集合对这些文件描述符进行循环 监听当某个文件描述符就绪时就对这个文件描述符进行处理。
10. 什么叫对象序列化什么是反序列化实现对象序列化需要做哪些工作
对象序列化将对象以二进制的形式保存在硬盘上
反序列化将二进制的文件转化为对象读取
实现serializable接口不想让字段放在硬盘上就加transient
11. Java中流类的超类主要有那些
超类代表顶端的父类都是抽象类
java.io.InputStream
java.io.OutputStream
java.io.Reader
java.io.Writer 接口不想让字段放在硬盘上就加transient
11. Java中流类的超类主要有那些
超类代表顶端的父类都是抽象类
java.io.InputStream
java.io.OutputStream
java.io.Reader
java.io.Writer