教学课件第11章输入输出

上传人:s9****2 文档编号:568570520 上传时间:2024-07-25 格式:PPT 页数:83 大小:348.50KB
返回 下载 相关 举报
教学课件第11章输入输出_第1页
第1页 / 共83页
教学课件第11章输入输出_第2页
第2页 / 共83页
教学课件第11章输入输出_第3页
第3页 / 共83页
教学课件第11章输入输出_第4页
第4页 / 共83页
教学课件第11章输入输出_第5页
第5页 / 共83页
点击查看更多>>
资源描述

《教学课件第11章输入输出》由会员分享,可在线阅读,更多相关《教学课件第11章输入输出(83页珍藏版)》请在金锄头文库上搜索。

1、第第11章章 输入输入/输出输出本章要点本章要点u了解了解Java中流的概念中流的概念u了解了解Java中输入输出流的分类中输入输出流的分类u掌握文件输入输出流的使用方法掌握文件输入输出流的使用方法u掌握带缓存的输入输出流的使用掌握带缓存的输入输出流的使用u了解了解ZIP压缩输入输出流的应用压缩输入输出流的应用第第11章章 输入输入/输出输出n n11.1 输入输入/输出流输出流n n11.2 文件读写文件读写主要内容主要内容nJava所有的所有的I/O机制都是基于机制都是基于数据流数据流进行输进行输入输出,这些数据流表示了入输出,这些数据流表示了字符或者字节数字符或者字节数据据的流动序列。的

2、流动序列。nJava的的I/O流流提供了读写数据的标准方法提供了读写数据的标准方法n任何任何Java中表示数据源的对象都会提供以中表示数据源的对象都会提供以数数据流的方式据流的方式读写它的数据的方法。读写它的数据的方法。nJava.io是大多数面向数据流的输入是大多数面向数据流的输入/输出类输出类的主要软件包。的主要软件包。11.1 输入输入/输出流输出流n数据流数据流是一串连续不断的数据的集合。是一串连续不断的数据的集合。n数据写入程序数据写入程序可以是一段、一段地向数据流可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序管道中写入数据,这些数据段会按先后顺序形成一个长的数据流

3、。形成一个长的数据流。n对数据读取程序来说,看不到数据流在写入对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长时的分段情况,每次可以读取其中的任意长度的数据,但度的数据,但只能先读取前面的数据后,再只能先读取前面的数据后,再读取后面的数据读取后面的数据。11.1 输入输入/输出流输出流n一组有序,有起点和终点的字节的数据序列。一组有序,有起点和终点的字节的数据序列。n包括输入流和输出流。包括输入流和输出流。11.1 输入输入/输出流输出流11.1.1 I/O流的概念流的概念 在在Java中将信息的输入输出过程抽象为中将信息的输入输出过程抽象为I/O流流n输入是指数据

4、流入程序输入是指数据流入程序n输出是指数据从程序流出输出是指数据从程序流出一个流就是一个从源流向目的地的数据序列一个流就是一个从源流向目的地的数据序列IO流类一旦被创建就会自动打开流类一旦被创建就会自动打开通过调用通过调用close方法方法,可以显式关闭任何一个,可以显式关闭任何一个流,如果流对象不再被引用,流,如果流对象不再被引用,Java的垃圾回的垃圾回收机制也会隐式地关闭它收机制也会隐式地关闭它11.1.1 I/O流的概念流的概念n输入流输入流为了从信息源获取信息,程序打开一个输为了从信息源获取信息,程序打开一个输入流,程序可从输入流读取信息入流,程序可从输入流读取信息11.1.1 I/

5、O流的概念流的概念n输出流输出流当程序需要向目标位置写信息时,便需要当程序需要向目标位置写信息时,便需要打开一个输出流,程序通过输出流向这个打开一个输出流,程序通过输出流向这个目标位置写信息目标位置写信息9对象对象源源?/目标目标?或两者或两者?diskfilerunningprogrammonitorkeyboardInternetconnectionimagescannermouseBothBothDestinationSourceBothSourceSource11.1.1 I/O流的概念流的概念n源和目标的类型源和目标的类型n读写数据的方法读写数据的方法不论数据从哪来,到哪去,也不论数

