Java中流的概念

java程序通过流来完成输入/输出。流是生产或消费信息的抽象。流通过java的输入/输出与物理设备链接。尽管与它们链接的物理设备不尽相同,所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象

多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台、磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。java中流的实现是在java.io包定义的类层次结构内部的。

输入/输出流的概念

输入/输出时,数据在通信通道中流动。所谓“数据流(stream)”指的是所有数据通信通道之中,数据的起点和终点。信息的通道就是一个数据流。只要是数据从一个地方“流”到另外一个地方,这种数据流动的通道都可以称为数据流。

输入/输出是相对于程序来说的。程序在使用数据时所扮演的角色有两个:一个是源,一个是目的。

若程序是数据流的源,即数据的提供者,这个数据流对程序来说就是一个“输出数据流”(数据从程序流出)。若程序是数据流的终点,这个数据流对程序而言就是一个“输入数据流”(数据从程序外流向程序)

输入流:所有输入流类都是 InputStream 抽象类(字节输入流)和 Reader 抽象类(字符输入流)的子类。其中 InputStream 类是字节输入流的抽象类,是所有字节输入流的父类,其层次结构如图

InputStream 类中所有方法遇到错误时都会引发 IOException 异常。如下是该类中包含的常用方法。

int read():从输入流读入一个 8 字节的数据,将它转换成一个 0~255 的整数,返回一个整数,如果遇到输入流的结尾返回 -1。

int read(byte[] b):从输入流读取若干字节的数据保存到参数 b 指定的字芳数组中,返回的字芾数表示读取的字节数,如果遇到输入流的结尾返回 -1。

int read(byte[] b,int off,int len):从输入流读取若干字节的数据保存到参数 b 指定的字节数组中,其中 off 是指在数组中开始保存数据位置的起始下标,len 是指读取字节的位数。返回的是实际读取的字节数,如果遇到输入流的结尾则返回 -1。

void close():关闭数据流,当完成对数据流的操作之后需要关闭数据流。

int available():返回可以从数据源读取的数据流的位数。

skip(long n):从输入流跳过参数 n 指定的字节数目。

boolean markSupported():判断输入流是否可以重复读取,如果可以就返回 true。

void mark(int readLimit):如果输入流可以被重复读取,从流的当前位置开始设置标记,readLimit 指定可以设置标记的字苟数。

void reset():使输入流重新定位到刚才被标记的位置,这样可以重新读取标记过的数据。

上述最后 3 个方法一般会结合在一起使用,首先使用 markSupported() 判断,如果可以重复读取,则使用 mark(int readLimit) 方法进行标记,标记完成之后可以使用 read() 方法读取标记范围内的字节数,最后使用 reset() 方法使输入流重新定位到标记的位置,继而完成重复读取操作。

Java 中的字符是 Unicode 编码,即双字节的,而 InputerStream 是用来处理单字节的,在处理字符文本时不是很方便。这时可以使用 Java 的文本输入流 Reader 类,该类是字符输入流的抽象类,即所有字输入流的实现都是它的子类。

Reader类的具体层次结构如图下 所示,该类的方法与 InputerSteam 类的方法类似,这里不再介绍。

输出流:在 Java 中所有输出流类都是 OutputStream 抽象类(字节输出流)和 Writer 抽象类(字符输出流)的子类。其中 OutputStream 类是字节输出流的抽象类,是所有字节输出流的父类,其层次结构如图

OutputStream 类是所有字节输出流的超类,用于以二进制的形式将数据写入目标设备,该类是抽象类,不能被实例化。OutputStream 类提供了一系列跟数据输出有关的方法,如下所示。

int write (b):将指定字节的数据写入到输出流。

int write (byte[] b):将指定字节数组的内容写入输出流。

int write (byte[] b,int off,int len):将指定字节数组从 off 位置开始的 len 字芳的内容写入输出流。

close():关闭数据流,当完成对数据流的操作之后需要关闭数据流。

flush():刷新输出流,强行将缓冲区的内容写入输出流。

字符输出流的父类是 Writer,其层次结构如图

输入/输出类

在java.io包中提供了60多个类(流)

从功能上分为两大类:输入流和输出流

从流结构上分为字节流(以字节为处理单位或称面向字节)和字符流(以字符为处理单位或称面向字符)

字节流的输入流和输出流基础是InputStream和OutputStream这两个抽象类,字节流的输入输出操作由这两个类的子类实现,字符流是java1.1版后新增加的以字符为单位进行输入输出处理的流,字符流输入输出的基础是抽象类Reader和Writer

字节流,数据的处理以字节为基本单位,每次读写8位二进制数(一个字节)。也称为二进制流。

字符流,用于字符数据的处理,每次读写16位二进制数(两个字节)。

字节流

字符流

输入

InputStream

Reader

输出

OutputStream

Writer

NIO,和传统Io有何区别

我们使用InputStream从输入流中读取数据时,如果没有读取到有效的数据,程序将在此处阻塞该线程的执行。其实传统的输入里和输出流都是阻塞式的进行输入和输出。 不仅如此,传统的输入流、输出流都是通过字节的移动来处理的(即使我们不直接处理字节流,但底层实现还是依赖于字节处理),也就是说,面向流的输入和输出一次只能处理一个字节,因此面向流的输入和输出系统效率通常不高。

