《Java语言程序设计实验指导》电子教案第10章.ppt
《《Java语言程序设计实验指导》电子教案第10章.ppt》由会员分享,可在线阅读,更多相关《《Java语言程序设计实验指导》电子教案第10章.ppt(29页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、Return第第10章输入与输出章输入与输出10.1 Java10.1 Java输入输入/输出基础输出基础10.2 10.2 读取控制台输入读取控制台输入 10.3 10.3 向控制台写输出向控制台写输出 10.4 10.4 流类流类10.5 10.5 文件的读写文件的读写 在Java语言中,输入与输出完全基于“流”这个概念。Java输入输出的流式接口为复杂而繁重的I/O编程任务提供了一个简洁的抽象。本章将对这方面的内容作详细介绍。Return10.1 Java10.1 Java输入输入/输出基础输出基础10.1.1 流的概念 10.1.2 字节流和字符流 10.1.3 预定义流 10.1.4
2、 Java输入/输出类和接口 关于Java的输入/输出问题我们在前面的程序代码中一般都接触过,只是没有系统地进行讨论。本节将对Java的输入/输出问题作一个概述。10.1.1流的概念我们知道,多数程序在不获取外部数据的情况下不能顺利完成目标。数据从一个输入源获得,程序的结果被送到输出目的地。在Java中,这些源和目的地被广泛地定义。例如一个网络连接器,内存缓冲区或磁盘文件可以被Java输入/输出类熟练地操作。尽管从物理意义上很难说明,这些外设都由相同的抽象体流(stream)来处理。流是一个生产或消费信息的逻辑实体,它通过Java输入/输出系统与物理设备相连。尽管与之相连的实际物理设备各不相同
3、,但是所有的流都以同样的方式运转。Java程序通过流来完成输入/输出,它是生产或消费信息的抽象。流通过Java的输入/输出系统与物理设备链接。尽管与它们链接的物理设备不尽相同,但是所有流的行为具有同样的方式。这样,相同的输入/输出类和方法适用于所有类型的外部设备。这意味着一个输入流能够抽象多种不同类型的输入:从磁盘文件,从键盘或从网络套接字。同样,一个输出流可以输出到控制台,磁盘文件或相连的网络。流是处理输入/输出的一个洁净的方法,例如它不需要代码理解键盘和网络的不同。Java中流的实现是基于java.io包定义的类层次结构的。Return10.1.2字节流和字符流在Java2中,定义了两种类
4、型的流:字节类和字符类。字节流(bytestream)为处理字节的输入和输出提供了方便的方法。例如,使用字节流读取或书写二进制数据。字符流(characterstream)为字符的输入和输出处理提供了方便。这两种流采用了统一的编码标准,因而可以国际化。当然,在某些场合字符流比字节流更为有效。在Java的早期版本(Java1.0)中不包括字符流,因此所有的输入和输出都是以字节为单位的。后来,Java1.1中加入了字符流,某些字节形式的类和方法不被推荐使用。这也是为什么没用字符流的老代码在适当的地方需要更新的原因。需要说明的是,在最底层,所有的输入/输出都是字节形式的。基于字符的流只是为处理字符提
5、供方便有效的方法。下面对字节流和字符流分别作简要介绍。字节流由两个类层次结构定义。在顶层有两个抽象类:InputStream和OutputStream。每个抽象类都有多个具体的子类,这些子类对不同的外设进行处理,例如磁盘文件、网络连接、甚至是内存缓冲区。各种字节流类及其相关说明见教材P235页。1字节流类字节流类字符流类由两个类层次结构定义。顶层有两个抽象类:Reader和Writer。这些抽象类处理统一编码的字符流。在Java中这些类含有多个具体的子类详见教材P235236页。2字符流类字符流类Return10.1.3预定义流我们已经知道,所有的Java程序运行时自动导入java.lang包
6、,这个包定义了一个名为System的类,该类封装了运行时环境的多个方面。例如,使用它的某些方法,能获得当前时间和与系统有关的不同属性。System同时还包含有3个预定义的流变量:in、out和err。这些成员在System中是被定义成public和static型的,即意味着它们可以不引用特定的System对象而被用于程序的其他部分。System.out是标准的输出流,在默认情况下它是一个控制台;System.in是标准输入,默认情况下指的是键盘;System.err指的是标准错误流,它默认是控制台。需要指出的是,这些流可以重定向到任何兼容的输入/输出设备。System.in是InputStre
7、am的对象;System.out和System.err是PrintStream的对象。尽管它们是用来读写外设字符的,它们都是字节流。如果编程人员愿意,可以用基于字符的流来包装它们。在前面章节中多次用到过System.out,我们可以同样的方式使用System.err。System.in的使用则稍微复杂一些。Return10.1.4Java输入/输出类和接口在Java 2中,java.io包定义的输入/输出类见教材P236237页。不难发现,其中包含了前面所介绍的字节流和 字 符 流。其 中,ObjectInputStream.GetField和ObjectOutputStream.PutFie
8、ld是Java2中新添的内部类。对于Java 2不 推 荐 使 用 的 两 个 类 LineNumber InputStream和StringBufferInputStream,上面没有列出。虽然java.io中予以保留,但一般情况下不应使用。由java.io定义的接口见教材237页。其中,FileFilter接口是Java2中新增的。从以上介绍不难发现,java.io包中有很多的类和接口,包括各种字节流、字符流、对象序列化(对象的存储和释放)。后面我们将介绍其中一些最常用的I/O成员。ReturnReturn10.2读取控制台输入10.2.1如何读取控制台输入10.2.2读取字符10.2.3
9、读取字符串在本节中,我们将介绍Java如何读取控制台输入的有关问题。10.2.1如何读取控制台输入在Java1.0中,完成控制台输入的唯一途径是字节流,这种方法现在依旧可用。但是,这种做法不值得推荐。在Java2中,读取控制台输入的首选方法应该是字符流,它使程序容易符合国际标准,并且易于维护。在Java中,控制台输入由从System.in读取数据来完成。为获得属于控制台的字符流,在BufferedReader对象中包装了System.in。BufferedReader支持缓冲输入流,它最常见的构造函数如下:BufferedReader(ReaderinputReader)其中,inputRea
10、der是链接被创建的BufferedReader实例的流。Reader是一个抽象类,它的一个具体的子类是InputStreamReader,该子类将字节转换成字符。为获得链接System.in的一个InputStreamReader的对象,使用下面的构造函数:InputStreamReader(InputStreaminputStream)由于System.in引用了InputStream类型的对象,它可以用于inputStream。综上所述,下面的代码创建了与键盘相连的BufferedReader对象。BufferedReaderbr=newBufferedReader(newInputSt
11、reamReader(System.in);当该语句执行后,br是通过System.in生成的链接控制台的字符流。Return10.2.2读取字符要从BufferedReader读取字符,用read()。例如:intread()throwsIOException该方法每次执行都从输入流读取一个字符,然后以整型形式返回。当遇到流的末尾时,它返回-1。可以看到,它要引发一个IOException异常。分析教材P238页的例子。Return10.2.3读取字符串从 键 盘 读 取 字 符 串,使 用 readLine()方 法,它 是BufferedReader类的成员。这个方法的一般使用形式如下。
12、StringreadLine()throwsIOException该方法返回一个String对象。例如,教材P239页的程序可生成一个小文本编辑器。它创建了一个String对象的数组,然后依行读取文本,将文本的每一行存入到数组中。当它读到100行或输入“stop”时才停止。该例程使用一个BufferedReader类来从控制台读取数据。ReturnReturn10.3向控制台写输出10.3.1如何向控制台写输出10.3.2PrintWriter类在前面章节中我们接触过的控制台输出方式有print()和 println()等 简 单 途 径,这 两 种 方 法 由PrintStream(Syst
13、em.out引用的对象类型)定义。本节介绍如何进行控制台写输出。10.3.1如何向控制台写输出因为PrintStream是从OutputStream派生的输出流,它同样实现低级方法write()。write()可用来向控制台写数据,PrintStream定义的write()的最简单形式是:voidwrite(intbyteval)该方法按照byteval指定的数向文件写字节。尽管byteval定义成整数,但只有低位的8个字节被写入。下面的例程用write()向屏幕输出字符“A”,然后是新的行:/DemonstrateSystem.out.write().classWriteDemopublic
14、staticvoidmain(Stringargs)intb;b=A;System.out.write(b);System.out.write(n);一般情况下,我们不用write()来完成向控制台的输出,尽管在某些场合很有效。相比来说print()和println()方法更容易使用。Return10.3.2PrintWriter类尽管Java允许使用System.out向控制台写数据,但建议仅用于调试程序时。对于实际的程序,Java推荐的向控制台写数据的方法是用PrintWriter流。PrintWriter是基于字符的类,用基于字符的类向控制台写数据使程序更为国际化。PrintWriter
15、定义了多个构造函数,我们所用到的一个如下。PrintWriter(OutputStreamoutputStream,booleanflushOnNewline)这里,outputStream是OutputStream类的对象,flushOnNewline控制Java是否在println()方法被调用时刷新输出流。如果flushOnNewline为true,刷新自动发生,若为false,则不发生。PrintWriter支持所有类型(包括Object)的print()和println()方法,这样,我们就可以像用System.out那样用这些方法。如果遇到不同类型的情况,PrintWriter方法
16、调用对象的toString()方法并打印结果。用PrintWriter向外设写数据,指定输出流为System.out,并在每一新行后刷新流。教材P241页的代码创建了与控制台输出相连的PrintWriter类。ReturnReturn10.4 流类流类10.4.1字节流10.4.2字符流前面我们简单介绍了控制台的输入/输出,下面我们具体介绍各种流类。Java的流式输入/输出建立在4个抽象类的基础上:InputStream、OutputStream、Reader和Writer。这些类在前面已经提到过,它们用来创建具体流式子类。尽管程序通过具体子类执行输入/输出操作,顶层的类定义了所有流类的基础通
17、用功能。我们已经知道,InputStream和OutputStream设计成字节流类,而Reader和Writer为字符流设计。字节流类和字符流类形成分离的层次结构。一般说来,处理字符或字符串时应使用字符流类,处理字节或二进制对象时应使用字节流类。下面分别介绍字节流和字符流类。10.4.1字节流字节流类为处理字节式输入/输出提供了丰富的环境,一个字节流可以和其他任何类型的对象并用,包括二进制数据。这样的多功能性使得字节流对很多类型的程序都很重要。由于字节流类以InputStream和OutputStream为顶层,我们就从讨论这两个类开始。InputStream是一个定义了Java流式字节输入
18、模式的抽象类,该类的所有方法在出错条件下引发一个IOException异常。InputStream的各种方法见教材P242页。1InputStream(输入流)(输入流)OutputStream是定义了流式字节输出模式的抽象类,该类的所有方法返回一个void值并且在出错情况下引发一个IOException异常。OutputStream的各种方法见教材P242页。2OutputStream(输出流)(输出流)FileInputStream类创建一个能从文件读取字节的InputStream类,它的两个常用的构造函数如下:FileInputStream(Stringfilepath)FileInpu
19、tStream(FilefileObj)它们都能引发FileNotFoundException异常。这里,filepath是文件的全称路径,fileObj是描述该文件的File对象。分析教材P243页的例子。3FileInputStream(文件输入流)(文件输入流)FileOutputStream创建了一个可以向文件写入字节的类OutputStream,它常用的构造函数如下:FileOutputStream(StringfilePath)FileOutputStream(FilefileObj)FileOutputStream(StringfilePath,booleanappend)它们可
20、以引发IOException或SecurityException异常。这里,filePath是文件的全称路径,fileObj是描述该文件的File对象。如果append为true,文件以设置搜索路径模式打开。FileOutputStream的创建不依赖于文件是否存在。在创建对象时FileOutputStream在打开输出文件之前创建它。这种情况下,如果试图打开一个只读文件,将会引发一个IOException异常。教材P244245页的例子用于创建一个样本字节缓冲器。4FileOutputStream(文件输出流)(文件输出流)RandomAccessFile包装了一个随机访问的文件,注意它不是
21、派生于InputStream和OutputStream,而是实现了基本输入/输出方法的DataInput和DataOutput接口。它同样支持定位请求,也就是说可以在文件内部放置文件指针。它有两个构造函数:RandomAccessFile(FilefileObj,Stringaccess)throwsFileNotFoundExceptionRandomAccessFile(Stringfilename,Stringaccess)throwsFileNotFoundException第一种形式,fileObj指定了作为File对象打开的文件的名称;第二种形式,文件名是由filename参数传入
22、的。两种情况下,access都决定允许访问何种文件类型。如果是“r”,那么文件可读不可写,如果是“rw”,文件以读写模式打开。5RandomAccessFile(随机访问文件类)(随机访问文件类)ByteArrayInputStream是把字节数组当成源的输入流。该类有两个构造函数,每个构造函数需要一个字节数组提供数据源。ByteArrayInputStream(bytearray)ByteArrayInputStream(bytearray,intstart,intnumBytes)这里,array是输入源。第二个构造函数创建了一个InputStream类,该类从字节数组的子集生成,以sta
23、rt指定索引的字符为起点,长度由numBytes决定。教材P246页的例子创建了两个ByteArrayInputStream对象,并用字母表的字节初始化它们。6ByteArrayInputStream(字节数组输入流)(字节数组输入流)ByteArrayOutputStream是 一 个 把 字 节 数 组 当 作 输 出 流 的 实 现。ByteArrayOutputStream有两个构造函数,分别如下:ByteArrayOutputStream()ByteArrayOutputStream(intnumBytes)在第一种形式里,一个32位字节的缓冲器被生成。第二个构造函数生成一个跟指定n
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java语言程序设计实验指导 Java 语言程序设计 实验 指导 电子 教案 10
限制150内