天天看点

文件的读写,java中的IO

  • java IO的进化史,java提供了io的操作类库,使用流进行读取和写入。此时文件的读取写入是同步阻塞的,即线程等待io操作完成,以进行下一步的操作。这时如果io操作太耗时,则造成了大量的浪费,此时线程就无法去做别的事,造成浪费。
  • 从内存方面来说,BIO(即同步阻塞IO)的流操作,在文件读取时从磁盘读取到内存态,再从内核态空间读取到用户态空间。
  • 内核态空间:即指存储操作系统和驱动程序等相关的程序运行的内存空间称之为内核态空间。
  • 用户态空间:用户的应用,普通的服务使用的。举个通俗的例子:比如我们的电脑有一个c盘,称之为系统盘,系统盘一般只建议存储系统相关的应用软件,其他的硬盘则存储你需要安装的其他软件。这就是一个隔离,隔离的好处是互不影响,即你重装系统也不影响你的应用的存储。格式化系统盘重装系统往往可以应对大部分的病毒,木马。
    文件的读写,java中的IO
  • 上边的示意图就是BIO的读取和写入。
  • BIO的好处是操作简单,运行安全,没有复杂的线程上下文切换,运行环境单一。
  • 自jdk1.4 java提供了NIO,这是一个同步非阻塞的IO操作,利用多路复用的思想,在IO进行时,该线程并不阻塞,可以继续执行其他操作。比如这么一个场景,一个请求过来进行一次IO,如果是阻塞的,那么该请求就不会被线程处理,因为该线程处在阻塞状态,如果是NIO,那么多路复用的情况,它不会阻塞等待上一个IO的结果,那么该次来的请求就会被同一个线程处理。这样就实现了快速的响应,当其中一个IO完成,那么线程就会去处理完成该IO 应该去做的事情。
  • 自jdk1.7 提供了AIO,即异步非阻塞IO,在多路复用的基础上,利用时间回调,通知,大大提高了响应。 AIO在线程执行IO操作时,就可以返回结果,不去等待。这也说明一个道理,如果你的结果不依赖IO的操作,利用AIO 是一个很好的做法,比如你就去读一个文件写入服务器,无论成功与否你都可以返回成功。利用补偿机制,当写入失败时进行补偿操作,以保证写入操作的正确性。
  • AIO操作完毕后,通知回调方法,去做一些事情。这样就避免了等待,可以迅速返回结果。比如与前台进行交互,这样就可以大大提高程序的响应速度。
  • 三种IO 各有各的用途,不能一概而论,根据你的场景选择合适的IO。