1、第第11章章 输入输入/输出输出本章要点本章要点u 了解了解Java中流的概念中流的概念u 了解了解Java中输入输出流的分类中输入输出流的分类u 掌握文件输入输出流的使用方法掌握文件输入输出流的使用方法u 掌握带缓存的输入输出流的使用掌握带缓存的输入输出流的使用u 了解了解ZIP压缩输入输出流的应用压缩输入输出流的应用第第11章章 输入输入/输出输出主要内容主要内容11.1 输入输入/输出流输出流n通常程序需要通常程序需要从外部获取从外部获取/输出信息输出信息这个这个“外部外部”范围很广,包括诸如范围很广,包括诸如键盘、显键盘、显示器、文件示器、文件、磁盘、网络、另外一个程序等、磁盘、网络、
2、另外一个程序等“信息信息”也可以是任何类型的,例如一个对也可以是任何类型的,例如一个对象、字符串、图像、声音等象、字符串、图像、声音等n通过使用通过使用java.io包包中的中的输入输入/输出流类输出流类就可以就可以达到输入输出信息的目的达到输入输出信息的目的nJava所有的所有的I/O机制都是基于机制都是基于数据流数据流进行输进行输入输出,这些数据流表示了入输出,这些数据流表示了字符或者字节数字符或者字节数据据的流动序列。的流动序列。nJava的的I/O流流提供了读写数据的标准方法提供了读写数据的标准方法n任何任何Java中表示数据源的对象都会提供以中表示数据源的对象都会提供以数数据流的方式
3、据流的方式读写它的数据的方法。读写它的数据的方法。nJava.io是大多数面向数据流的输入是大多数面向数据流的输入/输出类输出类的主要软件包。的主要软件包。11.1 输入输入/输出流输出流n数据流数据流是一串连续不断的数据的集合。是一串连续不断的数据的集合。n数据写入程序数据写入程序可以是一段、一段地向数据流可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。形成一个长的数据流。n对数据读取程序来说,看不到数据流在写入对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长时的分段情况,每次可以读取其中的
4、任意长度的数据,但度的数据,但只能先读取前面的数据后,再只能先读取前面的数据后,再读取后面的数据读取后面的数据。11.1 输入输入/输出流输出流n一组有序,有起点和终点的字节的数据序列。一组有序,有起点和终点的字节的数据序列。n包括输入流和输出流。包括输入流和输出流。11.1 输入输入/输出流输出流11.1.1 I/O流的概念流的概念 在在Java中将信息的输入输出过程抽象为中将信息的输入输出过程抽象为I/O流流n输入是指数据流入程序输入是指数据流入程序n输出是指数据从程序流出输出是指数据从程序流出一个流就是一个从源流向目的地的数据序列一个流就是一个从源流向目的地的数据序列IO流类一旦被创建就
5、会自动打开流类一旦被创建就会自动打开通过调用通过调用close方法方法,可以显式关闭任何一个,可以显式关闭任何一个流,如果流对象不再被引用,流,如果流对象不再被引用,Java的垃圾回的垃圾回收机制也会隐式地关闭它收机制也会隐式地关闭它11.1.1 I/O流的概念流的概念n输入流输入流为了从信息源获取信息,程序打开一个输为了从信息源获取信息,程序打开一个输入流,程序可从输入流读取信息入流,程序可从输入流读取信息11.1.1 I/O流的概念流的概念n输出流输出流当程序需要向目标位置写信息时,便需要当程序需要向目标位置写信息时,便需要打开一个输出流,程序通过输出流向这个打开一个输出流,程序通过输出流
6、向这个目标位置写信息目标位置写信息9对象对象源源?/目标目标?或两者或两者?disk file running program monitor keyboard Internet connection image scanner mouse BothBothDestinationSourceBothSourceSource11.1.1 I/O流的概念流的概念n源和目标的类型源和目标的类型n读写数据的方法读写数据的方法不论数据从哪来,到哪去,也不论数据不论数据从哪来,到哪去,也不论数据本身是何类型,读写数据的方法大体上本身是何类型,读写数据的方法大体上都是一样的都是一样的读读写写打开一个流打开一
7、个流读信息读信息关闭流关闭流打开一个流打开一个流写信息写信息关闭流关闭流11.1.1 I/O流的概念流的概念11.1.1 I/O流的概念流的概念n缓冲流缓冲流:为流配备一个缓冲区:为流配备一个缓冲区(buffer)缓冲区缓冲区就是一块存储区域,用来辅助与外部就是一块存储区域,用来辅助与外部设备的数据传输,从而提高数据的传输效率设备的数据传输,从而提高数据的传输效率在实现在实现写数据写数据时,先将这些数据时,先将这些数据写入流缓冲写入流缓冲区区,而并不直接将它们送入输出设备,流缓,而并不直接将它们送入输出设备,流缓冲区的数据量会被自动地跟踪,一旦发现冲区的数据量会被自动地跟踪,一旦发现缓缓冲区满
8、了冲区满了,就会将其中的数据,就会将其中的数据一次性传输一次性传输到到外部设备上,缓冲区变为空外部设备上,缓冲区变为空可以减少与外部设备打交道的次数可以减少与外部设备打交道的次数11.1.2 预定义的预定义的I/O流类概述流类概述n从流的方向划分从流的方向划分输入流输入流输出流输出流n从流的分工划分从流的分工划分节点流节点流处理流处理流n从流的内容划分从流的内容划分面向字符的流面向字符的流(字符流字符流)面向字节的流面向字节的流(二进制流二进制流)11.1.2 预定义的预定义的I/O流类概述流类概述njava.io包包的顶级层次结构的顶级层次结构面向字符的流:专门用于字符数据面向字符的流:专门
9、用于字符数据面向字节的流:用于一般目的面向字节的流:用于一般目的1)面向字符的流面向字符的流n面向字符的流面向字符的流针对针对字符数据的特点字符数据的特点进行过进行过优化优化,提,提供一些面向字符的有用特性供一些面向字符的有用特性源或目标通常是源或目标通常是文本文件文本文件n面向字符的抽象类面向字符的抽象类Reader和和Writerjava.io包中所有包中所有字符流字符流的的抽象基类抽象基类Reader提供了提供了输入输入字符的字符的APIWriter提供了提供了输出输出字符的字符的API多数程序使用这两个抽象类的一系列子类多数程序使用这两个抽象类的一系列子类来读入来读入/写出文本信息写出
10、文本信息1)面向字符的流面向字符的流阴影部分为节点流阴影部分为节点流1)面向字符的流面向字符的流n数据源或目标中含有非字符数据,必须用字数据源或目标中含有非字符数据,必须用字节流来输入节流来输入/输出输出n通常被用来读写诸如图片、声音之类的二进通常被用来读写诸如图片、声音之类的二进制数据制数据n绝大多数数据是被存储为二进制文件的,绝大多数数据是被存储为二进制文件的,世世界上的文本文件大约只能占到界上的文本文件大约只能占到2,通常二,通常二进制文件要比含有相同数据量的文本文件小进制文件要比含有相同数据量的文本文件小得多得多2)面向字节的流面向字节的流nInputStream和和OutputStr
11、eam是用来处理是用来处理8位字节流位字节流的抽象基类,程序使的抽象基类,程序使用这两个类的子类来读写用这两个类的子类来读写8位的字节信息位的字节信息分为两部分分为两部分n节点流节点流n处理流处理流2)面向字节的流面向字节的流阴影部分为节点流阴影部分为节点流2)面向字节的流面向字节的流3)标准输入输出标准输入输出n标准输入输出流对象,标准输入输出流对象,System类静态成员变量类静态成员变量System.in:InputStream类型的,代表标类型的,代表标准输入流,这个流是已经打开了的,准输入流,这个流是已经打开了的,默认状默认状态对应于键盘输入。态对应于键盘输入。System.out:
12、PrintStream类型的,代表标类型的,代表标准输出流,准输出流,默认状态对应于屏幕输出默认状态对应于屏幕输出System.err:PrintStream类型的,代表标类型的,代表标准错误信息输出流,准错误信息输出流,默认状态对应屏幕输出默认状态对应屏幕输出public class Echo public static void main(String args)throws IOException BufferedReader in=new BufferedReader(new InputStreamReader(System.in);String s;while(s=in.readLi
13、ne().length()!=0)System.out.println(s);运行结果运行结果Hello!Hello!nSystem.in程序启动时由程序启动时由Java系统自动创建的流对象系统自动创建的流对象,它是原始的字节流,它是原始的字节流,不能直接从中读取字符不能直接从中读取字符,需要对其进行进一步的处理需要对其进行进一步的处理nInputStreamReader(System.in)以以System.in为参数创建一个为参数创建一个InputStreamReader流对象流对象,相当于字节流和字符流之间的一座桥,相当于字节流和字符流之间的一座桥梁,读取字节并将其转换为字符梁,读取字节
14、并将其转换为字符nBufferedReader in对对InputStreamReader处理后的信息进行缓冲,处理后的信息进行缓冲,以提高效率以提高效率4)处理流处理流n不直接与数据源或目标相连,而是不直接与数据源或目标相连,而是基于另一个基于另一个流来构造流来构造n从流读写数据的同时对数据进行处理从流读写数据的同时对数据进行处理n实例中的实例中的InputStreamReader和和BufferedReader都都属于处理流属于处理流InputStreamReader读取字节并转换为字符读取字节并转换为字符BufferedReader对另一个流产生的数据进行对另一个流产生的数据进行缓冲缓冲
15、用一行表达式实现:用一行表达式实现:BufferedReader stdin=new BufferedReader (new InputStreamReader(System.in);4)处理流处理流5)I/O异常异常n多数多数IO方法在遇到错误时会抛出异常方法在遇到错误时会抛出异常,因此调,因此调用这些方法时必须用这些方法时必须在方法头声明抛出在方法头声明抛出IOException异常异常或者在或者在try块中执行块中执行IO,然后捕获,然后捕获IOException 11.1.3 File 类类 n表示磁盘文件信息表示磁盘文件信息n定义了一些与平台无关的方法来操纵文件定义了一些与平台无关的
16、方法来操纵文件创建、删除文件创建、删除文件重命名文件重命名文件判断文件的读写权限及是否存在判断文件的读写权限及是否存在设置和查询文件的最近修改时间等设置和查询文件的最近修改时间等n构造文件流可以使用构造文件流可以使用File类的对象作为参数类的对象作为参数public File(String name)指定与 File 对象关联的文件或目录的名称,name 可以包含路径信息及文件或目录名 public File(String pathToName,String name)使用参数 pathToName(绝对路径或相对路径)来定位参数 name 所指定的文件或目录 public File(Fil
17、e directory,String name)使用现有的File对象directory(绝对路径或相对路径)来定位参数 name 所指定的文件或目录 public File(URI rui)使用给定的统一资源定位符(uniform resource identifier,URI)来定位文件 11.1.3 File 类类 boolean canRead()如果文件可读,则返回真,否则返回假 boolean canWrite()如果文件可写,则返回真,否则返回假 boolean exists()如果File构造函数参数所指定的名称是指定路径中的文件或目录,则返回真,否则返回假 boolean c
18、reateNewFile()如果文件不存在,则创建这个名字的空文件,并返回真,如果文件存在,则返回假 boolean isFile()如果 File 构造函数参数所指定的名称是一个文件,则返回真,否则返回假 boolean isDirectory()如果 File 构造函数参数所指定的名称是一个目录,则返回真,否则返回假 boolean isAbsolute()如果File构造函数参数所指定的名称是一个文件或目录的绝对路径,则返回真,否则返回假 boolean delete()删除文件或目录,如果是目录,必须是空目录才能删除成功,删除成功返回真,否则返回假 11.1.3 File 类类 pub
19、lic static void main(String args)throws IOException File f=new File(D:+File.separator+Hello.txt);if(f.exists()f.delete();else try f.createNewFile();catch(Exception e)System.out.println(e.getMessage();n运行结果运行结果因为在例因为在例11_2中已经创建了中已经创建了d:Hello.txt,所,所以第一次运行将删除这个文件以第一次运行将删除这个文件第二次运行则又创建了一个此名的空文件第二次运行则又创
20、建了一个此名的空文件n分析分析在试图打开文件之前,可以使用在试图打开文件之前,可以使用File类的类的isFile方法来确定方法来确定File对象是否代表一个文件对象是否代表一个文件而非目录)而非目录)还可通过还可通过exists方法判断同名文件或路径是否方法判断同名文件或路径是否存在,进而采取正确的方法,以免造成误操作存在,进而采取正确的方法,以免造成误操作31 11.1.3 File 类类 11.2 文件读写文件读写n11.2.1 写文本文件写文本文件n11.2.2 读文本文件读文本文件n11.2.3 写二进制文件写二进制文件n11.2.4 读二进制文件读二进制文件n11.2.5 处理压缩
21、文件处理压缩文件n11.2.6 对象序列化对象序列化11.2.1 写文本文件写文本文件 n本节知识点本节知识点FileWriter类类 创建一个磁盘文件创建一个磁盘文件 关闭一个磁盘文件关闭一个磁盘文件 write()方法方法捕获捕获I/O异常异常 BufferedWriter 类类1)FILEWRITER类类(字符输出流类字符输出流类)n构造方法构造方法FileWriter fw=new FileWriter(String fileName);创建字符输出流类对象和已存在的文件相关联。创建字符输出流类对象和已存在的文件相关联。文件不存在,则创建。文件不存在,则创建。FileWriter fw
22、=new FileWriter(String fileName,boolean append);创建字符输出流类对象和已存在的文件相关联,创建字符输出流类对象和已存在的文件相关联,并设置该该流对文件的操作是否为续写并设置该该流对文件的操作是否为续写FileWriter fw=new FileWriter(C:demo.txt);FileWriter fw=new FileWriter(C:demo.txt,ture);1)FILEWRITER类类(字符输出流类字符输出流类)n主要方法主要方法void write(String str)n写入字符串。写入字符串。viod flush()n刷新该流
23、中的缓冲。刷新该流中的缓冲。viod close()n关闭此流。关闭此流。11.2.1 写文本文件写文本文件【例例】在在C盘根目录创建文本文件盘根目录创建文本文件Hello.txt,并往里写入若干行文本并往里写入若干行文本public static void main(String args)throws IOException String fileName=D:Hello.txt;FileWriter writer=new FileWriter(fileName);writer.write(Hello!n);writer.write(This is a filen);writer.clos
24、e();n每次运行这个程序,都将删除已经存在每次运行这个程序,都将删除已经存在的的”Hello.txt”文件,创建一个新的同名文件文件,创建一个新的同名文件nFileWriter的构造方法有五个,本例是通过的构造方法有五个,本例是通过一个字符串指定文件名来创建一个字符串指定文件名来创建nFileWriter类的类的write方法向文件中写入字符方法向文件中写入字符nclose方法清空流里的内容并关闭它。方法清空流里的内容并关闭它。如果如果不调用该方法,可能系统还没有完成所有数不调用该方法,可能系统还没有完成所有数据的写操作,程序就结束了据的写操作,程序就结束了11.2.1 写文本文件写文本文件
25、-实例说明实例说明nWriter类的流可实现内部格式到外部磁盘文类的流可实现内部格式到外部磁盘文件格式的转换件格式的转换“Hello.txt”是一个普通的是一个普通的ASCII码文本文件,码文本文件,英文字符占一个字节,中文字符占两个字节英文字符占一个字节,中文字符占两个字节Java程序中的字符串则是每个字符占两个字程序中的字符串则是每个字符占两个字节的,采用节的,采用Unicode编码编码11.2.1 写文本文件写文本文件-实例说明实例说明public static void main(String args)String fileName=D:Hello.txt;try /将所有IO操作放
26、入try块中 FileWriter writer=new FileWriter(fileName,true);writer.write(Hello!n);writer.write(This is a text filen);writer.close();catch(IOException iox)System.out.println(Problem writing+fileName);n运行此程序,运行此程序,会发现在原文件内容后面又会发现在原文件内容后面又追加了重复的内容追加了重复的内容,这就是将构造方法的这就是将构造方法的第二个参数设为第二个参数设为true的效果的效果n如果将文件属性改为
27、只读属性,再运行本如果将文件属性改为只读属性,再运行本程序,就会出现程序,就会出现IO错误,程序将转入错误,程序将转入catch块中,给出出错信息块中,给出出错信息4011.2.1 写文本文件写文本文件n如果需要写入的内容很多,就应该使用更为高如果需要写入的内容很多,就应该使用更为高效的效的缓冲器流类缓冲器流类BufferedWriternFileWriter和和BufferedWriter类都用于输出字类都用于输出字符流,包含的方法几乎完全一样,但符流,包含的方法几乎完全一样,但BufferedWriter多提供了一个多提供了一个newLine()方法方法用于换行用于换行不同厂家生产的计算机
28、不同厂家生产的计算机(IBM,Apple,VAX,Sun)对文字的换行方法不同对文字的换行方法不同。newLine()方法方法可以输出在当前计算机上正确的换行符可以输出在当前计算机上正确的换行符2)BufferedWriter类类public static void main(String args)throws IOException String fileName=D:newHello.txt;BufferedWriter out=new BufferedWriter(new FileWriter(fileName);out.write(Hello!);out.newLine();out.
29、write(This is another File);out.close();11.2.2 读文本文件读文本文件 n本节知识点本节知识点Reader FileReader BufferedReader和和readLine()43nFileReader类类从文本文件中读取字符从文本文件中读取字符继承自继承自Reader抽象类的子类抽象类的子类InputStreamReadernBufferedReader读文本文件的缓冲器类读文本文件的缓冲器类具有具有readLine()方法方法,可以对换行符进行鉴,可以对换行符进行鉴别,一行一行地读取输入流中的内容别,一行一行地读取输入流中的内容继承自继承自
30、Reader11.2.2 读文本文件读文本文件 n文件输入方法:文件输入方法:BufferedReader in=new BufferedReader(new FileReader(fileName);11.2.2 读文本文件读文本文件 public static void main(String args)String fileName=D:Hello.txt;String line;try BufferedReader in=new BufferedReader(new FileReader(fileName);line=in.readLine();while(line!=null)Sys
31、tem.out.println(line);line=in.readLine();in.close();catch(IOException iox)System.out.println(Problem+fileName);nFileReader对象对象创建后将打开文件,创建后将打开文件,如果文件不存在,会抛如果文件不存在,会抛出一个出一个IOExceptionnclose()方法方法为了操作系统可以更为有效地利用有限的资为了操作系统可以更为有效地利用有限的资源,应该在读取完毕后,调用该方法源,应该在读取完毕后,调用该方法11.2.2 读文本文件读文本文件 nBufferedReader类的类的
32、readLine()方法方法从一个面向字符的输入流中读取从一个面向字符的输入流中读取一行一行文本。文本。如果其中不再有数据,返回如果其中不再有数据,返回nullnReader类的类的read()方法方法也可用来判别文件结束。该方法返回的一个也可用来判别文件结束。该方法返回的一个表示某个字符的表示某个字符的int型整数型整数,如果读到文件末,如果读到文件末尾,返回尾,返回-1。因此可修改本例中读文件部分因此可修改本例中读文件部分11.2.2 读文本文件读文本文件 int c;while(c=in.read()!=-1)System.out.print(char)c);11.2.3 写二进制文件写
33、二进制文件 n本节知识点本节知识点二进制文件二进制文件 OutputStream nFileOutputStream nBufferedOutputStream nDataOutputStreamn原则上讲,原则上讲,所有文件都是由所有文件都是由8位的字节组成的位的字节组成的n如果文件字节中的内容应被解释为字符,则如果文件字节中的内容应被解释为字符,则文件被称为文本文件文件被称为文本文件;如果被解释为其它含;如果被解释为其它含义,则文件被称为二进制文件义,则文件被称为二进制文件n例如文字处理程序,字处理软件例如文字处理程序,字处理软件Word产生的产生的doc文件中,数据要被解释为字体、格式、
34、文件中,数据要被解释为字体、格式、图形和其他非字符信息。因此,这样的文件图形和其他非字符信息。因此,这样的文件是二进制文件,不能用是二进制文件,不能用Reader流正确读取流正确读取 11.2.3 写二进制文件写二进制文件 n为什么需要二进制文件为什么需要二进制文件输入输出更快输入输出更快比文本文件小很多比文本文件小很多有些数据不容易被表示为字符有些数据不容易被表示为字符 11.2.3 写二进制文件写二进制文件 1)抽象类抽象类OUTPUTSTREAMn提供了提供了3个个write方法来做数据的输出方法来做数据的输出public void write(byte b)将参数将参数b中的字节写到输
35、出流中的字节写到输出流 public void write(byte b,int off,int len)将将b从偏移量从偏移量off开始开始len个字节写到输出流个字节写到输出流 public abstract void write(int b)先将先将int转换为转换为byte类型,把低字节写入输类型,把低字节写入输出流出流1)抽象类抽象类OUTPUTSTREAM主要的子类主要的子类n派生类派生类FileOutputStream作用:用来处理以文件作为数据输出目的数作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据入文件据流;或者说是从内存区读数据入文件 FileOutpu
36、tStream(File file)n创建一个向指定创建一个向指定File对象表示的文件中写对象表示的文件中写入数据的文件输出流。入数据的文件输出流。FileOutputStream(String name)n创建一个向具有指定名称的文件中写入数创建一个向具有指定名称的文件中写入数据的输出文件流。据的输出文件流。1)抽象类抽象类OutputStreamn派生类派生类FileOutputStream创建一个文件流对象创建一个文件流对象:FileOutputStream out=new FileOutputStream(d:/write.txt);File f=new File(“d:/write
37、.txt);FileOutputStream out=new FileOutputStream(f);1)抽象类抽象类OutputStream使用键盘输入一段文章,将文章保存在文件使用键盘输入一段文章,将文章保存在文件write.txt中 public static void main(String args)throws IOException try System.out.println(please Input from Keyboard);int count,n=512;byte buffer=new byten;count=System.in.read(buffer);FileOut
38、putStream wf=new FileOutputStream(d:/write.txt);wf.write(buffer,0,count);wf.close();System.out.println(Save to the write.txt);catch(IOException IOe)System.out.println(File Write Error!);n派生类派生类DataOutputStream数据输出流允许应用程序以数据输出流允许应用程序以适当方式适当方式将基本将基本 Java 数据类型数据类型写入输出流写入输出流中。然后应用程中。然后应用程序可以使用数据输入流将数据读入
39、。序可以使用数据输入流将数据读入。具有写各种基本数据类型的方法具有写各种基本数据类型的方法将数据写到另一个输出流将数据写到另一个输出流在所有计算机平台上使用同样的数据格式在所有计算机平台上使用同样的数据格式其中其中size方法,可作为计数器,统计写入的方法,可作为计数器,统计写入的字节数字节数1)抽象类抽象类OutputStream名称 说明 public DataOutputStream(OutputStream out)构造函数,参数为一个 OutputStream 对象作为其底层的输出对象 protected int written 私有属性,代表当前已写出的字节数 public voi
40、d flush()冲刷此数据流,使流内的数据都被写出 public final int size()返回私有变量 written 的值,即已经写出的字节数 public void write(int b)向底层输出流输出 int 变量的低八位。执行后,记录写入字节数的计数器加 1 public final void writeBoolean(boolean b)写出一个布尔数,true 为 1,false 为 0,执行后计数器增加 1 public final void writeByte(int b)将 int 参数的低八位写入,舍弃高 24 位,计数器增加 1 11.2.3 写二进制文件写
41、二进制文件 public void writeBytes(String s)字符串中的每个字符被丢掉高八位写入流中,计数器增加写入的字节数,即字符个数 public final void writeChar(int c)将 16-bit 字符写入流中,高位在前,计数器增加2 public void writeDouble(double v)写双精度数,计数器增加 8 public void writeFloat(float f)写单精度数,计数器增加 4 public void writeInt(int I)写整数,计数器增加 4 public void writeLong(long l)写长
42、整数,计数器增加 8 public final void writeShort(int s)写短整数,计数器增加 2 11.2.3 写二进制文件写二进制文件 public static void main(String args)String fileName=d:/data1.dat;int value0=255,value1=0,value2=-1;try DataOutputStream out=new DataOutputStream(new FileOutputStream(fileName);out.writeInt(value0);out.writeInt(value1);out
43、.writeInt(value2);out.close();catch(IOException iox)System.out.println(Problem writing);n说明说明FileOutputStream类的构造方法负责打开类的构造方法负责打开文件文件“data1.dat”用于写数据用于写数据FileOutputStream类的对象与类的对象与DataOutputStream对象连接,写基本类对象连接,写基本类型的数据型的数据 11.2.3 写二进制文件写二进制文件 n运行结果运行结果运行程序后,在运行程序后,在D盘生成数据文件盘生成数据文件data1.dat用写字板打开没有任何
44、显示用写字板打开没有任何显示用二进制查看器打开查看其二进制信息,用二进制查看器打开查看其二进制信息,内容为内容为00 00 00 FF 00 00 00 00 FF FF FF FF,每个,每个int数字都是数字都是32个个bit的的 11.2.3 写二进制文件写二进制文件 nBufferedOutputStream类类写二进制文件的缓冲流类写二进制文件的缓冲流类类似于文本文件中的类似于文本文件中的BufferedWriter对于大量数据的写入,可提高效率对于大量数据的写入,可提高效率用法示例:用法示例:DataOutputStream out=new DataOutputStream(new
45、 BufferedOutputStream(new FileOutputStream(fileName);63 11.2.3 写二进制文件写二进制文件 public static void main(String args)throws IOException String fileName=D:/mixedTypes.dat;DataOutputStream dataOut=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(fileName);dataOut.writeInt(0);System.out.pr
46、intln(dataOut.size()+bytes have been written.);dataOut.writeDouble(31.2);System.out.println(dataOut.size()+bytes have been written.);dataOut.writeBytes(JAVA);System.out.println(dataOut.size()+bytes have been written.);dataOut.flush();dataOut.close();n运行结果运行结果4 bytes have been written12 bytes have be
47、en written16 bytes have been writtenn说明说明这个程序可作为字节计数器这个程序可作为字节计数器 11.2.3 写二进制文件写二进制文件 11.2.4 读二进制文件读二进制文件 n本节知识点本节知识点FileInputStreamDataInputStreamBufferedInputSteam 读写整数读写整数 读写单字节读写单字节 1)抽象类抽象类INPUTSTREAMInputstream类中的常用方法类中的常用方法npublic abstract int read():读取一个:读取一个byte的数的数据,返回值是高位补据,返回值是高位补0的的int类
48、型值。类型值。npublic int read(byte b):读取:读取b.length个字节个字节的数据放到的数据放到b数组中。返回值是读取的字节数。数组中。返回值是读取的字节数。npublic int read(byte b,int off,int len):读取:读取len个字节的数据,存放到偏移量为个字节的数据,存放到偏移量为off的的b数组中数组中npublic long skip(long n):忽略输入流中的:忽略输入流中的n个个字节,跳过一些字节来读取字节,跳过一些字节来读取n派生类派生类FileIntputStream作用:以文件作为数据输入源的数据流。或作用:以文件作为数
49、据输入源的数据流。或者说是打开文件,从文件读数据到内存的类者说是打开文件,从文件读数据到内存的类FileInputStream(String name)n通过文件系统中的路径名通过文件系统中的路径名name创建一个创建一个FileInputStream对象。对象。FileInputStream(File file)n通过通过File对象创建一个对象创建一个FileInputStream对象。允许在把文件连接到输入流之前对对象。允许在把文件连接到输入流之前对文件做进一步分析,如修改写入删除等等文件做进一步分析,如修改写入删除等等1)抽象类抽象类InputStreamn派生类派生类FileIntp
50、utStream使用方法使用方法:File fin=new File(d:/abc.txt);FileInputStream in=new FileInputStream(fin);FileInputStream in=new FileInputStream(d:/abc.txt);1)抽象类抽象类InputStream1)抽象类抽象类INPUTSTREAMnDataInputStream intread(byte b)intread(byte b,int off,int len)booleanreadBoolean()bytereadByte()charreadChar()doublerea