Java笔记十九.深入解析I/O编程之流的层次结构

深入解析I/O编程之流的层次结构

转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)

大多数应用程序都需要与外部设备进行数据交换,最常见的外部设备包含磁盘和网络。所谓I/O(Input/Output缩写),即指应用程序对这些设备的数据输入与输出。在程序中,键盘被当作输入文件、显示器被当作输出文件使用。Java语言定义了许多专门负责各种方式的输入输出,这些类都被方法Java.io包中。

一、理解流的概念

1. 数据流

数据流是一串连续不断的数据的集合,数据写入程序可以是一段一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。I/O流类可分为节点流类和处理流类(或称包装类),具体表述如下:

(1)节点流类:程序用于直接操作目标设备所对应的类称为节点流类。

(2)包装类:程序可以通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类即为包装类(处理流类)。

2.字节流与字符流

所有文件的储存是都是字节(byte)的储存,在磁盘上保留的并不是文件的字符而是先把字符编码成字节,再储存这些字节到磁盘。在读取文件(特别是文本文件)时,也是一个字节一个字节地读取以形成字节序列。字节流与字符流主要的区别是他们的的处理方式。

(1)字节流(byte stream)

字节流是最基本的,采用ASCII编码,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据。字节流处理单元为1个字节,它是按字节来操作字节或字节数组,对处理音频文件、图片、歌曲等效果要好。

(2)字符流(char stream)

字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串。字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的,主要用于处理多国语言或文本。



多学一招:字节流和字符流的区别?

区别1:字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,
操作字节和字节数组。

区别2:字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。

区别3:字节流可用于任何类型的对象,包括二进制对象;而字符流只能处理字符或者字符串;

区别4:字节流提供了处理任何类型的IO操作功能,但它不能直接处理Unicode字符;而字符流就可以。



二、IO包中的类层次关系

Java中将能够从其读取数据的对象称为输入流,能向其写入数据的对象称为输出流。

1.字节流

(1)字节输入流类

>InputStream类:是所有字节输入流的父类,是一个抽象类;

>StringBufferInputStream类:是一种基本的介质流,用于从StringBuffer(字符数组)中读取数据;

>ByteArrayInputStream类:是一种基本的介质流,用于从Byte字节数组中度数数据;

>FileInputStream类:最基本的文件输入流,用于从文件中读取数据;

>PipeInputStream类:该类在流中引入管道的概念,用于从其他线程共用的管道中读取数据;

>SequenceInputStream 类:将2个或者多个InputStream
对象转变为一个InputStream.

注意:ObjectInputStream、所有FilterInputStream的子类都是装饰流。

>DataInputStream 类:一般和DataOutputStream配对使用,提供了大量的读取基本数据类型的方法。

>BufferedInputStream 类:使用该对象阻止每次读取一个字节都会频繁操作IO。将字节读取一个缓存区,从缓存区读取。

>LineNumberInputStream 类:跟踪输入流中的行号。可以调用getLineNumber(
)和 setLineNumber(int)方法得到和设置行号。

>PushbackInputStream 类:可以在读取最后一个byte
后将其放回到缓存中。

(2)字节输出流类

>OutputStream类:是所有的输出字节流的父类,它是一个抽象类;

>ByteArrayOutputStream类:是一种基本介质流,用于向Byte数组中写入数据;

>FileOutputStream类:是一种基本介质流,用于向本地文件中写入数据;

>PipedOutputStream类:用于向其他线程共用的管道中写入数据,任何写入此对象的信息都被放入对应PipedInputStream 对象的缓存中,从而完成线程的通信,实现了“管道”的概念;

注意:ObjectOutputStream和所有FilterOutputStream的子类都是装饰输出流

>DataOutputStream类:通常与DataInputStream配合使用,提供了大量的写基本数据类型的方法;

>PrintStream类:用于产生具有格式的输出信息(一般地在java程序中DataOutputStream用于数据的存储,即J2EE中持久层完成的功能,PrintStream完成显示的功能,类似于J2EE中表现层的功能);

>BufferedOutputStream类:使用该类可以避免频繁地向IO写入数据,即先把数据写入到一个缓存区,再调用flush方法将数据一次性完成数据的写入并清空缓存。

2.字符流

(1)字符输入流类

>Reader类:是所有的输入字符流的父类,为一个抽象类;

>CharArrayReader类:是一种基本的介质类,用于从Char数组读取数据;

>StringReader类:是一种基本的介质类,用于从String读取数据;

>PipeReader类:用于向其他线程共用的管道中写入字符数据;

>InputStreamReader类:是一个连接字节流和字符流的桥梁,它将字节流转变为字符流,它的子类FileReader其实就是一个实现此功能的具体类。;

>BufferedReader类:是一个装饰器,它和其子类负责装饰其它Reader对象;

>FilterReader类:是所有自定义具体装饰流的父类,其子类PushbackReader对Reader对象进行装饰,会增加一个行号;

(2)字符输出流类

>Writer类:是所有输出字符流的父类,它是一个抽象类;

