IO流学习总结

一 Java IO,硬骨头也能变软

(1) 按操作方式分类结构图:

(2)按操作对象分类结构图

二 java IO体系的学习总结

  1. IO流的分类:

    • 按照流的流向分,可以分为输入流和输出流;
    • 按照操作单元划分,可以划分为字节流和字符流;
    • 按照流的角色划分为节点流和处理流。
  2. 流的原理浅析:

    java Io流共涉及40多个类,这些类看上去很杂乱,但实际上很有规则,而且彼此之间存在非常紧密的联系, Java Io流的40多个类都是从如下4个抽象类基类中派生出来的。

    • InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。
    • OutputStream/Writer: 所有输出流的基类,前者是字节输出流,后者是字符输出流。
  3. 常用的io流的用法

三 Java IO面试题

NIO与AIO学习总结

一 Java NIO 概览

  1. NIO简介:

    Java NIO 是 java 1.4, 之后新出的一套IO接口NIO中的N可以理解为Non-blocking,不单纯是New。

  2. NIO的特性/NIO与IO区别:

    • 1)IO是面向流的,NIO是面向缓冲区的;
    • 2)IO流是阻塞的,NIO流是不阻塞的;
    • 3)NIO有选择器,而IO没有。
  3. 读数据和写数据方式:

    • 从通道进行数据读取 :创建一个缓冲区,然后请求通道读取数据。

    • 从通道进行数据写入 :创建一个缓冲区,填充数据,并要求通道写入数据。

  4. NIO核心组件简单介绍

    • Channels
    • Buffers
    • Selectors

二 Java NIO 之 Buffer(缓冲区)

  1. Buffer(缓冲区)介绍:

    • Java NIO Buffers用于和NIO Channel交互。 我们从Channel中读取数据到buffers里,从Buffer把数据写入到Channels;
    • Buffer本质上就是一块内存区;
    • 一个Buffer有三个属性是必须掌握的,分别是:capacity容量、position位置、limit限制。
  2. Buffer的常见方法

    • Buffer clear()
    • Buffer flip()
    • Buffer rewind()
    • Buffer position(int newPosition)
  3. Buffer的使用方式/方法介绍:

    • 分配缓冲区(Allocating a Buffer):
    ByteBuffer buf = ByteBuffer.allocate(28);//以ByteBuffer为例子
    • 写入数据到缓冲区(Writing Data to a Buffer)

    写数据到Buffer有两种方法:

    1.从Channel中写数据到Buffer

    int bytesRead = inChannel.read(buf); //read into buffer.

    2.通过put写数据:

    buf.put(127);
  4. Buffer常用方法测试

    说实话,NIO编程真的难,通过后面这个测试例子,你可能才能勉强理解前面说的Buffer方法的作用。

三 Java NIO 之 Channel(通道)

  1. Channel(通道)介绍

    • 通常来说NIO中的所有IO都是从 Channel(通道) 开始的。
    • NIO Channel通道和流的区别:
  2. FileChannel的使用
  3. SocketChannel和ServerSocketChannel的使用
  4. ️DatagramChannel的使用
  5. Scatter / Gather
    • Scatter: 从一个Channel读取的信息分散到N个缓冲区中(Buufer).
    • Gather: 将N个Buffer里面内容按照顺序发送到一个Channel.
  6. 通道之间的数据传输
    • 在Java NIO中如果一个channel是FileChannel类型的,那么他可以直接把数据传输到另一个channel。
    • transferFrom() :transferFrom方法把数据从通道源传输到FileChannel
    • transferTo() :transferTo方法把FileChannel数据传输到另一个channel