6、据不论数据从哪来,到哪去,也不论数据本身是何类型,读写数据的方法大体上本身是何类型,读写数据的方法大体上都是一样的都是一样的读读写写打开一个流打开一个流读信息读信息关闭流关闭流打开一个流打开一个流写信息写信息关闭流关闭流11.1.1 I/O流的概念流的概念11.1.1 I/O流的概念流的概念n缓冲流缓冲流:为流配备一个缓冲区:为流配备一个缓冲区(buffer)缓冲区缓冲区就是一块存储区域,用来辅助与外部就是一块存储区域,用来辅助与外部设备的数据传输,从而提高数据的传输效率设备的数据传输,从而提高数据的传输效率在实现在实现写数据写数据时,先将这些数据时,先将这些数据写入流缓冲写入流缓冲区区,而并

7、不直接将它们送入输出设备,流缓,而并不直接将它们送入输出设备,流缓冲区的数据量会被自动地跟踪,一旦发现冲区的数据量会被自动地跟踪,一旦发现缓缓冲区满了冲区满了,就会将其中的数据,就会将其中的数据一次性传输一次性传输到到外部设备上,缓冲区变为空外部设备上,缓冲区变为空可以减少与外部设备打交道的次数可以减少与外部设备打交道的次数11.1.2 预定义的预定义的I/O流类概述流类概述n从流的方向划分从流的方向划分输入流输入流输出流输出流n从流的分工划分从流的分工划分节点流节点流处理流处理流n从流的内容划分从流的内容划分面向字符的流面向字符的流(字符流字符流)面向字节的流面向字节的流(二进制流二进制流)

8、11.1.2 预定义的预定义的I/O流类概述流类概述njava.io包包的顶级层次结构的顶级层次结构面向字符的流:专门用于字符数据面向字符的流:专门用于字符数据面向字节的流:用于一般目的面向字节的流:用于一般目的1) 面向字符的流面向字符的流n面向字符的流面向字符的流针对针对字符数据的特点字符数据的特点进行过进行过优化优化,提,提供一些面向字符的有用特性供一些面向字符的有用特性源或目标通常是源或目标通常是文本文件文本文件n面向字符的抽象类面向字符的抽象类Reader和和Writerjava.io包中所有包中所有字符流字符流的的抽象基类抽象基类Reader提供了提供了输入输入字符的字符的APIW

9、riter提供了提供了输出输出字符的字符的API多数程序使用这两个抽象类的一系列子类多数程序使用这两个抽象类的一系列子类来读入来读入/写出文本信息写出文本信息1) 面向字符的流面向字符的流阴影部分为节点流阴影部分为节点流1) 面向字符的流面向字符的流n数据源或目标中含有非字符数据,必须用字数据源或目标中含有非字符数据,必须用字节流来输入节流来输入/输出输出n通常被用来读写诸如图片、声音之类的二进通常被用来读写诸如图片、声音之类的二进制数据制数据n绝大多数数据是被存储为二进制文件的,绝大多数数据是被存储为二进制文件的,世世界上的文本文件大约只能占到界上的文本文件大约只能占到2,通常二,通常二进制

10、文件要比含有相同数据量的文本文件小进制文件要比含有相同数据量的文本文件小得多得多2) 面向字节的流面向字节的流nInputStream和和OutputStream是用来处理是用来处理8位字节流位字节流的抽象基类,程序使的抽象基类,程序使用这两个类的子类来读写用这两个类的子类来读写8位的字节信息位的字节信息分为两部分分为两部分n节点流节点流n处理流处理流2) 面向字节的流面向字节的流阴影部分为节点流阴影部分为节点流2) 面向字节的流面向字节的流3) 标准输入输出标准输入输出n标准输入输出流对象,标准输入输出流对象,System类静态成员变量类静态成员变量System.in: InputStrea

