第七章 流
目录
第七章 流 1
7.1流的概念 2
1.流的概念 2
2.流的功能 2
3.关于流的注意问题 2
7.2 Java IO流分类 2
总分类 2
节点流和处理流 2
1.Java流支持的两种类型的数据 2
2.按照读写数据的类型 2
3.InputStream 2
4.OutputStream 2
5.Reader 2
6.Writer 2
7.3节点流 2
7.3.1.节点流的分类 3
7.3.2文件节点流 3
1.功能 3
2.实例 3
7.4 过滤流(处理流) 5
7.4.1工作原理 5
1.工作过程 5
2.Java的处理方法 6
7.4.2 缓冲流 7
1.定义 7
2.作用: 7
3.主要类: 7
4.具体实现 8
7.4.3 转换流 8
1.功能 8
2.InputStreamReader&OutputStreamWriter 8
3.具体实现 9
7.4.4 数据流 9
1.作用: 9
2.主要接口和类 9
3.构造方法: 9
7.4.5 Print流 9
7.4.6 对象流 9
7.4.7总结 9
1.处理流的功能主要体现在 9
2.关闭流时的注意点 9
7.1流的概念
之前所学的Java程序所有的数据都是储存在内存/JVM中,程序结束之后自动释放,现在的大多数都是程序结束之后储存到磁盘当中去,启动程序会在当中读出相关数据,相关操作就是通过流来实现的
【从程序的角度看】
流读取数据:输入流(可从中读出一系列字节的对象)
流写入数据:输出流(可向其中写入一系列字节的对象)
在Java中流也是对象
1.流的概念
来自源或送至目的地的数据流动,程序和I/O设备或文件之间进行传输的对象
2.流的功能
完成数据的输入和输出
3.关于流的注意问题
(1)Java中所有的输入、输出,都是通过流来完成的
(2)一个流是以另一个对象为源或目的传输信息的对象,功能类似与一个管道
(3)实例:System.out
System.in
7.2 Java IO流分类
总分类
节点流和处理流
节点流:可以从一个特定的数据源读取数据(直接从数据源读取数据,读回来的数据是类似01010)
处理流:连接已存在的流(节点流或处理流)之上,通过对已有流的处理为程序提高更强大的读写能力<读写01010等信息,使其简化>
1.Java流支持的两种类型的数据
①原始字节
②Unicode字符(会有转换过程)
2.按照读写数据的类型
①字节流(流)
②字符流(读的流:阅读器、输出流:书写器)
四个基本类(抽象类):
(Stream结尾是字节流)
3.InputStream【输入字节流类】
(1)所有以字节为单位的输入流的基类
(2)操作的数据的基本单位:字节(8bit)
(3)分类
(4)基本方法
①一次读一个字节回来
4.OutputStream【字节输出流】
(1)所有以字节为单位输出流的基类
(2)操作的数据的基本单位:字节(8bit)
(3)分类
(4)基本方法
(5)说明
—flush将清空缓存,即将缓存的数据写到文件里
—close是关闭文件
—使某个流类提供了使用原生的read和write来工作的具体方法
5.Reader【字符输入流】
(1)所有字符输入流的基类
(2)操作的数据的基本单位:字符(16bit)
(3)分类
(4)基本方法
6.Writer【字符输入流】
(1)所有字符输入流的基类
(2)操作的数据的基本单位:字符(16bit)
(3)分类
(4)基本方法
7.Java流体系常用类的分类
7.3节点流
7.3.1.节点流的分类
节点流:直接从特定类型数据(数据源)实现读写的流
7.3.2文件节点流
1.功能
连接文件的输入(输出)流
2.实例
(1)Test File Input Stream
★功能:
从文件中读取字节
★问题
①为何打印“?”,如何修改?
Java原文件也是字符编码的,要读成字节编码的话一般只会一次读取一个字节,如果不是一个字节表示的字符,那就会乱码 , <一个中文两个字节>
Java文件时纯文本文件,使用字符流读取就不会乱码(字符流读的也是字节,只是会自动将字节转化成字符,所以使用字符流读取的时候就不会乱码了)
②read()的返回值为int
③总共读取的字节数(num)与文件大小的关系?
相等
④异常处理
(2)Test File Reader
—功能:
打印出一个文件中全部的字符(Unicode编码)
(3)TestFileOutputStream
—File Output Stream对象建立时,若文件不在,则会自动建立相应的文件
(4)Test File Stream ToCopyMp3
功能
实现了mp3文件的拷贝
问题:
①为何执行速度很慢?如何改进?
(5)TestFileWriter
功能
像另外一个文件输入大部分Unicode编码
很多都是乱码的原因:
FileWrite和FileRead都是只能以系统默认的编码格式读写文件
7.4 过滤流(处理流)
7.4.1工作原理
1.工作过程
//字节级的读写操作,没有读取数值类型数据的功能
FileInputStream fin=new FileInputStream(“a.txt”);
int b=fin.read;
//无法从文件中读取数据
DataInputStream din=…;
double s=din.readDouble();
2.Java的处理方法
(1)某些流从文件或其他位置读写字节;
某些流将字节“组装”成更有用的数据
(2)通过组成一个现成的流传递给另外一个流的构造器,形成“过滤流”
■说明:注意顺序
—DataInputStream放到最后,是为了使用该类的方法;
—使用具有缓冲功能的read方法。
■优点: (1)只要使用相同的处理流,程序则可以采用完全相同的输入、输出代码来访问不同的数据源。
(2)提供了更加方便的操作,执行的效率更高;
(3)与节点流的搭配:各尽其职,拥有对流进行混合和匹配的能力。
7.4.2 缓冲流
1.定义
套接在相应的节点流之上,对数据的读写提供了缓冲功能。.
2.作用:
提高了读写的效率。
3.主要类:
一BufferedInputStream
一BufferedOutputStream
一BufferedReader
一BufferedWriter
4.具体实现
实例1: Test BufferedInputStream
套接使用,需要参数,
虽然提供了缓冲功能,但是还是不可
以读取中文
实例2: TestBufferReader
实例3: 拷贝MP3文件:
CopyMp3WithBufferedStream
7.4.3 转换流
1.功能
将字节流转换为字符流。
2.InputStreamReader&OutputStreamWriter
①InputStreamReader 需要与InputStream套接;
②OutputStreamWriter要与OutputStream套接。
③构造时可以指定编码集合:
new InputStreamReader(System.in,“ISO8859_ 1”);
3.具体实现
(1)实例1: TestTransform
➢功能:读取文本文件(可正确读取中文)
➢注意:读取的字符总数。
(2)实例2: TestTransFormEncoding
(3)实例3:KeyboardInput
7.4.4 数据流
1.作用:
直接以基本类型为单元进行读写,提供了可以存取Java基本类型数据的方法。
2.主要接口和类
—接口: DataInput 、DataOutput
一实现类: DataInputStream、 DataOutputStream
3.构造方法:
一DataInputStream(InputStream in)
一DataOutputStream(OutputStream out )
例1: TestDataStream
7.4.5 Print流
7.4.6 对象流
7.4.7总结
1.处理流的功能主要体现在
(1) 性能的提高:主要以增加缓冲的方式来提高输入输出的效率;
(2) 操作的简便:处理流提供了一系列便捷的方法来一次输入、输出大批量的内容,而不是输入输出一一个或多个字节或字符。
2.关闭流时的注意点
使用处理流包装了底层节点流后,关闭流时,只要关闭最.上层的处理流,则被处理流包装的节点流被自动关闭。