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