从JDk1.4开始,java提供了一系列改进的输入和输出处理的新功能,这些功能被统称为新IO(NIO)。新增了许多用于处理输入和输出的类,这些类都被放在java.nio包及其子包下,并且对原io的很多类都以NIO为基础进行了改写。新增了满足NIO的功能。

NIO采用了内存映射对象的方式来处理输入和输出,NIO将文件或者文件的一块区域映射到内存中,这样就可以像访问内存一样来访问文件了。通过这种方式来进行输入/输出比传统的输入和输出要快的多。

JDk1.4使用NIO改写了传统Io后,传统Io的读写速度和NIO差不了太多。下节将详细讨论NIO的知识

java流链概念_《精通并发与Netty》学习笔记(09 - Java中流的概念)相关推荐

  1. java tidy 忽略属性_【转】JTidy学习笔记

    转自:http://hedong.3322.org/archives/000252.html JTidy是HTML Tidy(一个HTML语法检查器和优雅的打印编排工具)的Java移植,除了本身具有的 ...

  2. 《Java疯狂讲义》(第3版)学习笔记 2 - Java语言的运行机制

    内容 1.高级语言的运行机制 2.Java 语言的运行机制 1.高级语言的运行机制 高级语言主要分为编译型语言和解释型语言两类. 编译型语言是指使用专门的编译器.针对特定平台(操作系统)将高级语言源代 ...

  3. 学习笔记:Java 并发编程⑥_并发工具_JUC

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  4. 学习笔记:Java 并发编程①_基础知识入门

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 视频下载: ...

  5. 学习笔记:Java 并发编程②_管程

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  6. 学习笔记:Java 并发编程④_无锁

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  7. 菜鸟学习笔记:Java提升篇10(网络2——UDP编程、TCPSocket通信、聊天室案例)

    菜鸟学习笔记:Java提升篇10(网络2--UDP编程.TCPSocket通信) UDP编程 TCP编程(Socket通信) 单个客户端的连接 多个客户端的连接(聊天室案例) UDP编程 在上一篇中讲 ...

  8. 菜鸟学习笔记:Java基础篇5(抽象类与接口、回调函数、内部类)

    菜鸟学习笔记:Java面向对象篇下 抽象类 接口 回调函数 内部类 成员内部类 匿名内部类 抽象类 通过前面知识的学习,抽象类这个概念应该不难理解,但比较容易和后面要说的接口混淆,而且在面试中也比较爱 ...

  9. 菜鸟学习笔记:Java提升篇5(IO流1——IO流的概念、字节流、字符流、缓冲流、转换流)

    菜鸟学习笔记:Java IO流1--IO流的概念.字节流.字符流.缓冲流.转换流 IO流的原理及概念 节点流 字节流 文件读取 文件写出 文件拷贝 文件夹拷贝 字符流 文件读取 文件写出 处理流 缓冲 ...

  10. Stream 流 【学习笔记】Java 基础

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 写这篇博客旨在制作笔记,方便个人在线阅览,巩固知识,无其他用途. 学习视频 [黑马 Java 基础教程] ...

最新文章

  1. Jquery对象和dom对象获取html的方法
  2. 网易自动化UI测试解决方案Airtest Project亮相GDC
  3. MySQL基础总结(二)
  4. python操作界面_Python使用PyQt5的Designer工具创建UI界面
  5. 第九周项目6-穷举法之年龄几何
  6. Dubbo新手入门实例HelloWorld(zookeeper)
  7. java 正規表示 group_经验分享|Java+百度AI实现人脸识别
  8. 多线程+链表模拟RR调度算法
  9. CodeForces 489A SwapSort (选择排序法)
  10. 8.11 Matching Networks 匹配网络
  11. 《Head First设计模式》
  12. 面试题:谈谈你对Mysql数据库优化的见解
  13. Windows NT 内核基本结构
  14. 王者荣耀服务器维护多久结束,王者荣耀健康系统重置时间 时间限制规则详解...
  15. kali linux基本口令_kali linux 基本命令(第一批)
  16. 【mac 实现ai绘画自由安装指南】
  17. WCF技术剖析之十四:泛型数据契约和集合数据契约(上篇)
  18. 伯禹公益AI《动手学深度学习PyTorch版》Task 06 学习笔记
  19. 计算机网络-实验一:windows网络测试工具
  20. 读书笔记《产品经理必懂的技术那些事儿》03-04

热门文章

  1. Goby 漏洞更新 | 万户 OA OfficeServer.jsp 任意文件上传漏洞
  2. Replays For SC2 LOG
  3. 区块链共识机制技术一--POW(工作量证明)共识机制
  4. C++实现九进制转化十进制
  5. wxWidgets Ubuntu下安装 配置 编译 创建项目 实现“hello world”(CodeBlocks)详细图文教程
  6. 安装minikube网络访问问题解决
  7. Windows环境下利用FreeNAS组建IP-SAN
  8. c/c++ restrict修饰符介绍
  9. Python基础学习3——列表
  10. android+背景图片不显示,背景图片显示问题 图片显示错误 android开发