输入输出(I/O)是指程序与外部设备或其他计算机进行交互的操作。几乎所有的程序都具有输入与输出操作,如从键盘上读取数据,从本地或网络上的文件读取数据或写入数据等。通过输入和输出操作可以从外界接收信息,或者是把信息传递给外界。Java把这些输入与输出操作用流来实现,通过统一的接口来表示,从而使程序设计更为简单。

Java流的概念

流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动。按照数据的传输方向,流可分为输入流与输出流。Java语言里的流序列中的数据既可以是未经加工的原始二进制数据,也可以是经过一定编码处理后符合某种特定格式的数据。

1.输入输出流
在Java中,把不同类型的输入输出源抽象为流,其中输入和输出的数据称为数据流(Data Stream)。数据流是Java程序发送和接收数据的一个通道,数据流中包括输入流(Input Stream)和输出流(Output Stream)。通常应用程序中使用输入流读出数据,输出流写入数据。 流式输入、输出的特点是数据的获取和发送均沿数据序列顺序进行。相对于程序来说,输出流是往存储介质或数据通道写入数据,而输入流是从存储介质或数据通道中读取数据,一般来说关于流的特性有下面几点:

  • 先进先出,最先写入输出流的数据最先被输入流读取到。
  • 顺序存取,可以一个接一个地往流中写入一串字节,读出时也将按写入顺序读取一串字节,不能随机访问中间的数据。
  • 只读或只写,每个流只能是输入流或输出流的一种,不能同时具备两个功能,在一个数据传输通道中,如果既要写入数据,又要读取数据,则要分别提供两个流。

2.缓冲流
为了提高数据的传输效率,引入了缓冲流(Buffered Stream)的概念,即为一个流配备一个缓冲区(Buffer),一个缓冲区就是专门用于传送数据的一块内存。

当向一个缓冲流写入数据时,系统将数据发送到缓冲区,而不是直接发送到外部设备。缓冲区自动记录数据,当缓冲区满时,系统将数据全部发送到相应的外部设备。当从一个缓冲流中读取数据时,系统实际是从缓冲区中读取数据,当缓冲区为空时,系统就会从相关外部设备自动读取数据,并读取尽可能多的数据填满缓冲区。 使用数据流来处理输入输出的目的是使程序的输入输出操作独立于相关设备,由于程序不需关注具体设备实现的细节(具体细节由系统处理),所以对于各种输入输出设备,只要针对流做处理即可,不需修改源程序,从而增强了程序的可移植性。

I/O流类概述

为了方便流的处理,Java语言提供了java.io包,在该包中的每一个类都代表了一种特定的输入或输出流。为了使用这些流类,编程时需要引入这个包。 Java提供了两种类型的输入输出流:一种是面向字节的流,数据的处理以字节为基本单位;另一种是面向字符的流,用于字符数据的处理。字节流(Byte Stream)每次读写8位二进制数,也称为二进制字节流或位流。字符流一次读写16位二进制数,并将其做一个字符而不是二进制位来处理。需要注意的是,为满足字符的国际化表示,Java语言的字符编码采用的是16位的Unicode码,而普通文本文件中采用的是8位ASCⅡ码。

java.io中类的层次结构如图10-1所示。


图10-1 java.io包的顶级层次结构图

针对一些频繁的设备交互,Java语言系统预定了3个可以直接使用的流对象,分别是:

  • System.in(标准输入),通常代表键盘输入。
  • System.out(标准输出):通常写往显示器。
  • System.err(标准错误输出):通常写往显示器。

在Java语言中使用字节流和字符流的步骤基本相同,以输入流为例,首先创建一个与数据源相关的流对象,然后利用流对象的方法从流输入数据,最后执行close()方法关闭流。

系列文章:
Java知多少(上)

