第11章输入输出ppt课件.ppt

上传人:本田雅阁 文档编号:2547265 上传时间:2019-04-06 格式:PPT 页数:83 大小:592.51KB
返回 下载 相关 举报
第11章输入输出ppt课件.ppt_第1页
第1页 / 共83页
第11章输入输出ppt课件.ppt_第2页
第2页 / 共83页
第11章输入输出ppt课件.ppt_第3页
第3页 / 共83页
亲,该文档总共83页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

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

1、第11章 输入/输出,本章要点,了解Java中流的概念 了解Java中输入输出流的分类 掌握文件输入输出流的使用方法 掌握带缓存的输入输出流的使用 了解ZIP压缩输入输出流的应用,第11章 输入/输出,11.1 输入/输出流 11.2 文件读写,主要内容,11.1 输入/输出流,通常程序需要从外部获取/输出信息 这个“外部”范围很广,包括诸如键盘、显示器、文件、磁盘、网络、另外一个程序等 “信息”也可以是任何类型的,例如一个对象、字符串、图像、声音等 通过使用java.io包中的输入/输出流类就可以达到输入输出信息的目的,Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符

2、或者字节数据的流动序列。 Java的I/O流提供了读写数据的标准方法 任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。 Java.io是大多数面向数据流的输入/输出类的主要软件包。,11.1 输入/输出流,数据流是一串连续不断的数据的集合。 数据写入程序可以是一段、一段地向数据流管道中写入数据,这些数据段会按先后顺序形成一个长的数据流。 对数据读取程序来说,看不到数据流在写入时的分段情况,每次可以读取其中的任意长度的数据,但只能先读取前面的数据后,再读取后面的数据。,11.1 输入/输出流,一组有序,有起点和终点的字节的数据序列。 包括输入流和输出流。,11.1 输入/

3、输出流,11.1.1 I/O流的概念,在Java中将信息的输入输出过程抽象为I/O流 输入是指数据流入程序 输出是指数据从程序流出 一个流就是一个从源流向目的地的数据序列 IO流类一旦被创建就会自动打开 通过调用close方法,可以显式关闭任何一个流,如果流对象不再被引用,Java的垃圾回收机制也会隐式地关闭它,11.1.1 I/O流的概念,输入流 为了从信息源获取信息,程序打开一个输入流,程序可从输入流读取信息,11.1.1 I/O流的概念,输出流 当程序需要向目标位置写信息时,便需要打开一个输出流,程序通过输出流向这个目标位置写信息,9,11.1.1 I/O流的概念,源和目标的类型,读写数

4、据的方法 不论数据从哪来,到哪去,也不论数据本身是何类型,读写数据的方法大体上都是一样的,11.1.1 I/O流的概念,11.1.1 I/O流的概念,缓冲流:为流配备一个缓冲区(buffer) 缓冲区就是一块存储区域,用来辅助与外部设备的数据传输,从而提高数据的传输效率 在实现写数据时,先将这些数据写入流缓冲区,而并不直接将它们送入输出设备,流缓冲区的数据量会被自动地跟踪,一旦发现缓冲区满了,就会将其中的数据一次性传输到外部设备上,缓冲区变为空 可以减少与外部设备打交道的次数,11.1.2 预定义的I/O流类概述,从流的方向划分 输入流 输出流 从流的分工划分 节点流 处理流 从流的内容划分

5、面向字符的流(字符流) 面向字节的流(二进制流),11.1.2 预定义的I/O流类概述,java.io包的顶级层次结构 面向字符的流:专门用于字符数据 面向字节的流:用于一般目的,1) 面向字符的流,面向字符的流 针对字符数据的特点进行过优化,提供一些面向字符的有用特性 源或目标通常是文本文件,面向字符的抽象类Reader和Writer java.io包中所有字符流的抽象基类 Reader提供了输入字符的API Writer提供了输出字符的API 多数程序使用这两个抽象类的一系列子类来读入/写出文本信息,1) 面向字符的流,阴影部分为节点流,1) 面向字符的流,数据源或目标中含有非字符数据,必

