一、Java中流的类型

根据流的方向划分:输入流,输出流

根据流的传输单位:字节流,字符流

根据流的角色划分:节点流,处理流

节点流:直接连接数据源的流

处理流:通过构造方法接收一个节点流,对节点流使用装饰者模式增加更多的功能。

二、字节流和字符流的结合使用

用到“适配器(adapter)”类:InputStreamReader可以把InputStream转换为Reader

OutputStreamWriter可以把OutputStream转换为Writer

三、字节流和字符流的区别

1.字节流读到一个返回一个

2.字节流可以处理所有的数据类型

3.字符流使用字节流读取到一个或多个字节,去编码表查找,返回对应的字符

四、RamdomAccessFile

该类的工作方式类似于把DataInputStream和DataOutputStream组合起来使用,并添加了一些方法。

该类自我独立,直接由Object派生而来

通常一个流只有一个功能,要么读要么写。RamdomAccessFile既可以读文件也可以写文件

五、NIO

NIO主要有三大核心部分:Channel(通道),Buffer(缓冲区), Selector(选择器)。传统IO基于字节流和字符流进行操作,而NIO基于Channel和Buffer(缓冲区)进行操作,数据总是从通道读取到缓冲区中,或者从缓冲区写入到通道中。Selector(选择区)用于监听多个通道的事件(比如:连接打开,数据到达)。因此,单个线程可以监听多个数据通道。

六、通道(channel)

用户数 据源节点和目标节点的连接。在Java nio中负责缓冲区中的数据传输, channel本身不存储数据,因此需要配合缓冲区进行传输,实现java.nio.channels.Channel接口 ,主要实现类有FileChannel、SocketChannel、ServerSocketChannel、DatagramChannel等。

获取通道的方式

java针对支持通道的类提供getChannel()方法 本地IO有 FileInputStream/FileOutputStream RandomAccessFile, 网络IO有 Socket 、ServerSocket 、DatagramSocket

在Java1.7中的NIO.2针对各个通道提供了静态方法open()

在Java1.7中的NIO.2的Files工具类的newByteChannel()

七、缓冲区(buffer)

Buffer是数据的容器,在nio中负责数据的存取,java为不同数据类型提供了相对应的缓冲区类型 如:ByteBuffer、CharBuffer、ShortBuffer、IntBuffer、LongBuffer、FloatBuffer 、DoubleBuffer 等。

Buffer的基本使用 :通过allocate()方法获取缓冲区,put()方法存入数据到缓冲区,get()方法获取缓冲区中的数据

Buffer的核心属性:

capacity:容量,表示缓冲区中最大存储数据的容量,一旦声明不能改变。

limit:界限,表示缓冲区中可以操作数据的大小。(limit后数据不能进行读写)

position:位置,表示缓冲区中正在操作数据的位置

mark: 标记,表示记录当前position的位置,可通过reset()恢复到mark的位置

直接缓冲区与非直接缓冲区

非直接缓冲区:通过allocate()分配缓冲区,缓冲区建立在jvm中。

直接缓冲区:通过allocateDirect()方法创建缓冲区,缓冲区建立在系统物理内存中。

链接: 参考文章.

八、Selector

Selector类是NIO的核心类。Selector能够检测多个注册的通道上是否有事件发送,如果有事件发生,便获取事件然后针对每个事件进行相应的响应处理。这样一来,只是用一个单线程就可以管理多个通道。也就是管理多个连接。这样使得只有在连接真正有读写事件发送时,才会调用函数来进行读写,就大大减少了系统开销,并且不必为每个连接创建一个线程,不用去维护多个线程,并且避免了多线程之间上下文切换导致的开销。

九、NIO和普通IO的区

IO

NIO

面向流

面向缓冲区

堵塞IO

非堵塞IO

选择器

Java中的NIO实际上采用的是多路复用IO模型

会有一个线程不断去轮询多个socket的状态,只有当socket真正有读写事件时,才真正调用实际的IO读写操作。

十、IO模型

链接: 参考文章.

本文地址:https://blog.csdn.net/YuanJAnt/article/details/107879797

希望与广大网友互动??

点此进行留言吧!