11、m类型的,代表标类型的,代表标准输入流,这个流是已经打开了的,准输入流,这个流是已经打开了的,默认状默认状态对应于键盘输入。态对应于键盘输入。System.out:PrintStream类型的,代表标类型的,代表标准输出流,准输出流,默认状态对应于屏幕输出默认状态对应于屏幕输出System.err:PrintStream类型的,代表标类型的,代表标准错误信息输出流,准错误信息输出流,默认状态对应屏幕输出默认状态对应屏幕输出public class Echo public static void main(String args) throws IOException BufferedReade

12、r in = new BufferedReader( new InputStreamReader(System.in); String s; while(s = in.readLine().length()!= 0) System.out.println(s); 运行结果运行结果Hello!Hello!nSystem.in程序启动时由程序启动时由Java系统自动创建的流对象系统自动创建的流对象,它是原始的字节流,它是原始的字节流,不能直接从中读取字符不能直接从中读取字符,需要对其进行进一步的处理需要对其进行进一步的处理nInputStreamReader(System.in)以以System.

13、in为参数创建一个为参数创建一个InputStreamReader流对象流对象,相当于字节流和字符流之间的一座桥,相当于字节流和字符流之间的一座桥梁,读取字节并将其转换为字符梁,读取字节并将其转换为字符nBufferedReader in对对InputStreamReader处理后的信息进行缓冲,处理后的信息进行缓冲,以提高效率以提高效率4) 处理流处理流n不直接与数据源或目标相连,而是不直接与数据源或目标相连,而是基于另一个基于另一个流来构造流来构造n从流读写数据的同时对数据进行处理从流读写数据的同时对数据进行处理n实例中的实例中的InputStreamReader和和BufferedRea

14、der都都属于处理流属于处理流InputStreamReader读取字节并转换为字符读取字节并转换为字符BufferedReader对另一个流产生的数据进行对另一个流产生的数据进行缓冲缓冲用一行表达式实现:用一行表达式实现:BufferedReader stdin = new BufferedReader ( new InputStreamReader(System.in) ); 4) 处理流处理流5) I/O异常异常n多数多数IO方法在遇到错误时会抛出异常方法在遇到错误时会抛出异常,因此调,因此调用这些方法时必须用这些方法时必须在方法头声明抛出在方法头声明抛出IOException异常异常或

15、者在或者在try块中执行块中执行IO,然后捕获,然后捕获IOException 11.1.3 File 类类 n表示磁盘文件信息表示磁盘文件信息n定义了一些与平台无关的方法来操纵文件定义了一些与平台无关的方法来操纵文件创建、删除文件创建、删除文件重命名文件重命名文件判断文件的读写权限及是否存在判断文件的读写权限及是否存在设置和查询文件的最近修改时间等设置和查询文件的最近修改时间等n构造文件流可以使用构造文件流可以使用File类的对象作为参数类的对象作为参数 11.1.3 File 类类 11.1.3 File 类类 public static void main(String args) th

16、rows 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,所,所以第一次运行将删除这个文件以第一次运行将删除这个文件第二次运行则又创建了一个此名的空文件第二次运行则又创建了一个此名的空文件n分析分析在试图打开文件之前,可以

17、使用在试图打开文件之前,可以使用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 处理压缩文件处理压缩文件n11.2.6 对象序列化对象序列化1