6、须用字节流来输入/输出 通常被用来读写诸如图片、声音之类的二进制数据 绝大多数数据是被存储为二进制文件的,世界上的文本文件大约只能占到2,通常二进制文件要比含有相同数据量的文本文件小得多,2) 面向字节的流,InputStream和OutputStream 是用来处理8位字节流的抽象基类,程序使用这两个类的子类来读写8位的字节信息 分为两部分 节点流 处理流,2) 面向字节的流,阴影部分为节点流,2) 面向字节的流,3) 标准输入输出,标准输入输出流对象,System类静态成员变量 System.in: InputStream类型的,代表标准输入流,这个流是已经打开了的,默认状态对应于键盘输入

7、。 System.out: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.readLine().length()!= 0) System.

8、out.println(s); ,运行结果 Hello! Hello!,System.in 程序启动时由Java系统自动创建的流对象,它是原始的字节流,不能直接从中读取字符,需要对其进行进一步的处理 InputStreamReader(System.in) 以System.in为参数创建一个InputStreamReader流对象,相当于字节流和字符流之间的一座桥梁,读取字节并将其转换为字符 BufferedReader in 对InputStreamReader处理后的信息进行缓冲,以提高效率,4) 处理流,不直接与数据源或目标相连,而是基于另一个流来构造 从流读写数据的同时对数据进行处理

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

10、,表示磁盘文件信息 定义了一些与平台无关的方法来操纵文件 创建、删除文件 重命名文件 判断文件的读写权限及是否存在 设置和查询文件的最近修改时间等 构造文件流可以使用File类的对象作为参数,11.1.3 File 类,11.1.3 File 类,public 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(Exceptio

11、n e) System.out.println(e.getMessage(); ,运行结果 因为在例11_2中已经创建了d:Hello.txt,所以第一次运行将删除这个文件 第二次运行则又创建了一个此名的空文件 分析 在试图打开文件之前,可以使用File类的isFile方法来确定File对象是否代表一个文件而非目录) 还可通过exists方法判断同名文件或路径是否存在,进而采取正确的方法,以免造成误操作,31,11.1.3 File 类,11.2 文件读写,11.2.1 写文本文件 11.2.2 读文本文件 11.2.3 写二进制文件 11.2.4 读二进制文件 11.2.5 处理压缩文件 1

12、1.2.6 对象序列化,11.2.1 写文本文件,本节知识点 FileWriter类 创建一个磁盘文件 关闭一个磁盘文件 write() 方法 捕获I/O异常 BufferedWriter 类,1) FileWriter类(字符输出流类),构造方法 FileWriter fw = new FileWriter(String fileName); 创建字符输出流类对象和已存在的文件相关联。文件不存在,则创建。 FileWriter fw = new FileWriter(String fileName, boolean append); 创建字符输出流类对象和已存在的文件相关联,并设置该该流对文

13、件的操作是否为续写,FileWriter fw = new FileWriter(“C:demo.txt“);,FileWriter fw = new FileWriter(“C:demo.txt“,ture);,1) FileWriter类(字符输出流类),主要方法 void write(String str) 写入字符串。 viod flush() 刷新该流中的缓冲。 viod close() 关闭此流。,11.2.1 写文本文件,【例】在C盘根目录创建文本文件Hello.txt,并往里写入若干行文本,public static void main ( String args ) thro

14、ws IOException String fileName = “D:Hello.txt“; FileWriter writer = new FileWriter( fileName ); writer.write( “Hello!n“); writer.write( “This is a filen“); writer.close(); ,每次运行这个程序,都将删除已经存在的”Hello.txt”文件,创建一个新的同名文件 FileWriter的构造方法有五个,本例是通过一个字符串指定文件名来创建 FileWriter类的write方法向文件中写入字符 close方法清空流里的内容并关闭它