java中nio流_Java输入输出流IO介绍(与NIO比较)相关推荐

  1. java 中的流_Java中的流(IO

    Java中的流(IO流. java.io包中定义了多个流类型(类或抽象类)来实现 输入 / 输出功能,可以从不同的角度对其进行分类: 按单位可分为: 字节流         (一个字节一个字节的读取) ...

  2. Java中字符流之输入、输出流以及转换流

    字符流 字符流 一个字符一个字符的读 mac系统下,一个中文字符占3个字节 默认使用UTF-8的编码表(通用的编码表) Windows系统下,一个中文字符占2个字节 默认使用的GBK的编码表(简体中文 ...

  3. java输入输出及文件_java输入输出流及文件操作

    我只选择了一些代码 注意包声明和相关结构 许多类都继承了MyFile这个类 深入研究可以参考<java文件操作> 1.[代码]读取文件内容 /** *Author:Yuanhonglong ...

  4. Java中面向字节的输入输出流

    字节流以字节为传输单位,用来读写8位的数据,除了能够处理纯文本文件之外,还能用来处理二进制文件的数据.  InputStream类和OutputStream类是所有字节流的父类. InputStrea ...

  5. java字符流输出流_JAVA语言之IO流字符串输入输出流

    本文主要向大家介绍了JAVA语言之IO流字符串输入输出流,通过具体的内容向大家展示,希望对大家学习JAVA语言有所帮助. 概述 StringReader 字符输入流 和CharArrayReader类 ...

  6. Java中IO流,输入输出流概述与总结(转载自别先生文章)

    Java中IO流,输入输出流概述与总结 总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都 ...

  7. 黑马程序员_JAVA之IO流的(转换流,数据输入输出流等)

    ------- android培训.java培训.期待与您交流!---------- IO流: 笔记内容:转换流,字节输入输出流,数据输入输出流,内存操作流,随机访问流 打印流,对象序列化流,Prop ...

  8. java面向字符的输入流_Java编程开发中面向字节的输入输出流

    关于面向字符的输入流和输出流方面教程已经讲解完了,下面要介绍的就是Java编程开发中面向字节的输入输出流,希望本节内容可以帮助大家更好的学习Java. 教程回顾点击查看: 字节流以字节为传输单位,用来 ...

  9. Java输入输出流IO

    1.什么是IO Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列.Java的I/O流提供了读 ...

最新文章

  1. centos 管道符取第一行_CentOS 7 文件操作命令
  2. C++中的继承(一)
  3. PHP读取数据库表显示到前台
  4. leetcode85. 最大矩形
  5. SpringCloud Hoxton版微服务- Gateway网关
  6. LOADRUNNER连接ORACLE数据库的方法
  7. int 转CString
  8. “小而美”走到十字路口,吉利或收购魅族助车机闭环
  9. DTU有什么用?是怎样工作的?
  10. java 杨辉三角_JAVA实现杨辉三角的三种方式
  11. requests爬取链家网房源数据
  12. 计算机主机结构和名称图,计算机结构图
  13. python实验四_实验四 · Python程序设计/20193117whm - Gitee.com
  14. 给一个字符类型的数组chas和一个整数size,请把大小为size的左半区整体右移到右半区,右半区整体移动到左边。
  15. Python实现VRP常见求解算法——蚁群算法(ACO)
  16. 有一个网页地址, 比如百度主页: https://www.baidu.com/ 如何得到它的内容?
  17. 快速Vsftpd配置手记
  18. 高级信息项目管理师规划
  19. UESTC 计量经济学复习
  20. 软件项目管理课后习题——第7章软件项目的质量管理与配置管理

热门文章

  1. 移动端开发语言的未来的猜想#华为云·寻找黑马程序员#
  2. 使用CSE实现滚动升级零中断
  3. 计算机网络c4比赛题目,计算机网络C4习题
  4. MyBatis全局配置文件和映射文件
  5. Python输出帮助文档的方法及命令详解
  6. Pycharm中出现ImportError:DLL load failed:找不到指定模块的解决方法(终极方法,不成功来找我~)
  7. NVIDIA Jetson AGX Xavier 安装 JetPack 注意事项
  8. mysql 命令行可以连接 php不能,mysql连接命令行可以php竟然不可以
  9. php代码实现tp5监听队列,thinkPHP5的队列使用
  10. python3 模板库_[zz]尝试PyTenjin --号称最快的Python 模板库