18、1.2.1 写文本文件写文本文件 n本节知识点本节知识点FileWriter类类 创建一个磁盘文件创建一个磁盘文件 关闭一个磁盘文件关闭一个磁盘文件 write() 方法方法捕获捕获I/O异常异常 BufferedWriter 类类1) FileWriter类类(字符输出流类字符输出流类)n构造方法构造方法FileWriter fw = new FileWriter(String fileName);创建字符输出流类对象和已存在的文件相关联。创建字符输出流类对象和已存在的文件相关联。文件不存在,则创建。文件不存在,则创建。FileWriter fw = new FileWriter(Strin

19、g 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刷新该流中的缓冲。刷新该流中的缓

20、冲。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

21、.close(); n每次运行这个程序,都将删除已经存在的每次运行这个程序,都将删除已经存在的”Hello.txt”文件,创建一个新的同名文件文件,创建一个新的同名文件nFileWriter的构造方法有五个,本例是通过的构造方法有五个,本例是通过一个字符串指定文件名来创建一个字符串指定文件名来创建nFileWriter类的类的write方法向文件中写入字符方法向文件中写入字符nclose方法清空流里的内容并关闭它。方法清空流里的内容并关闭它。如果如果不调用该方法,可能系统还没有完成所有数不调用该方法,可能系统还没有完成所有数据的写操作,程序就结束了据的写操作,程序就结束了11.2.1 写文本文

22、件写文本文件-实例说明实例说明nWriter类的流可实现内部格式到外部磁盘文类的流可实现内部格式到外部磁盘文件格式的转换件格式的转换“Hello.txt”是一个普通的是一个普通的ASCII码文本文码文本文件,英文字符占一个字节,中文字符占两个件,英文字符占一个字节,中文字符占两个字节字节Java程序中的字符串则是每个字符占两个字程序中的字符串则是每个字符占两个字节的,采用节的,采用Unicode编码编码11.2.1 写文本文件写文本文件-实例说明实例说明public static void main ( String args ) String fileName = D:Hello.txt ;

23、 try /将所有IO操作放入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运行此程序,运行此程序,会发现在原文件内容后面又会发现在原文件内容后面又追加了重复的内容追加了重复的内容,这就是将构造方法的这就是将构造方法的第二

24、个参数设为第二个参数设为true的效果的效果n如果将文件属性改为只读属性,再运行本如果将文件属性改为只读属性,再运行本程序,就会出现程序,就会出现IO错误,程序将转入错误,程序将转入catch块中,给出出错信息块中,给出出错信息4011.2.1 写文本文件写文本文件n如果需要写入的内容很多,就应该使用更为高如果需要写入的内容很多,就应该使用更为高效的效的缓冲器流类缓冲器流类BufferedWriternFileWriter和和BufferedWriter类都用于输出字类都用于输出字符流,包含的方法几乎完全一样,但符流,包含的方法几乎完全一样,但BufferedWriter多提供了一个多提供了一

25、个newLine()方法方法用于换行用于换行不同厂家生产的计算机不同厂家生产的计算机 (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

26、( fileName ); out.write( Hello! ); out.newLine() ; out.write( This is another File); out.close(); 读文本文件读文本文件 n本节知识点本节知识点Reader FileReader BufferedReader和和readLine() 43nFileReader类类从文本文件中读取字符从文本文件中读取字符继承自继承自Reader抽象类的子类抽象类的子类InputStreamReadernBufferedReader读文本文件的缓冲器类读文本文件的缓冲器类具有具有readLine()方法方法,可以对换行

27、符进行鉴,可以对换行符进行鉴别,一行一行地读取输入流中的内容别,一行一行地读取输入流中的内容继承自继承自Reader 读文本文件读文本文件 n文件输入方法:文件输入方法:BufferedReader in= new BufferedReader( new FileReader( fileName) ); 读文本文件读文本文件 public static void main (String args) String fileName = D:Hello.txt ; String line; try BufferedReader in = new BufferedReader(new FileRe

28、ader(fileName); line = in.readLine(); while ( line != null ) System.out.println( line ); line = in.readLine(); in.close(); catch ( IOException iox ) System.out.println(Problem +fileName); nFileReader对象对象创建后将打开文件,创建后将打开文件,如果文件不存在,会抛如果文件不存在,会抛出一个出一个IOExceptionnclose()方法方法为了操作系统可以更为有效地利用有限的资为了操作系统可以更为有

29、效地利用有限的资源,应该在读取完毕后,调用该方法源,应该在读取完毕后,调用该方法 读文本文件读文本文件 nBufferedReader类的类的readLine()方法方法从一个面向字符的输入流中读取从一个面向字符的输入流中读取一行一行文本。文本。如果其中不再有数据,返回如果其中不再有数据,返回nullnReader类的类的read()方法方法也可用来判别文件结束。该方法返回的一个也可用来判别文件结束。该方法返回的一个表示某个字符的表示某个字符的int型整数型整数,如果读到文件末,如果读到文件末尾,返回尾,返回 -1。因此可修改本例中读文件部分因此可修改本例中读文件部分 读文本文件读文本文件 i

30、nt c;while(c=in.read()!= -1) System.out.print(char)c); 11.2.3 写二进制文件写二进制文件 n本节知识点本节知识点二进制文件二进制文件 OutputStream nFileOutputStream nBufferedOutputStream nDataOutputStreamn原则上讲,原则上讲,所有文件都是由所有文件都是由8位的字节组成的位的字节组成的n如果文件字节中的内容应被解释为字符,则如果文件字节中的内容应被解释为字符,则文件被称为文本文件文件被称为文本文件;如果被解释为其它含;如果被解释为其它含义,则文件被称为二进制文件义,则

31、文件被称为二进制文件n例如文字处理程序,字处理软件例如文字处理程序,字处理软件Word产生的产生的doc文件中,数据要被解释为字体、格式、文件中,数据要被解释为字体、格式、图形和其他非字符信息。因此,这样的文件图形和其他非字符信息。因此,这样的文件是二进制文件,不能用是二进制文件,不能用Reader流正确读取流正确读取 11.2.3 写二进制文件写二进制文件 n为什么需要二进制文件为什么需要二进制文件输入输出更快输入输出更快比文本文件小很多比文本文件小很多有些数据不容易被表示为字符有些数据不容易被表示为字符 11.2.3 写二进制文件写二进制文件 1) 抽象类抽象类OutputStreamn提

32、供了提供了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类型,把低字节写入输类型,把低字节写入输出流出流1) 抽象类抽象类OutputStream主要的子类主要的子类n派生类派生类FileOutputStream作用:用来处