15、。如果不调用该方法,可能系统还没有完成所有数据的写操作,程序就结束了,11.2.1 写文本文件-实例说明,Writer类的流可实现内部格式到外部磁盘文件格式的转换 “Hello.txt”是一个普通的ASCII码文本文件,英文字符占一个字节,中文字符占两个字节 Java程序中的字符串则是每个字符占两个字节的,采用Unicode编码,11.2.1 写文本文件-实例说明,public static void main ( String args ) String fileName = “D:Hello.txt“ ; try /将所有IO操作放入try块中 FileWriter writer = ne

16、w 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 ); ,运行此程序,会发现在原文件内容后面又追加了重复的内容,这就是将构造方法的第二个参数设为true的效果 如果将文件属性改为只读属性,再运行本程序,就会出现IO错误,程序将转入catch块中,给出出错信息,40,11.2.1

17、 写文本文件,如果需要写入的内容很多,就应该使用更为高效的缓冲器流类BufferedWriter FileWriter和BufferedWriter类都用于输出字符流,包含的方法几乎完全一样,但BufferedWriter多提供了一个newLine()方法用于换行 不同厂家生产的计算机 (IBM, Apple, VAX, Sun) 对文字的换行方法不同。newLine()方法可以输出在当前计算机上正确的换行符,2) BufferedWriter类,public static void main ( String args ) throws IOException String fileName

18、 = “D:newHello.txt“ ; BufferedWriter out =new BufferedWriter( new FileWriter( fileName ); out.write( “Hello!“ ); out.newLine() ; out.write( “This is another File“); out.close(); ,11.2.2 读文本文件,本节知识点 Reader FileReader BufferedReader和readLine(),43,FileReader类 从文本文件中读取字符 继承自Reader抽象类的子类InputStreamReader

19、 BufferedReader 读文本文件的缓冲器类 具有readLine()方法,可以对换行符进行鉴别,一行一行地读取输入流中的内容 继承自Reader,11.2.2 读文本文件,文件输入方法: 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 Buffere

20、dReader( new FileReader(fileName); line = in.readLine(); while ( line != null ) System.out.println( line ); line = in.readLine(); in.close(); catch ( IOException iox ) System.out.println(“Problem “+fileName); ,FileReader对象 创建后将打开文件,如果文件不存在,会抛出一个IOException close()方法 为了操作系统可以更为有效地利用有限的资源,应该在读取完毕后,调用该

21、方法,11.2.2 读文本文件,BufferedReader类的readLine()方法 从一个面向字符的输入流中读取一行文本。如果其中不再有数据,返回null Reader类的read()方法 也可用来判别文件结束。该方法返回的一个表示某个字符的int型整数,如果读到文件末尾,返回 -1。因此可修改本例中读文件部分,11.2.2 读文本文件,int c; while(c=in.read()!= -1) System.out.print(char)c);,11.2.3 写二进制文件,本节知识点 二进制文件 OutputStream FileOutputStream BufferedOutput

22、Stream DataOutputStream,原则上讲,所有文件都是由8位的字节组成的 如果文件字节中的内容应被解释为字符,则文件被称为文本文件;如果被解释为其它含义,则文件被称为二进制文件 例如文字处理程序,字处理软件Word产生的doc文件中,数据要被解释为字体、格式、图形和其他非字符信息。因此,这样的文件是二进制文件,不能用Reader流正确读取,11.2.3 写二进制文件,为什么需要二进制文件 输入输出更快 比文本文件小很多 有些数据不容易被表示为字符,11.2.3 写二进制文件,1) 抽象类OutputStream,提供了3个write方法来做数据的输出 public void w