四 Java NIO之Selector(选择器)

  1. Selector(选择器)介绍

    • Selector 一般称 为选择器 ,当然你也可以翻译为 多路复用器 。它是Java NIO核心组件中的一个,用于检查一个或多个NIO Channel(通道)的状态是否处于可读、可写。如此可以实现单线程管理多个channels,也就是可以管理多个网络链接。
    • 使用Selector的好处在于: 使用更少的线程来就可以来处理通道了, 相比使用多个线程,避免了线程上下文切换带来的开销。
  2. Selector(选择器)的使用方法介绍

    • Selector的创建
    Selector selector = Selector.open();
    • 注册Channel到Selector(Channel必须是非阻塞的)
    channel.configureBlocking(false);
    SelectionKey key = channel.register(selector, Selectionkey.OP_READ);
    • SelectionKey介绍

      一个SelectionKey键表示了一个特定的通道对象和一个特定的选择器对象之间的注册关系。

    • 从Selector中选择channel(Selecting Channels via a Selector)

      选择器维护注册过的通道的集合,并且这种注册关系都被封装在SelectionKey当中.

    • 停止选择的方法

      wakeup()方法 和close()方法。

  3. 模板代码

    有了模板代码我们在编写程序时,大多数时间都是在模板代码中添加相应的业务代码。

  4. 客户端与服务端简单交互实例

五 Java NIO之拥抱Path和Files

一 文件I/O基石:Path:

  • 创建一个Path
  • File和Path之间的转换,File和URI之间的转换
  • 获取Path的相关信息
  • 移除Path中的冗余项

二 拥抱Files类:

  • Files.exists() 检测文件路径是否存在
  • Files.createFile() 创建文件
  • Files.createDirectories()和Files.createDirectory()创建文件夹
  • Files.delete()方法 可以删除一个文件或目录
  • Files.copy()方法可以吧一个文件从一个地址复制到另一个位置
  • 获取文件属性
  • 遍历一个文件夹
  • Files.walkFileTree()遍历整个目录

六 NIO学习总结以及NIO新特性介绍

  • 内存映射:

这个功能主要是为了提高大文件的读写速度而设计的。内存映射文件(memory-mappedfile)能让你创建和修改那些大到无法读入内存的文件。有了内存映射文件,你就可以认为文件已经全部读进了内存,然后把它当成一个非常大的数组来访问了。将文件的一段区域映射到内存中,比传统的文件处理速度要快很多。内存映射文件它虽然最终也是要从磁盘读取数据,但是它并不需要将数据读取到OS内核缓冲区,而是直接将进程的用户私有地址空间中的一部分区域与文件对象建立起映射关系,就好像直接从内存中读、写文件一样,速度当然快了。

七 Java NIO AsynchronousFileChannel异步文件通

Java7中新增了AsynchronousFileChannel作为nio的一部分。AsynchronousFileChannel使得数据可以进行异步读写。

八 高并发Java(8):NIO和AIO

推荐阅读

在 Java 7 中体会 NIO.2 异步执行的快乐

Java AIO总结与示例

AIO是异步IO的缩写,虽然NIO在网络操作中,提供了非阻塞的方法,但是NIO的IO行为还是同步的。对于NIO来说,我们的业务线程是在IO操作准备好时,得到通知,接着就由这个线程自行进行IO操作,IO操作本身是同步的。

欢迎关注我的微信公众号:"Java面试通关手册"(一个有温度的微信公众号,期待与你共同进步~~~坚持原创,分享美文,分享各种Java学习资源):