33、理以文件作为数据输出目的数作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据入文件据流;或者说是从内存区读数据入文件 FileOutputStream(File file) n创建一个向指定创建一个向指定File对象表示的文件中写对象表示的文件中写入数据的文件输出流。入数据的文件输出流。 FileOutputStream(String name) n创建一个向具有指定名称的文件中写入数创建一个向具有指定名称的文件中写入数据的输出文件流。据的输出文件流。1) 抽象类抽象类OutputStreamn派生类派生类FileOutputStream创建一个文件流对象创建一个文件流对象:F

34、ileOutputStream out=new FileOutputStream(d:/write.txt ); File f=new File (“d:/write.txt );FileOutputStream out= new FileOutputStream (f);1) 抽象类抽象类OutputStream使用键盘输入一段文章,将文章保存在文件使用键盘输入一段文章,将文章保存在文件write.txt中 public static void main(String args) throws IOException try System.out.println(please Input f

35、rom 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!); n派生类

36、派生类DataOutputStream数据输出流允许应用程序以数据输出流允许应用程序以适当方式适当方式将基本将基本 Java 数据类型数据类型写入输出流写入输出流中。然后应用程中。然后应用程序可以使用数据输入流将数据读入。序可以使用数据输入流将数据读入。具有写各种基本数据类型的方法具有写各种基本数据类型的方法将数据写到另一个输出流将数据写到另一个输出流在所有计算机平台上使用同样的数据格式在所有计算机平台上使用同样的数据格式其中其中size方法,可作为计数器,统计写入的方法,可作为计数器,统计写入的字节数字节数1) 抽象类抽象类OutputStream 11.2.3 写二进制文件写二进制文件 1

37、1.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.writeInt( value2 ); out.close(); cat

38、ch ( IOException iox ) System.out.println(Problem writing ); n说明说明FileOutputStream类的构造方法负责打开类的构造方法负责打开文件文件“data1.dat”用于写数据用于写数据FileOutputStream类的对象与类的对象与DataOutputStream对象连接,写基本类对象连接,写基本类型的数据型的数据 11.2.3 写二进制文件写二进制文件 n运行结果运行结果运行程序后,在运行程序后,在D盘生成数据文件盘生成数据文件data1.dat用写字板打开没有任何显示用写字板打开没有任何显示用二进制查看器打开查看其二