23、rite(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,主要的子类,派生类FileOutputStream 作用:用来处理以文件作为数据输出目的数据流;或者说是从内存区读数据入文件 FileOutputStream(File file) 创建一个向指定File对象表示的文件中写入数据的文件输出流。 File

24、OutputStream(String name) 创建一个向具有指定名称的文件中写入数据的输出文件流。,1) 抽象类OutputStream,派生类FileOutputStream 创建一个文件流对象: FileOutputStream out= new FileOutputStream(“d:/write.txt “); File f=new File (“d:/write.txt “); FileOutputStream out= new FileOutputStream (f);,1) 抽象类OutputStream,使用键盘输入一段文章,将文章保存在文件write.txt中,publ

25、ic 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); FileOutputStream wf = new FileOutputStream(“d:/write.txt“); wf.write(buffer, 0, count); wf.close(); System.out.printl

26、n(“Save to the write.txt“); catch (IOException IOe) System.out.println(“File Write Error!“); ,派生类DataOutputStream 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后应用程序可以使用数据输入流将数据读入。 具有写各种基本数据类型的方法 将数据写到另一个输出流 在所有计算机平台上使用同样的数据格式 其中size方法,可作为计数器,统计写入的字节数,1) 抽象类OutputStream,11.2.3 写二进制文件,11.2.3 写二进制文件,public sta

27、tic 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(); catch ( IOException iox ) Syst

28、em.out.println(“Problem writing “); ,说明 FileOutputStream类的构造方法负责打开文件“data1.dat”用于写数据 FileOutputStream类的对象与DataOutputStream对象连接,写基本类型的数据,11.2.3 写二进制文件,运行结果 运行程序后,在D盘生成数据文件data1.dat 用写字板打开没有任何显示 用二进制查看器打开查看其二进制信息,内容为00 00 00 FF 00 00 00 00 FF FF FF FF,每个int数字都是32个bit的,11.2.3 写二进制文件,BufferedOutputStrea

29、m类 写二进制文件的缓冲流类 类似于文本文件中的BufferedWriter 对于大量数据的写入,可提高效率 用法示例: DataOutputStream out = new DataOutputStream( new BufferedOutputStream( new FileOutputStream( fileName ) ) );,63,11.2.3 写二进制文件,public static void main( String args ) throws IOException String fileName = “D:/mixedTypes.dat“ ; DataOutputStrea

30、m 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.writeBytes(“J

31、AVA“); System.out.println( dataOut.size() + “ bytes have been written.“); dataOut.flush(); dataOut.close(); ,运行结果 4 bytes have been written 12 bytes have been written 16 bytes have been written 说明 这个程序可作为字节计数器,11.2.3 写二进制文件,11.2.4 读二进制文件,本节知识点 FileInputStream DataInputStream BufferedInputSteam 读写整数

32、读写单字节,1) 抽象类InputStream,Inputstream类中的常用方法 public abstract int read( ):读取一个byte的数据,返回值是高位补0的int类型值。 public int read(byte b ):读取b.length个字节的数据放到b数组中。返回值是读取的字节数。 public int read(byte b , int off, int len):读取len个字节的数据,存放到偏移量为off的b数组中 public long skip(long n):忽略输入流中的n个字节,跳过一些字节来读取,派生类FileIntputStream 作用

33、:以文件作为数据输入源的数据流。或者说是打开文件,从文件读数据到内存的类 FileInputStream(String name) 通过文件系统中的路径名name创建一个FileInputStream对象。 FileInputStream(File file) 通过File对象创建一个FileInputStream对象。允许在把文件连接到输入流之前对文件做进一步分析,如修改写入删除等等,1) 抽象类InputStream,派生类FileIntputStream 使用方法: File fin=new File(“d:/abc.txt“); FileInputStream in=new FileI

