目录

1.在了解不同的IO之前先了解:同步与异步,阻塞与非阻塞的区别:

2.BIO NIO AIO 分别代表什么?(面试简答):

3.BIO和NIO、AIO的区别:

4.java中io流的分类:

•  FileInputStream(按照字节输入)

•  FileOutputStream(按照字节输出)

• FileReader(字符输入)

• FileWriter(字符输出)

• 节点流与处理流

节点流和处理流的区别和联系 :

• BufferedReader/BufferedWriter

• BufferedInputStream/BufferedOutputStream

• 对象流-ObjectInputStream 和 ObjectOutputStream

• 标准输入输出流

• 转换流-InputStreamReader 和 OutputStreamWriter

• properties类


1.在了解不同的IO之前先了解:同步与异步,阻塞与非阻塞的区别:

• 同步,一个任务的完成之前不能做其他操作,必须等待(等于在打电话)
• 异步,一个任务的完成之前,可以进行其他操作(等于在聊QQ)
• 阻塞,是相对于CPU来说的, 挂起当前线程,不能做其他操作只能等待
• 非阻塞,,无须挂起当前线程,可以去执行其他操作

2.BIO NIO AIO 分别代表什么?(面试简答):

1.BIO:

Block IO即同步阻塞式IO(比如io包下的InputStream类),就是我们平常使用的传统IO,它的特点是:模式简单,使用方便,并发处理能力低。

2.NIO:

New IO即同步非阻塞IO(比如nio包下的ByteBuffer类),是传统IO 的升级,客户端和服务器端通过 Channel(通道)通讯,实现了多路复用。

3.AIO:

Asynchronous IO是NIO的升级,也叫NIO2,实现了异步非阻塞IO,异步IO的操作基于事件和回调机制。

3.BIO和NIO、AIO的区别:

• BIO是阻塞的,NIO是非阻塞的。
• BIO是面向流的,只能单向读写,NIO是面向缓冲的, 可以双向读写。
使用BIO做Socket连接时,由于单向读写,当没有数据时,会挂起当前线程,阻塞等待,为防止影响其它连接,需要为每个连接新建线程处理.,然而系统资源是有限的,不能过多的新建线程,线程过多带来线程上下文的切换,从来带来更大的性能损耗,因此需要使用NIO进行BIO多路复用,使用一个线程来监听所有Socket连接,使用本线程或者其他线程处理连接。
• AIO是非阻塞 以异步方式发起 I/O 操作。当 I/O 操作进行时可以去做其他操作,由操作系统内核空间提醒IO操作已完成。

4.java中io流的分类:

•  FileInputStream(按照字节输入)

String filePath = "e:\\hello.txt";//字节数组 byte[] buf = new byte[8];//一次读取 8 个字节. int readLen = 0;FileInputStream fileInputStream = null;try { //创建 FileInputStream 对象,用于读取 文件 fileInputStream = new FileInputStream(filePath); //从该输入流读取最多 b.length 字节的数据到字节数组。 此方法将阻塞,直到某些输入可用。 // 如果返回-1 , 表示读取完毕 //如果读取正常, 返回实际读取的字节数 while ((readLen = fileInputStream.read(buf)) != -1) {System.out.print(new String(buf, 0, readLen));//显示 }} catch (IOException e) {e.printStackTrace();} finally { //关闭文件流,释放资源. try {fileInputStream.close();} catch (IOException e) {e.printStackTrace();}}

注: new FileOutputStream(filePath)创建,当写入内容时,会从文件首位开始写入(会造成覆盖问题),可以new FileOutputStream(filePath,true)追加到文件末尾。

•  FileOutputStream(按照字节输出)

@Test//如果文件不存在,则创建改文件public void writeFile(){FileOutputStream fileOutStream = null;try {fileOutStream = new FileOutputStream("f:\\a.txt");//写入一个字节fileOutStream.write('H');//写入一个字符串String str = "hello,java!";fileOutStream.write(str.getBytes());} catch (Exception e) {e.printStackTrace();}finally {try {fileOutStream.close();} catch (IOException e) {e.printStackTrace();}}}