>CharArrayWriter类:是一种基本的介质流,用于向Char数组以字符形式写入数据;

>StringWriter类:是一种基本的介质流,用于向String(字符串)以字符形式写入数据;

>PipedWriter类:用于向其他线程共用的管道中写入数据;

>BufferedWriter类:是一个装饰器为Writer提供缓冲功能;

>OutputStreamWriter类:是OutputStream到Writer转换的桥梁,它的子类FileWriter其实就是一个实现此功能的具体类。

时间: 2024-08-25 13:40:14

Java笔记十九.深入解析I/O编程之流的层次结构的相关文章

Java笔记二十一.深入解析I/O编程之节点流

深入解析I/O编程之节点流 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 在上一节我们说到IO流主要分为两个大类:节点流类和过滤流类(也称包装类).程序用于直接操作目标设备所对应的类叫节点流类;为更加灵活方便地读写各种类型的数据,程序也可用通过一个间接流类去调用节点流类而这个简介流类即为过滤流类(也称为包装类). 总之,无论是节点流类还是过滤流类,它们都属于字节流或字符流其中的一种.下面我们介绍一下常见的节点流类有哪些. 字****节***

swift 笔记 (十九) —— 协议

协议(Protocols) 协议仅是用定义某些任务或者是功能必须的方法和属性.类似于java里的interface的作用.但协议并不会实现具体的功能. 我猜这个名字源于OO中提到的"契约",但我并不觉得这名字很好,反而是interface这名字更容被接受,因为我觉得协议这个名字很容易和网络编程的时候的网络协议搞混,网络协议也通常简称为协议. 语法: protocol MyProtocol { //协议定义 } struct MyStruct: MyProtocol1, MyProtoc

菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty

做WEB开发,测试是一件很费时间的事情.所以我们就应该用更简单.更快捷的方式进行测试.今天就向大家介绍一个轻量级的容器--jetty.j今天说的etty是Maven的一个插件jetty-maven-plugin,与Maven配合起来使用非常的方便,它的配置也非常的简单,下面我们就看看它怎么用吧! 在pom.xml 文件的<project>标签下加入如下代码: <build> <plugins> <plugin> <groupId>org.mort

angular学习笔记(十九)

本篇主要介绍angular使用指令修改DOM: 使用angular指令可以自己扩展html语法,还可以做很多自定义的事情.在后面会专门讲解这一块的知识,这一篇只是起到了解入门的作用. 与控制器,过滤器,服务,一样,可以通过模块实例的directive的方法来创建指令: var someModule = angular.module('SomeModule',[]); someModule.directive('directiveName',function(){ return { link: f

java笔记--String类对象解析与运用

1.String中的equals和==的区别 String是对象而非基本数据类型,不能使用"=="来判断两个字符串是否相当, 判断两个字符串内容是否相同用equals(); 判断两个字符串内存地址是否相同用"==" 2.startsWith(String str): 判断字符串是否以str为前缀 3.endsWith(String str): 判断字符串是否以str为后缀 4.String 字符串的比较: 1).compareTo()和compareToIgnore

“全栈2019”Java第十九章:关系运算符、条件运算符和三元运算符

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第十九章:关系运算符.条件运算符和三元运算符 下一章 "全栈2019"Java第二十章:按位与.按位或.异或.反码.位运算 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复&qu

“全栈2019”Java第九十九章:局部内部类与继承详解

难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第九十九章:局部内部类与继承详解 下一章 "全栈2019"Java第一百章:局部内部类可以实现接口吗? 学习小组 加入同步学习小组,共同交流与进步. 方式一:关注头条号Gorhaf,私信"Java学习小组". 方式二:关注公众号Gorhaf,回复"Java学习小

聊聊高并发(二十九)解析java.util.concurrent各个组件(十一) 再看看ReentrantReadWriteLock可重入读-写锁

上一篇聊聊高并发(二十八)解析java.util.concurrent各个组件(十) 理解ReentrantReadWriteLock可重入读-写锁 讲了可重入读写锁的基本情况和主要的方法,显示了如何实现的锁降级.但是下面几个问题没说清楚,这篇补充一下 1. 释放锁时的优先级问题,是让写锁先获得还是先让读锁先获得 2. 是否允许读线程插队 3. 是否允许写线程插队,因为读写锁一般用在大量读,少量写的情况,如果写线程没有优先级,那么可能造成写线程的饥饿 关于释放锁后是让写锁先获得还是让读锁先获得,

Java笔记二十二.深入解析I/O编程之包装类

深入解析I/O编程之包装类 转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空) 从上节学到的节点流类我们知道,如Java中提供的FileOutputStream和FileInputStream类实现往文件中写入字节或从文件中读取字节数据.在实际应用中,我们需要往文件中写入或读取各种类型的数据,一般的做法是先将其他类型的数据转换成字节数组后写入文件或是将从文件中读取到的字节数组转换成其他类型.然而,上述方法会给我们的程序增加了代码量和带来一些困难和