34、nputStream( fin); FileInputStream in=new FileInputStream(“d: /abc.txt“);,1) 抽象类InputStream,1) 抽象类InputStream,DataInputStream,public static void main ( String args ) String fName = “D:data1.dat“; int sum = 0; try DataInputStream instr = new DataInputStream( new BufferedInputStream( new FileInputStrea

35、m( fileName ); 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 ); ,readInt方法可以从输入流中读入4个字节并将其当作int型数据 由于知道文件中存储的是3个int型数据,所以使用了3个读入语句 如果不知道数据的个数该怎

36、么办呢?因为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.read() != -1) /读取1字节,结束返回-1 System.out.write(c); s.close(); ,public static void main(

37、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“); int a=in.readByte(); System.out.println(Integer.toHexString (a); System.out.p

38、rintln(a); in.skip (-1); /往后一个位置,以便下面重新读出 a=in.readUnsignedByte(); System.out.println(Integer.toHexString (a); System.out.println(a); in.close(); ,运行结果 ffffffff -1 ff 255,用二进制查看器打开D:/trytry.dat文件,其内容为FF 如果用readByte读入,其高24位都将补1,所以结果还是-1 如果用readUnsignedByte读入,其高24位都将补0,结果就变成了255 写的字节是连续的,中间没有分隔符,所以应该记

39、住写的数据类型、个数等情况,以便将来利用,11.2.4 读二进制文件,11.2.5 处理压缩文件,压缩流类 java.util.zip包中提供了一些类,使我们可以以压缩格式对流进行读写 它们都继承自字节流类OutputStream和InputStream 其中GZIPOutputStream和ZipOutputStream可分别把数据压缩成GZIP格式和Zip格式 GZIPInputStream和ZipInputStream可以分别把压缩成GZIP格式或Zip的数据解压缩恢复原状,11.2.5 处理压缩文件,如果要从ZIP压缩管理文件内读取某个文件,要先找到对应该文件的”目录进入点”(从它可知

40、该文件在Zip文件内的位置),才能读取这个文件的内容。 如果要将文件内容写到Zip文件内,必须先写入对应于该文件的”目录进入点”,并且把要写入文件内容的位置移到此进入点所指的位置,然后再写入文件内容。 ZipEntry类产生的对象,用来代表一个ZIP压缩文件内的进入点(entry)。,77,11.2.5 处理压缩文件,压缩流的实现 ZIP是一种较为常见的压缩形式,在Java中要想实现ZIP的压缩需要导入java.util.zip包,可以使用此包中的ZipOutputStream、ZipInputStream、ZipEntry几个类完成。,11.2.5 处理压缩文件,ZipEntry: 在每一个

41、压缩文件中都会存在多个子文件,每一个子文件在JAVA中就使用ZipEntry表示。 ZipEntry类的构造方法: public ZipEntry(String name) 在实例化ZipEntry的时候,要设置名称,此名称实际上就是压缩文件中的每一个元素中的名称。,public static void main(String args) throws IOException FileInputStream fi= new FileInputStream(“D:/Hello.txt“); FileOutputStream fo= new FileOutputStream(“D:/Hello.z

42、ip“); ZipOutputStream zo=new ZipOutputStream(fo); System.out.println(“compressing from d:/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

43、FileInputStream zfi=new FileInputStream(“D:/Hello.zip“); ZipInputStream zi=new ZipInputStream(zfi); 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(); ,运行结果 首先生成了压缩文件“Hello.zip”,再读取显示其中的内容,和“Hello.txt”中的内容完全一样,解压缩文件“new.txt”,和“Hello.txt”中的内容也完全相同 说明 read()方法读取一个字节,转化为0 ,255的之间的一个整数,返回一个int。如果读到了文件末尾,则返回-1。 write(int)方法写一个字节的低8位,忽略了高24位。,11.2.5 处理压缩文件,作业,1. 求出20个最小的素数放在外存文件prime.txt中. 2. 编写程序统计给定文件中每个字母出现的频率。 附加题: 编写程序,从给定文件中读取一个整数序列,将其从小到大排序后再写入另外一个文件中。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1