39、进制信息,用二进制查看器打开查看其二进制信息,内容为内容为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 BufferedOutputStream( n

40、ew 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

41、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 writt

42、en12 bytes have been written16 bytes have been writtenn说明说明这个程序可作为字节计数器这个程序可作为字节计数器 11.2.3 写二进制文件写二进制文件 11.2.4 读二进制文件读二进制文件 n本节知识点本节知识点FileInputStreamDataInputStreamBufferedInputSteam 读写整数读写整数 读写单字节读写单字节 1) 抽象类抽象类InputStreamInputstream类中的常用方法类中的常用方法npublic abstract int read( ):读取一个:读取一个byte的数的数据,返回值

43、是高位补据,返回值是高位补0的的int类型值。类型值。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作用:以

44、文件作为数据输入源的数据流。或作用:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类者说是打开文件,从文件读数据到内存的类FileInputStream(String name) n通过文件系统中的路径名通过文件系统中的路径名name创建一个创建一个FileInputStream对象。对象。 FileInputStream(File file) n通过通过File对象创建一个对象创建一个FileInputStream对象。允许在把文件连接到输入流之前对对象。允许在把文件连接到输入流之前对文件做进一步分析,如修改写入删除等等文件做进一步分析,如修改写入删除等等1) 抽象类抽

45、象类InputStreamn派生类派生类FileIntputStream使用方法使用方法: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()