Java知多少(66)输入输出(IO)和流的概述相关推荐

  1. Java输入输出(IO)和流的基本概念以及几种方法

    Java流的概念 IO流继承关系,如图所示:(了解) 流(Stream)是指在计算机的输入输出操作中各部件之间的数据流动.按照数据的传输方向,流可分为输入流与输出流.Java语言里的流序列中的数据既可 ...

  2. Java学习笔记29(IO字符流,转换流)

    字符流:只能操作文本文件,与字节流的区别是,字节流是按照字节来读取文件,而字符流是按照字符来读取,因此字符流的局限性为文本文件 字符输出流:Write类,使用时通过子类   每一次写入都要刷新 pac ...

  3. Java知多少(中)

    Java知多少(上) Java知多少(39)interface接口 Java知多少(40)接口和抽象类的区别 Java知多少(41)泛型详解 Java知多少(42)泛型通配符和类型参数的范围 Java ...

  4. 【Java基础】Java输入输出(IO)流

    目录 一.Java File类(文件操作类)详解 1.File 类简介 2.获取文件属性 3.创建和删除文件 4.创建和删除目录 5.遍历目录 6.相对路径和绝对路径 1.绝对路径 2.相对路径 二. ...

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

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

  6. Java基础(19)IO流

    十九.IO流 持久化:将内存中的数据  输出到其他设备中(比如硬盘),用于长时间保持数据 流:数据传输的管道或通道 i是in的缩写表示输入,o是out的缩写表示输出,io则表示了两个不同方向流 一般的 ...

  7. JAVA SE学习day_05: IO与流操作

    一.IO与流 以程序为主体,input(输入)是读.获取.使用输入流的过程,output(输出)是写.发送的过程. JAVA IO 标准的输入与输出 JAVA IO将读和写按照方向划分为: 输入:用于 ...

  8. Java IO: 字符流的Buffered和Filter

    作者: Jakob Jenkov  译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍缓冲与过滤相关的reader和writer,主要涉及BufferedReader.B ...

  9. Java IO: 字符流的Piped和CharArray

    转载自   Java IO: 字符流的Piped和CharArray 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) 本章节将简要介绍管道与字符数组相 ...

最新文章

  1. MVC中注册路由及其路由的设置
  2. wxWidgets 线程示例
  3. Android 4.0 截屏(Screenshot)代码流程小结
  4. Duilib学习笔记《04》— 窗体显示
  5. 机器人实现屠宰自动化
  6. java中vi是什么意思_java中的public void是什么意思?
  7. oracle高压水位线,Oracle 高水位线详解(HWM)
  8. idea文件为橙色去掉版本控制
  9. 【安装包】eclipse
  10. 如何编辑PDF文档中的文本呢?
  11. oom 如何避免 高并发_高并发下的内存管理技巧
  12. unbuntu 安装虚拟环境 virtualenv和virtualenvwrapper
  13. Python|Leetcode《306》|累加数
  14. USB1.1学习笔记
  15. 来自Bitly的USA.gov数据,数据分析案例
  16. 【非原创】Ubuntu14.04+cuda6.5+opencv2.4.9+caffe配置记录
  17. xamarin android 微信,转换微信SDK为Xamarin绑定库 Android5.5.8 iOS1.8.6.2
  18. mysql uid怎么获取_新浪微博API如何获取uid,并根据uid获取用户的基本信息
  19. (复健计划)标准库类型string
  20. [SDOI2010]粟粟的书架

热门文章

  1. linux内存分配器类型,内核早期内存分配器:memblock
  2. 登录页面html5 css3 js代码,H5+css3+js搭建带验证码的登录页面
  3. python 切片步长_python切片步长
  4. 计算机管理员受限用户,如何设置权限,使管理员能上网,而受限用户却不能上网?...
  5. php post 微信沙箱,微信支付平台错误:获取沙箱密钥失败,确保交易密钥是
  6. android c++ gizp 调用 so,使用ndk-build编译 android调用的so库
  7. 什么是java中的枚举法_enum枚举javajava,enum枚举使用详解+,总结
  8. php缩放库,php的缩放图像类使用
  9. linux常用命令--开发调试篇
  10. 计算机安全评估研究综合,计算机网络信息系统安全评价方法研究