java培训笔记(详细)版含作业练习-IO流详解. 下载本文

第十四天: 目标: ------------------------------------------------------------ 第十四章 Stream I/O and Files, 共 44 个slide(411-455; 知识点:一. 流的概念 程序的主要任务是操纵数据。在Java中,把一组有序的数据序列称为流。根据操作的方向,可以把流分为输入流和 输出流两种。程序从输入流读取数据,向输出流写出数据。 文件 输入流 输出流 文件 内存 -------------> Java程序 ------------------> 内存 键盘 控制台 数据源 数据目的地 Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的输入流和输出流进行了抽象。 如果数据流中最小的数据单元是字节,那么称这种流为字节流;如果数据流中最小的数据单元是字符,那么称这种流 为字符流。在I/O类库中,java.io.InputStream和java.io.OutputStream分别表示字节输入流和字节输出流, java.io.Reader和java.io.Writer分别表示字符输入流和字符输出流。 二. 字节输入流和输出流概述 在java.io包中,

java.io.InputStream表示字节输入流,java.io.OutputStream表示字节输出流,它们都是抽象类,不 能被实例化。 InputStream类提供了一系列和读取数据有关的方法: 1. read(: 从输入流读取数据:有三种重载形式: a. int read(: 从输入流读取一个8位的字节,把它转换为0-255之间的整数,并返回这一整数。例如,如果读到的 字节为9,则返回9,如果读到的字节为-9,则返回247。如果遇到输入流的结尾,则返回-1; b. int read(byte[] b: 从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。返回的整数表示读取的 字节数。如果遇到输入流的结尾,则返回-1; c. int read(byte[] b, int off, int len: 从输入流读取若干个字节,把它们保存到参数b指定的字节数组中。 返回的整数表示读取的字节数。参数off指定在字节数组中开始保存数据的起始下标,参数len指定 读取的字节数目。返回的整数表示实现读取的字节数。如果遇到输入流的结尾,则返回-1; 以上第一个read方法从输入流读取一个字节,而其余两个read方法从输入流批量读取若干字节。在从文件或键盘读数据 时,采用后面两个read方法可以减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。

2. void close(: 关闭输入流,InputStream类本身的close(方法不执行任何操作。它的一些子类覆盖了close(方法, 在close(方法中释放和流有关的系统资源。 3. int available(: 返回可以从输入流中读取的字节数目; 4. skip(long: 从输入流中跳过参

数n指定数目的字节。 5. boolean markSupported(,void mark(int,void reset(: 如果要从流中重复读入数据,先用markSupported(方法 来判断这个流是否支持重复读入数据,如果返回true,则表明可以在流上设置标记。接下来调用mark(int readLimit 方法从流的当前位置开始设置标记。最后调用reset(方法,该方法使输入流重新定位到刚才做了标记的起始位置。这 样就可以重复读取做过标记的数据了。 OuputStream类提供了一系列和写数据有关的方法: 1. write(: 向输出流写入数据:有三种重载形式: a. void write(int b: 向输出流写入一个字节; b. void write(byte[] b: 把参数b指定的字节数组中的所有字节写到输出流; c. void write(byte[] b, int off, int len: 把参数b指定的字节数组中的所有字节写到输出流,参数off指定字节 数组的起始下标,从这个位置开始输出由参数len指定数目的字节; 以上第一个write方法从输出流写入一个字节,而其余两个write方法从输出流批量写出若干字节。在向文件或控制台写数据 时,采用后面两个write方法可以减少进行物理读文件或键盘的次数,因此能提高I/O操作的效率。 2. void close(: 关闭输出流,

OutputStream类本身的close(方法不执行任何操作。它的一些子类覆盖了close(方法, 在close(方法中释放和流有关的系统资源。 3. void flush(: OutputStream类本身的flush(方法不执行任何操作,它的一些带有缓冲区的子类(比如

BufferedOutputStream 和PrintStream类覆盖了flush(方法。通过带缓冲区的输出流写数据时,数据先保存在缓冲区中,积累到 一定程度才会真正写到输出流中。缓冲区通常用字节数组实现,实际上是指一块内存空间。flush(方法强 制把缓冲区内的数据写到输出流中。 三. 输入流和输出流层级结构 1. ByteArrayInputStream: 把字节数组转换为输入流; 2. FileInputStream: 从文件中读取数据; 3. PipedInputStream: 连接一个PipedOutputStream; 4. SequenceInputStream: 把几个输入流转换为一个输入流;

5. ObjectInputStream: 对象输入流; 6. FilterInputStream: 过滤器,扩展其它输入流功能; 讲解:ch14.ByteArrayTester.java 字节类型 8位二进制形式 转换为int类型二进制形式 int值 -1 1111 1111 0000 ... 1111 1111 255 -9 1111 0111 0000 ... 1111 0111 247 讲解:ch14.FileInputStreamTester.java 字符 编码值 a -> 97 b -> 98 c -> 99 1 -> 49 空格 -> 32 发 -> 186 195 //一个汉字占2个字节. 讲解:ch14.UseBuffer.java 四.

BufferedInputStream类 BufferedInputStream类覆盖了被过滤的输入流的读数据行为,利用缓冲区来提高读数据的效率。BufferedInputStream类先 把一批数据读入到缓冲区,接下来 read(方法只需要从缓冲区内获取数据,就能减少物理性读取数据的次数。 . BufferedInputStream(InputStream in——参数in指定需要被过滤的输入流。 . BufferedInputStream(InputStream in, int size——参数in指定需要被过滤的输入流。参数size指定缓冲区的大小, 以字节为单位。 五. DataInputStream 类 DataInputStream 实现了DataInput接口,用于读取基本类型数据,如int, float, long, double和boolean等。 . readByte(——从输入流中读取1个字节,指它转换为byte类型的数据; . readLong(——从输入流中读取8个字节,指它转换为long类型的数据; . readFloat(——从输入流中读取4个字节,指它转换为float类型的数

据; . readUTF(—— 从输入流中读取1到3个字节,指它转换为UTF-8字符编码的字符串; 讲解:ch14.FormatDataIO.java 六. 管道输入类:PipedInputStream 类 管道输入流从一个管理输出流中读取数据。通常由一个线程向管理输出流写数据,由另一个线程从管理输入流中读取数据, 两个线程可以用管理来通信。 讲解:ch14.PipedTest.java 七. Reader and Writer概述 InputStream和OutputStream类处理的是字节流,也就是说,数据流中的最小单元为一个字节,它包括8个二进制位。在许 多应用场合,Java应用程序需要读写文本文件。在文本文件中存放了采用特定字符编码的字符。为了便于读于各种字符 编码的字符,java.io包中提供了Reader/Writer类,它们分别表示字符

输入流和字符输出流。 在处理字符流时,最主要的问题是进行字符编码的转换。Java语言采用Unicode字符编码。对于每一个字符,Java虚拟机会 为其分配两个字节的内存。而在文本文件中,字符有可能采用其他类型的编码,比如GBK和UTF-8字符编码等。 Reader类能够将输入流中采用其他编码类型的字符转换为Unicode字符,然后在内存中为这些Unicode字符分配内存。Writer 类能够把内存中的Unicode字符转换为其他编码类型的字符,再写到输出流中。 在默认情况下,Reader和Writer会在本地平台的字符编码和Unicode字符编码之间进行编码转换。 Writer的write(方法 使用Unicode字符编码的字 --------------------------------------