注:输出流如果没有找到指定路经下的文件或文件夹,会先创建,在写入。

• FileReader(字符输入)

@Testpublic void readFile01() {int readLen = 0;char[] ch = new char[8];FileReader fileReader = null;try {fileReader = new FileReader("f:\\hello.txt");while ((readLen = fileReader.read(ch)) != -1) {System.out.print(new String(ch, 0, readLen));}} catch (Exception e) {e.printStackTrace();} finally {try {fileReader.close();} catch (IOException e) {e.printStackTrace();}}}

• FileWriter(字符输出)

FileWriter fileWriter = null;try {fileWriter = new FileWriter("f:\\note.txt");fileWriter.write("生如夏花");} catch (IOException e) {e.printStackTrace();}finally {try {fileWriter.close();} catch (IOException e) {e.printStackTrace();}}

注:使用后,必须关闭close()或刷新frush(),否则写入不到指定的文件。

是因为底层close()有writeBytes()等方法,这才是真正开始写入。

• 节点流与处理流

节点流和处理流的区别和联系 :

• BufferedReader/BufferedWriter

//文件拷贝
BufferedReader bufferedReader = null;BufferedWriter bufferedWriter = null;String line;bufferedReader = new BufferedReader(new FileReader("f:\\a.java"));bufferedWriter = new BufferedWriter(new FileWriter("f:\\a2.java"));while ((line = bufferedReader.readLine())!=null){//没读一行bufferedWriter.write(line);bufferedWriter.newLine();//换行符}bufferedReader.close();bufferedWriter.close();

• BufferedInputStream/BufferedOutputStream

//文件拷贝FileInputStream fileInputStream = null;FileOutputStream fileOutputStream = null;try {fileInputStream = new FileInputStream("f:\\tuzi.jpg");fileOutputStream = new FileOutputStream("e:\\tuzhi.jpg");//定义一个数组,提高效率byte[] buf = new byte[1024];int readLen = 0;while ((readLen = fileInputStream.read(buf))!= -1){//边读边写fileOutputStream.write(buf,0,readLen);//一定要这个方法}} catch (Exception e) {e.printStackTrace();}finally {try {fileInputStream.close();fileOutputStream.close();} catch (IOException e) {e.printStackTrace();}}}

注:二进制文件(声音,视频,doc,pdf.....)使用字节流 。

使用包装流(处理流)时,结束时只需要关闭外层流即可 (底层会自动关闭它所包装的流)。

• 对象流-ObjectInputStream 和 ObjectOutputStream

• ObjectOutputStream 提供 序列化功能。
• ObjectInputStream 提供 反序列化功能。

• 标准输入输出流

• System.in    编译类型:InputStream  运行类型:BufferedInputStream

• System.out   编译类型:PrintStream  运行类型:PrintStream

• 转换流-InputStreamReader 和 OutputStreamWriter


/*** 解决中文乱码问题* 将字节流 FileInputStream 转成字符流 InputStreamReader, 指定编码 gbk/utf-8*/
public class InputStreamReader_ {public static void main(String[] args) throws Exception {String filePath = "f:\\a.txt";InputStreamReader gbk = new InputStreamReader(new FileInputStream(filePath), "gbk");BufferedReader bufferedReader = new BufferedReader(gbk);}
}

• properties类

专门用于读写配置文件的集合类。

注: 底层为hashtable。

Java的IO流 ,BIO NIO AIO 的区别?相关推荐

  1. Java的IO:BIO | NIO | AIO

    原文: http://my.oschina.net/bluesky0leon/blog/132361 BIO | NIO | AIO,本身的描述都是在Java语言的基础上的.而描述IO,我们需要从两个 ...

  2. java io流区别_Java中IO流的分类和BIO,NIO,AIO的区别

    到底什么是IO 我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢? 拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目 ...

  3. Java中IO流的分类和BIO,NIO,AIO的区别

    到底什么是IO 我们常说的IO,指的是文件的输入和输出,但是在操作系统层面是如何定义IO的呢?到底什么样的过程可以叫做是一次IO呢? 拿一次磁盘文件读取为例,我们要读取的文件是存储在磁盘上的,我们的目 ...

  4. IO模式-BIO,NIO,AIO

    目前常用的3种IO模式:分别是BIO.NIO和AIO. BIO BIO 全称Block-IO 是一种同步且阻塞的通信模式.是一个比较传统的通信方式,模式简单,使用方便.但并发处理能力低,通信耗时,依赖 ...

  5. BIO ,NIO,AIO的区别

    IO的方式通常分为几种,同步阻塞的BIO.同步非阻塞的NIO.异步非阻塞的AIO. 一.BIO 在JDK1.4出来之前,我们建立网络连接的时候采用BIO模式,需要先在服务端启动一个ServerSock ...

  6. Java之IO,BIO,NIO,AIO

    2019独角兽企业重金招聘Python工程师标准>>> 参考文献一 IO基础知识回顾 java的核心库java.io提供了全面的IO接口.包括:文件读写.标准设备输出等.Java中I ...

  7. Java IO(BIO, NIO, AIO) 总结

    文章转载自:JavaGuide 目录 BIO,NIO,AIO 总结 同步与异步 阻塞和非阻塞 1. BIO (Blocking I/O) 1.1 传统 BIO 1.2 伪异步 IO 1.3 代码示例 ...

  8. IO之 java中BIO NIO AIO原理、区别以及应用

    在本篇文章中,我们主要介绍一下java中的BIO NIO AIO,重点是NIO 先说一下同步.异步.阻塞和非阻塞. 简单来讲,同步和异步是针对内核和应用程序之间的交互而言的:阻塞和非阻塞其实是针对进程 ...

  9. JAVA IO : BIO NIO AIO

    JAVA IO : BIO NIO AIO 同步异步.阻塞非阻塞概念 同步与异步 阻塞与非阻塞 IO VS NIO VS AIO 面向流与面向缓冲 阻塞与非阻塞IO BIO.NIO.AIO的JAVA实 ...

最新文章

  1. 百度程序员妻子质疑老公不忠!每天很晚回家!周五下班不回家,说领导带他喝酒!结婚一年就出轨?...
  2. Android 高仿新浪微博底部导航栏,实现双击首页Tab,页面的ListView滚动、刷新
  3. 米兔积木机器人能飞吗_米兔积木机器人APP使用教程
  4. selenium python 安装
  5. osgCallback的实现方法及原理
  6. 20145313张雪纯《信息安全系统设计基础》第11周学习总结
  7. c语言solaris中图形库,成功弄出simics下的CDE登录界面,与大家分享
  8. 嵌入式OS入门笔记-以RTX为案例:三.初探进程
  9. IntelliJIDEA和tomcat在浏览器js乱码问题解决
  10. client中周期性边界_化工中的流体力学问题(附多物理场视频)
  11. 推荐一篇我高中同班同学的文章[转载]
  12. 直播、录屏软件OBS Studio下载安装操作教程
  13. 你会如何选型电容?关于电容的ESR?如何理解电容的阻抗-频率曲线?
  14. 怎样做用户体验企业网站建设的流程?珠海网站建设
  15. 嵌入式系统开发笔记17:CJ/T-188 冷热量表协议解析6
  16. 时间序列预测中使用类EMD方法时的信息泄露和计算量问题
  17. 软件测试人员是选择大公司好,还是选择小公司更好
  18. 创建计算机桌面快捷方式图标异常,桌面图标显示异常怎么解决
  19. Android生日礼物(含拼图游戏,背景音乐,自动拨号等功能实现)--根据代码规范修改注释以及定义
  20. 银河麒麟4.0.2配置网络源

热门文章

  1. TTL、RS232、485到底能传输多远距离?
  2. 电脑快捷键:Ctrl+26英文字母组合,新人必会!
  3. 身份证号码验证C语言函数
  4. js实现身份证号码验证
  5. 【06月05日】A股滚动市净率PB历史新低排名
  6. 计算机网络的社会环境分析_计算机网络的功能和应用
  7. js:如何删除dom元素
  8. 面试项目经理,这12个问题一定会被问到(建议收藏)
  9. 一文读懂电磁学发展史[图文版]
  10. 上坡和下坡(文章很短,道理很深)