2018.10.16 Java的IO与NIO的更多相关文章

  1. JAVA中IO和NIO的详解分析,内容来自网络和自己总结

    用一个例子来阐释: 一辆客车上有10个乘客,他们的目的地各不相同,当没有售票员的时候,司机就需要不断的询问每一站是否有乘客需要下车,需要则停下,不需要则继续开车,这种就是阻塞的方式. 当有售票员的时候 ...

  2. java的nio之:java的nio系列教程之java的io和nio的区别

    当学习了Java NIO和IO的API后,一个问题马上涌入脑海: 我应该何时使用IO,何时使用NIO呢?在本文中,我会尽量清晰地解析Java NIO和IO的差异.它们的使用场景,以及它们如何影响您的代 ...

  3. 面试(Java之IO与NIO)

    一.概念 NIO即New IO,这个库是在JDK1.4中才引入的.NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多.在Java API中提供了两套N ...

  4. 2018.4.16 Java多线程实现龟兔赛跑

    龟兔赛跑(通过多线程来实现 里面的具体方法) TT.java package com.lanqiao.demo3; /** * 乌龟 * @author Administrator * */ publ ...

  5. java对比IO和NIO的文件读写性能测试

    1. NIO采用更接近操作系统执行IO的方式:通道和缓存器:顾名思义,数据源的数据由缓存器通过通道进行传输. 2. 在JDK5之后,原始IO系统底层用NIO进行了优化,这可以通过sun公布的源码中找到 ...

  6. 2018.10.16 uoj#340. 【清华集训2017】小 Y 和恐怖的奴隶主(矩阵快速幂优化dp)

    传送门 一道不错的矩阵快速幂优化dpdpdp. 设f[i][j][k][l]f[i][j][k][l]f[i][j][k][l]表示前iii轮第iii轮还有jjj个一滴血的,kkk个两滴血的,lll个 ...

  7. swap(2018.10.16)

    题意:给定一个{0,1,2,3,-,n-1}的排列 p. 一个{0,1,2 ,-,n-2}的排列 q 被认为是优美的排列, 当且仅当 q 满足下列条件 对排列 s={0,1,2,3,...,n-1}进 ...

  8. 在 .NET项目中使用 Redis(2018.10.16)

    1. 打开NuGet管理器搜索redis,安装:“StackExchange.Redis” 2. 配置 Web.config 文件 <connectionStrings> <add ...

  9. 2018.10.16 spoj Can you answer these queries V(线段树)

    传送门 线段树经典题. 就是让你求左端点在[l1,r1][l1,r1][l1,r1]之间,右端点在[l2,r2][l2,r2][l2,r2]之间且满足l1≤l2,r1≤r2l1\le l2,r1 \l ...

随机推荐

  1. HTML练习 | 百度搜索框

    <!DOCTYPE html> <head> <title>百度首页</title> <style> .logo{ background:u ...

  2. 详解http之post

    详解http之post 首先,我们先看看jquery中的post方法的使用: $.ajax({ url:'api/bbg/goods/get_goods_list_wechat', data:{ , ...

  3. TOJ 1883 Domino Effect

    Description Did you know that you can use domino bones for other things besides playing Dominoes? Ta ...

  4. 《springcloud 四》服务保护机制

    服务保护机制SpringCloud Hystrix 微服务高可用技术 大型复杂的分布式系统中,高可用相关的技术架构非常重要. 高可用架构非常重要的一个环节,就是如何将分布式系统中的各个服务打造成高可用 ...

  5. Python 递归返回树形菜单JSON串 <flask>

    需求:菜单管理功能(增.删.改),多级树形菜单展示 数据库表设计 create table if not exists Menu( id serial primary key , title ) no ...

  6. 九度oj题目1014:排名

    题目1014:排名 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8130 解决:2417 题目描述:     今天的上机考试虽然有实时的Ranklist,但上面的排名只是根据完成的题数排 ...

  7. pat1004. Counting Leaves (30)

    1004. Counting Leaves (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A fam ...

  8. SpringBoot | 第二十八章:监控管理之Spring Boot Admin使用

    前言 上一章节,我们介绍了Actuator的使用,知道了可通过访问不同的端点路径,获取相应的监控信息.但使用后也能发现,返回的监控数据都是以JSON串的形式进行返回的,对于实施或者其他人员来说,不是很 ...

  9. 【Linux相识相知】文本处理工具之grep\egrep\fgrep及正则表达式

    常说Linux上有文本处理的三剑客,grep.sed和awk,本文就grep做出详细的描述,并引出正则表达式. grep NAME:打印模式匹配的行 SYNOPISIS: grep [OPTIONS] ...

  10. ie8点击焦点有虚线框兼容问题

    a标签的: 方法一:在IE下是使用html属性:hideFoucs,在HTML标签中加上hidefocus=”true” 属性即可,但这个属性是IE私有的,Firefox是不认的. <a hre ...