总结篇(21)---Java IO
Java IOIO主要有两个重点一是IO的架构模型二是IO的操作一、IO的架构模型目前主要有三大类IO(BIO)、NIO、AIO。1IOBIO同步阻塞式IO适用于连接数目比较小且固定的架构。即一个线程发起IO请求后一直阻塞直到操作完成。当线程执行 read() 或 write() 系统调用时数据未就绪前线程一直阻塞直到数据拷贝完成才返回。每次连接都需要独立线程处理。2NIO同步非阻塞式IO适合于连接数目多且连接比较短轻操作的架构。即一个线程轮询检查多个连接的数据状态只有数据真正准备好时才进行实际的读写。reactor模型通过 Selector 实现 I/O 多路复用。线程注册感兴趣的事件后即可轮询数据就绪时再发起读写操作但读写过程本身仍是阻塞的。3AIO异步非阻塞式IO适用于连接数目多且连接比较长重操作的架构。即一个线程发起IO请求后直接返回当操作系统完成数据拷贝后再主动通知线程来处理。proactor模型基于操作系统真正的异步 I/O 支持如 Windows IOCP。线程发起读写请求后立即返回由内核完成数据拷贝后通过回调或 Future 通知应用程序。总结与对比:特性BIO (Blocking I/O)NIO (Non-blocking I/O)AIO (Asynchronous I/O)核心包java.iojava.niojava.nio.channelsI/O 模型同步阻塞同步非阻塞 (多路复用)异步非阻塞线程模型一连接一线程一线程管理多连接 (Selector)操作系统回调通知数据操作面向流 (单向)面向缓冲区 (Buffer) (双向)面向缓冲区 (Buffer)阻塞点read()/write()处仅在select()处可能阻塞无阻塞回调完成适用场景连接数少低并发连接数多高并发 (短连接)连接数多高并发 (长连接文件)备注1、IO中同步和异步的区别同步和异步是相对于应用和内核的交互方式而言的。同步需要主动去询问而异步的时候内核在IO事件发生的时候通知应用程序。2、IO中阻塞式和非阻塞式的区别阻塞式和非阻塞式是针对于进程在访问数据的时候根据IO操作的就绪状态来采取不同方式说白了是一种读取或者写入操作函数的实现方式。阻塞方式下读取或者写入函数将一直等待。非阻塞式方式下读取或者写入函数会立即返回一个状态值。3、Reactor和Proactor模式的区别Reactor和Proactor模式的主要区别是真正的读取和写入操作是由谁来完成的。Reactor中需要应用程序自己读取或写入数据。而Proactor模式中应用程序不需要进行实际的读写过程它只需要从缓冲区读取或写入即可操作系统会读取缓冲区或者写入缓冲区到真正的IO设备。二、IO的操作我们先来实例一个IO操作/** ** Java文件读写操作 **/ //读文件 try{ FileInputStream fis new FileInputStream(suncat.txt); BufferedInputStream bis new BufferInputStream(fis); String content null; //自定义缓冲区 byte[] buffer new byte[1024]; int flag 0; while( (flag bis.read(buffer)) ! -1){ content new String(buffer,0,flag); } System.out.println(content); //关闭的时候只需要关闭最外层的流就行了 bis.close(); }catch(Exception e){ e.printStackTrace(); } //写文件 try{ FileOutputStream fos new FileOutputStream(suncat.txt); BufferedOutputStream bos new BufferedOutputStream(fos); String content xxxxxxxxxxx; bos.write(content.getBytes(),0,content.getBytes().length); bos.flush(); bos.close(); }catch(Exception e){ e.printStackTrace(); }Java IO流共涉及40多个类这些类看上去很杂乱但实际上很有规律而且彼此之间存在非常紧密的联系Java IO流的40多个类都是从如下4个抽象基类中派生出来的。1InputStream字节输入流的基类2OutputStream字节输出流的基类3Reader字符输入流的基类4Writer字符输出流的基类下图是按照操作方式的分类图其实Java IO流中分类还有几种分类方式不过都大同小异。1按照流的流向分输入流和输出流。2按照操作单元划分字节流和字符流。3按照流的角色划分节点流和处理流。备注1.输入流和输出流的区别输入和输出的方向是针对程序而言向程序中读入数据就是输入流从程序中向外写出数据就是输出流。2.字节流和字符流的区别以stream结尾都是字节流以reader和writer结尾都是字符流两者的区别就是读写的时候一个是按字节读写一个是按字符。在实际使用时差不多。在读写文件需要对内容按行处理比如比较特定字符处理某一行数据的时候一般会选择字符流。只是读写文件和文件内容无关一般选择字节流。3.节点流和处理流的区别节点流和处理流的定义1节点流可以从或者向一个特定的地方节点读写数据。2处理流用来包装节点流是对一个已存在的流的连接和封装通过所封装的流的功能调用实现数据读写。节点流和处理流的区别和联系1节点流是低级流直接跟数据源相接。处理流也叫包装流把节点流包装了一层属于修饰器设计模式不会直接与数据源相接通过处理流来包装节点流可以消除不同节点流的实现差异也可以提供更方便的方法来完成输入输出。2处理流的功能主要体现在以下两个方面1性能的提升主要以增加缓冲的方式来提高输入输出的效率。2操作的便捷处理流可能提供了一系列便捷的方法来一次输入输出大批量的内容而不是输入/输出一个或多个。更多java基础总结适合于java基础学习、java面试常规题总结篇(1)---复用类总结篇(2)---多态总结篇(3)---内部类 (1)内部类的基本概念总结篇(4)---内部类 (2)内部类之静态内部类总结篇(5)---内部类 (3)内部类之成员内部类总结篇(6)---内部类 (4)内部类之局部内部类总结篇(7)---内部类 (5)内部类之匿名内部类总结篇(8)---序列化总结篇(9)---字符串及基本类 (1)字符串及基本类之基本数据类型总结篇(10)---字符串及基本类 (2)字符串及基本类之java中公共方法及操作总结篇(11)---字符串及基本类 (3)String对象总结篇(12)---字符串及基本类 (4)Integer对象总结篇(13)--- Java注解及元注解总结篇(14)---JVM(java虚拟机) (1)JVM虚拟机概括总结篇(15)---JVM(java虚拟机) (2)类加载器总结篇(16)---JVM(java虚拟机) (3)运行时数据区总结篇(17)---JVM(java虚拟机) (4)垃圾回收总结篇(18)---JVM(java虚拟机) (5)垃圾回收算法总结篇(19)---JVM(java虚拟机) (6)JVM调优总结篇(20)---反射总结篇(21)---Java IO总结篇(22)---Java 进程总结篇(23)---Java线程及其相关(1)线程介绍总结篇(24)---Java线程及其相关(2)多线程及其问题总结篇(25)---Java线程及其相关(3)线程池及其问题总结篇(26)---Java线程及其相关(4)ThreadLocal总结篇(27)---Java并发及锁(1)Synchronized总结篇(28)---Java并发及锁(2)Volatile总结篇(29)---Java并发及锁(3)Lock总结篇(30)---Java并发及锁(4)常见锁及分类总结篇(31)---JUC工具类(1)CountDownLatch总结篇(32)---JUC工具类(2)CyclicBarrier总结篇(33)---JUC工具类(3)Semaphore总结篇(34)---JUC工具类(4)Exchanger