《Java基础实践教程》课件_第九章.pptx
9.1I/O流概述
9.2字节流
9.3字符流
9.4转换流
9.5File类;计算机内部以及设备之间的数据传输也离不开交通工具和乘务员,在计算机编程中,将数据传输抽象地表述为“流”(stream),在硬件(可类比铁轨)连通的条件下,程序代码(可类比交通工具和乘务员)统一调度输入设备与输出设备之间的数据传输。用来进行输入/输出操作的流就称为I/O流(iostream)。Java语言提供了丰富的I/O流类型以支持多样化的数据传输,就好比多样化的交通工具一样。;9.1I/O流概述;就像人们出行一样,I/O流也是有方向的,数据从输入设备传输到输出设备。因此,在编程中需要明确哪个是输入设备,哪个是输出设备。在Java语言中输入和输出的概念是相对当前程序所在的内存空间来区分的。从外部设备读取数据到当前程序所在的内存空间就称为输入流(istream),从当前程序的内存空间向外写数据就称为输出流(ostream),Java语言中的I/O流根据操作的数据类型可分为字节流和字符流,它们的定义均位于java.io包里。字节流指的是数据传输时以字节(byte)为单位,它可以用来读写所有类型的文件。字符流指的是数据传输时以字符(char)为单位,它只能用于读写具有字符编码的文本文件。字节流又可分为字节输入流和字节输出流;字符流又可分为字符输入流和字符输出流。I/O流的分类如图9-1-1所示。;Java语言的I/O流比较占用内存资源,在使用完之后应及时关闭。因此Java语言中所有的I/O流均实现了java.io.closeable接口。该接口中只有一个抽象函数close,其声明的语法格式如下:
close方法的功能就是关闭流,同时释放被它占用的所有系统资源。close函数声明中抛出了IOException异常,因此需要用try-catch或try-catch-finally代码块来处理异常。实际上,由于数据传输时可能会遇到各种运行时异常,比如,文件资源找不到、存储空间已满等问题,因此几乎所有的流方法都显式地声明了抛出异常。此外,Java语言中的输出流均实现了java.io.Flushable接口。该接口中也仅定义了一个抽象方法flush,其声明的语法格式如下:
flush方法的功能就是将输出流缓存区的剩余数据全部刷新,防止在写操作过程中???据丢失。该方法也抛出了IOException异常。;9.2字节流;在计算机及智能设备中存储的都是二进制数,存储的最小单元是byte,因此可以使用字节流读写所有的文件,它的应用最为广泛。Java字节流的常用类如图9-2-1所示。;9.2.1字节输入流
字节输入流的顶层父类是InputStream类,它是一个抽象类,直接继承自Object类。InputStream类里面定义了读数据的基本操作方法,如表9-2-1所示。
;由于InputStream类是抽象类,不能直接实例化,因此主要使用它的子类来创建流对象。文件输入流FileInputStream类作为InputStream类的子类流专门用于读取据,应用非常广泛。
需要注意的是,字节输入流的前两个构造函数会抛出异常,需要使用try-catch代码块处理。第一种构造方法需要传入一个描述文件地址的字符串,通过源文件地址创建文件输入流。在计算机中文件地址分为相对路径和绝对路径。相对路径就是相对当前项目所在路径的子路径,绝对路径就是从根目录(盘符)开始的完整描述文件位置的路径。例如,当前Eclipse项目所在的路径为:
那么,以这个项目路径为根目录的Example.java文件的相对路径为:;以盘符为根目录的Example.java文件的绝对路径为:
当通过文件路径为形参的构造函数实例化一个文件输入流时,系统就建立了一个从硬盘指定位置(Example.java的存储位置)到当前程序所在内存单元的联结,也就是输入流管道。然后就可以通过流方法读取数据到内存单元了。FileInputStream类中最常用的方法有read重载方法、available、skip和close方法。下面通过一些示例演示这些方法的使用。
在Java程序中的“\”是转义符号,如果希望使用一个反斜杠,则需要使用“\\”,即反斜杠的转义字符是它本身,这点在书写文件路径时需要格外注意。该示例使用read方法逐个读取文件字节,还使用了available和skip方法。可以看到,如果文件不存在,则会报出运行时异常;当文件存在时,read方法一次读取一个字节,返回该字节的int