11、Java IO NIO

Java IO 方式有很多种,基于不同的 IO 抽象模型和交互方式,可以进行简单区分。

传统的 java.io 包,它基于流模型实现,提供了我们最熟知的一些 IO 功能,比如 File 抽象、输入输出流等。交互方式是同步、阻塞的方式,也就是说,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞在那里,它们之间的调用是可靠的线性顺序。java.io 包的好处是代码比较简单、直观,缺点则是 IO 效率和扩展性存在局限性,容易成为应用性能的瓶颈。很多时候,人们也把 java.net 下面提供的部分网络 API,比如 Socket、ServerSocket、HttpURLConnection 也归类到同步阻塞 IO 类库,因为网络通信同样是 IO 行为。

JDK 1.4 中引入了 NIO 框架(java.nio 包),提供了 Channel、Selector、Buffer 等新的抽象,可以构建多路复用的、同步非阻塞 IO 程序,同时提供了更接近操作系统底层的高性能数据操作方式。

在 Java 7 中,NIO 有了进一步的改进,也就是 NIO 2,引入了异步非阻塞 IO 方式,也有很多人叫它 AIO(Asynchronous IO)。异步 IO 操作基于事件和回调机制,可以简单理解为,应用操作直接返回,而不会阻塞在那里,当后台处理完成,操作系统会通知相应线程进行后续工作。

从传统 IO(BIO) 到 NIO、NIO 2(AIO),其中有很多地方可以扩展开来,考察点涉及方方面面,比如:

  • 基础 API 功能与设计, InputStream/OutputStream 和 Reader/Writer 的关系和区别。
  • NIO、NIO 2 的基本组成。
  • 给定场景,分别用不同模型实现,分析 BIO、NIO 等模式的设计和实现原理。
  • NIO 提供的高性能数据操作方式是基于什么原理,如何使用?
  • 或者,从开发者的角度来看,你觉得 NIO 自身实现存在哪些问题?有什么改进的想法吗?

原文地址:https://www.cnblogs.com/xuan5301215/p/9120861.html

时间: 2024-10-11 20:27:50

11、Java IO NIO的相关文章

第11篇-JAVA IO

第11篇-JAVA IO 每篇一句 :不要在失败时才想起别人的忠告,不要在失去之后才想起珍惜 初学心得: 环境越艰难,越会出聪明人 (笔者:JEEP/711)[JAVA笔记 | 时间:2017-04-17| JAVA IO流 ] 1.流概念 流是指一连串流动的字符,是以先进先出方式发送信息的通道 即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作 2.JAVA IO流 Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入/输

对java IO,NIO简单操作

对 IO,NIO的简单操作,详细看如下代码 1.InputStream,OutputStream是对字节流的操作,Reader,Writer是对字符的操作 2.对大文件的拷贝使用RandomAccessFile类和NIO 1 import java.io.*; 2 import java.nio.ByteBuffer; 3 import java.nio.channels.FileChannel; 4 5 public class IOWriteRead { 6 7 public static

Java IO NIO详细讲解

1.IO Java IO概述 2.NIO Java NIO浅析 原文地址:https://www.cnblogs.com/yixiu868/p/11396821.html

一文理解Java IO/NIO/AIO

  目录 概述 一.IO流(同步.阻塞) 二.NIO(同步.非阻塞) 三.NIO2(异步.非阻塞) 正文 概述 在我们学习Java的IO流之前,我们都要了解几个关键词 同步与异步(synchronous/asynchronous):同步是一种可靠的有序运行机制,当我们进行同步操作时,后续的任务是等待当前调用返回,才会进行下一步:而异步则相反,其他任务不需要等待当前调用返回,通常依靠事件.回调等机制来实现任务间次序关系 阻塞与非阻塞:在进行阻塞操作时,当前线程会处于阻塞状态,无法从事其他任务,只有

170407、java基于nio工作方式的socket通信

客户端代码: /** * */ package com.bobohe.nio; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio

【java】缓冲字符字节输入输出流:java.io.BufferedReader、java.io.BufferedWriter、java.io.BufferedInputStream、java.io.BufferedOutputStream

BufferedReader最重要,因为有个方法public String readLine() 1 package System输入输出; 2 3 import java.io.BufferedReader; 4 import java.io.IOException; 5 import java.io.InputStreamReader; 6 7 public class Test { 8 public static void main(String[] args) throws IOExce

【java】内存流:java.io.ByteArrayInputStream、java.io.ByteArrayOutputStream、java.io.CharArrayReader、java.io.CharArrayWriter

1 package 内存流; 2 3 import java.io.ByteArrayInputStream; 4 import java.io.ByteArrayOutputStream; 5 import java.io.IOException; 6 import java.io.InputStream; 7 import java.io.OutputStream; 8 9 public class Test { 10 public static void main(String[] arg

【Java基础】11、java方法中只有值传递,没有引用传递

转自:http://www.cnblogs.com/linkstar/p/5951141.htmlpublic class Example { String testString = new String("good"); char[] testCharArray = {'a','b','c'}; public static void main(String[] args){ Example ex = new Example(); ex.change(ex.testString,ex.

191108、Java IO流读写文件的几个注意点

平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? 解决这个问题之后,总结了几个注意点. 注意点一:Reader/Writer读写二进制文件是有问题的 : 上面代码使用BufferedReader一行一行地读取一个文件,然后使用BufferedWriter把读取到的数据写到另外一个文件中.如果文件是ASCCII形式的,则内容还是能够正确读取的.但如