46、 bytereadByte() charreadChar() doublereadDouble() floatreadFloat() intreadInt() longreadLong() shortreadShort() public static void main ( String args ) String fName = D:data1.dat; int sum = 0; try DataInputStream instr = new DataInputStream( new BufferedInputStream( new FileInputStream( fileName );

47、sum += instr.readInt(); sum += instr.readInt(); sum += instr.readInt(); System.out.println( The sum is: +sum); instr.close(); catch ( IOException iox ) System.out.println(Problem reading + fileName ); nreadInt方法可以从输入流中读入方法可以从输入流中读入4个字节并个字节并将其当作将其当作int型数据型数据n由于知道文件中存储的是由于知道文件中存储的是3个个int型数据,所型数据,所以使用了

48、以使用了3个读入语句个读入语句n如果不知道数据的个数该怎么办呢?因为如果不知道数据的个数该怎么办呢?因为DataInputStream的读入操作如遇到文件结的读入操作如遇到文件结尾就会抛出尾就会抛出EOFException异常,所以我们异常,所以我们可以将读操作放入可以将读操作放入try块中块中 11.2.4 读二进制文件读二进制文件 public static void main(String args) throws IOException FileInputStream s=new FileInputStream(d:/Hello.txt); int c; while (c = s.re

49、ad() != -1) /读取1字节,结束返回-1 System.out.write(c); s.close(); public static void main(String args) throws Exception DataOutputStream out= new DataOutputStream( new FileOutputStream(D:/trytry.dat); out.writeByte(-1); out.close(); DataInputStream in=new DataInputStream( new FileInputStream(D:/trytry.dat);

50、 int a=in.readByte(); System.out.println(Integer.toHexString (a); System.out.println(a); in.skip (-1); /往后一个位置,以便下面重新读出 a=in.readUnsignedByte(); System.out.println(Integer.toHexString (a); System.out.println(a); in.close(); 运行结果ffffffff-1ff255n用二进制查看器打开用二进制查看器打开D:/trytry.dat文件,其文件,其内容为内容为FFn如果用如果用re

51、adByte读入,其高读入,其高24位都将补位都将补1,所以结果还是所以结果还是-1n如果用如果用readUnsignedByte读入,其高读入,其高24位位都将补都将补0,结果就变成了,结果就变成了255n写的字节是连续的,中间没有分隔符,所以写的字节是连续的,中间没有分隔符,所以应该记住写的数据类型、个数等情况,以便应该记住写的数据类型、个数等情况,以便将来利用将来利用 11.2.4 读二进制文件读二进制文件 11.2.5 处理压缩文件处理压缩文件n压缩流类压缩流类包中提供了一些类,使我们可以包中提供了一些类,使我们可以以压缩格式以压缩格式对对流进行读写流进行读写它们都继承自字节流类它们都

52、继承自字节流类OutputStream和和InputStream其中其中GZIPOutputStream和和ZipOutputStream可分别把数据压缩成可分别把数据压缩成GZIP格式和格式和Zip格式格式GZIPInputStream和和ZipInputStream可以分可以分别把压缩成别把压缩成GZIP格式或格式或Zip的数据解压缩恢复的数据解压缩恢复原状原状11.2.5 处理压缩文件处理压缩文件n如果要从如果要从ZIP压缩管理文件内读取某个文件,要压缩管理文件内读取某个文件,要先找到对应该文件的先找到对应该文件的”目录进入点目录进入点”(从它可知该从它可知该文件在文件在Zip文件内的位

53、置文件内的位置),才能读取这个文件,才能读取这个文件的内容。的内容。n如果要将文件内容写到如果要将文件内容写到Zip文件内,必须先写入文件内,必须先写入对应于该文件的对应于该文件的”目录进入点目录进入点”,并且把要写入,并且把要写入文件内容的位置移到此进入点所指的位置,然文件内容的位置移到此进入点所指的位置,然后再写入文件内容。后再写入文件内容。nZipEntry类产生的对象,用来代表一个类产生的对象,用来代表一个ZIP压压缩文件内的进入点缩文件内的进入点(entry)。7711.2.5 处理压缩文件处理压缩文件n压缩流的实现压缩流的实现ZIP是一种较为常见的压缩形式,在是一种较为常见的压缩形

54、式,在Java中要中要想实现想实现ZIP的压缩需要导入包,可以使用此包的压缩需要导入包,可以使用此包中的中的ZipOutputStream、ZipInputStream、ZipEntry几个类完成。几个类完成。11.2.5 处理压缩文件处理压缩文件nZipEntry:在每一个压缩文件中都会存在多个子文件,每在每一个压缩文件中都会存在多个子文件,每一个子文件在一个子文件在JAVA中就使用中就使用ZipEntry表示。表示。nZipEntry类的构造方法:类的构造方法: public ZipEntry(String name) 在实例化在实例化ZipEntry的时候,要设置名称,此名的时候,要设置

55、名称,此名称实际上就是压缩文件中的每一个元素中的名称实际上就是压缩文件中的每一个元素中的名称。称。 public static void main(String args) throws IOException FileInputStream fi= new FileInputStream(D:/Hello.txt); FileOutputStream fo= new FileOutputStream(D:/Hello.zip); ZipOutputStream zo=new ZipOutputStream(fo); System.out.println(compressing from d:

56、/Hello.txt to d:/Hello.zip); ZipEntry e=new ZipEntry(Hell.txt); zo.putNextEntry(e); int c; while(c=fi.read()!=-1) zo.write(c); fi.close(); zo.close(); public static void main(String args) throws IOException FileInputStream zfi=new FileInputStream(D:/Hello.zip); ZipInputStream zi=new ZipInputStream(z

57、fi); ZipFile zf=new ZipFile(D:/Hello.zip); ZipEntry ze=zi.getNextEntry(); int s; InputStream is=zf.getInputStream(ze); while(s=is.read()!=-1) System.out.print(char)s); is.close(); n运行结果运行结果首先生成了压缩文件首先生成了压缩文件“Hello.zip”,再读取,再读取显示其中的内容,和显示其中的内容,和“Hello.txt”中的内容中的内容完全一样,解压缩文件完全一样,解压缩文件“new.txt”,和,和“Hello.txt”中的内容也完全相同中的内容也完全相同n说明说明read()方法读取一个字节,转化为方法读取一个字节,转化为0 ,255的的之间的一个整数,返回一个之间的一个整数,返回一个int。如果读到了。如果读到了文件末尾,则返回文件末尾,则返回-1。write(int)方法写一个字节的低方法写一个字节的低8位,忽略了高位,忽略了高24位。位。11.2.5 处理压缩文件处理压缩文件作业n1. 求出20个最小的素数放在外存文件prime.txt中.n2. 编写程序统计给定文件中每个字母出现的频率。n附加题: 编写程序,从给定文件中读取一个整数序列,将其从小到大排序后再写入另外一个文件中。

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号