Java面向对象程序设计 教学课件 ppt 张亦辉 冯华 胡洁 第6章 输入

上传人:E**** 文档编号:89369518 上传时间:2019-05-24 格式:PPT 页数:27 大小:245.50KB
返回 下载 相关 举报
Java面向对象程序设计 教学课件 ppt 张亦辉 冯华 胡洁 第6章  输入_第1页
第1页 / 共27页
Java面向对象程序设计 教学课件 ppt 张亦辉 冯华 胡洁 第6章  输入_第2页
第2页 / 共27页
Java面向对象程序设计 教学课件 ppt 张亦辉 冯华 胡洁 第6章  输入_第3页
第3页 / 共27页
Java面向对象程序设计 教学课件 ppt 张亦辉 冯华 胡洁 第6章  输入_第4页
第4页 / 共27页
Java面向对象程序设计 教学课件 ppt 张亦辉 冯华 胡洁 第6章  输入_第5页
第5页 / 共27页
点击查看更多>>
资源描述

《Java面向对象程序设计 教学课件 ppt 张亦辉 冯华 胡洁 第6章 输入》由会员分享,可在线阅读,更多相关《Java面向对象程序设计 教学课件 ppt 张亦辉 冯华 胡洁 第6章 输入(27页珍藏版)》请在金锄头文库上搜索。

1、第6章 输入/输出和异常处理,在实际的应用开发中经常会遇到数据输入/输出的需求,这样的需求在Java中使用I/O流来实现。本章首先介绍Java中用于输入/输出的I/O流,然后介绍与输入/输出密切相关的序列化机制和文件管理,最后介绍Java中的异常处理,它用于保证代码的容错性。,6.1 I/O流,一个好的程序语言,完善的输入输出功能是必不可少的。在Java中将不同来源和目标的数据统一抽象为流,通过对流对象的操作来完成I/O功能。Java中的流很灵活,可以连接到各种不同的源或目标,如磁盘文件、键盘(输入设备)、显示器(输出设备)、网络等。,6.1.1 流的层次,Java中所有的I/O都是通过流来实

2、现的,可以将流理解为连接到数据目标或源的管道,可以通过连接到源的流从源当中读取数据,或通过连接到目标的流向目标中写入数据。根据流的方向可以将其分为两类:输入流和输出流。用户可以从输入流中读取信息,向输出流中写信息。根据流处理数据类型的不同也可以将其分为两类:字节流与字符流。下面主要从类的层次来介绍I/O流。 Java中I/O流是由java.io包来实现的,其中的类大致分为输入和输出两大部分。在java.io包最顶层包含子类较多的两个类是InputStream和OutputStream。图分别表示java.io包中的输入流类和输出流类的层次。这两个类均为抽象类,也就是说不能创建它们的实例对象,必

3、须创建子类之后才能建立对象。java.io包中的很多类都是从这两个类继承而来的,因此,这些子类有很多相同的方法。,6.1.2 输入流和输出流,前面介绍过,Java的I/O类库分成输入和输出两大部分。所有InputStream和Reader的派生类都有一个继承下来的,能读取单个或byte数组的read()方法。同理,所有OutputStream和Writer的派生类都有一个能写入单个或byte数组的write()方法。但通常情况下,这些方法不是直接应用的,而是供其他类使用,而其他类会提供一些更实用的接口。Java的设计者们遵循这样的原则:让所有与输入相关的类去继承InputStream,所有与输

4、出相关的类继承OutputStream。,6.1.3 字节流和字符流,根据流处理数据类型的不同也可以将其分为两类:字节流与字符流,下面列出了这两种流的不同之处。字节流:字节流以字节为基本单位来处理数据的输入/输出,一般都用于对二进制数据的读写,如声音、图像等。 字符流:字符流以字符为基本单位来处理数据的输入和输出,一般都用于对文本类型数据的读写,如文本文件、网络中发送的文本信息等。 虽然文本数据也可以看作二进制数据,但一般采用字符流处理文本数据比采用字节流效率更高,也更方便。,6.1.4 随机存取文件流,前面介绍的都是顺序访问的流,在Java还有一种支持随机访问的流RandomAccessFi

5、le。这个类的实例支持同时进行的读/写操作。一个随机存取文件好比存储在文件系统中的一个大“数组”。该“数组”有一个文件指针,输入操作从该指针所指示的地方开始读取数据,每读一个字节,指针后移一个字节。如果一个随机存取文件以读/写方式创建,也可对其进行输出(写)操作。输出操作也从文件指针所指的地方写字节,并将指针置于所写字节之后。当输出操作超过了“数组”的末尾,将导致文件的扩大。文件指针可用getFilePointer()方法读取,用seek()方法设置。,6.2 I/O流的使用,Java的流式输入和输出,是通过使用前面介绍的这些I/O流类来实现的。本节将具体介绍如何使用这些流类,包括标准的I/O

6、输出、基本的I/O流、过滤流、文件的随机读写和流的分割。,6.2.1 标准的I/O流,下面首先介绍标准的I/O流的使用方法。在Java语言中,键盘用stdin表示,监视器用stdout表示。它们均被封装在System类的类变量in和out中,分别对应于System.in和System.out。事实上,类变量in和out分别属于类InputStream和PrintStream,只是由于InputStream和PrintStream不能用new()方法直接创建,所以才在System类中声明为如下的3个类变量。 public static InputStream in public static P

7、rintStream out public static PrintStream err,6.2.2 基本的I/O流,基本的I/O流主要包括InputStream类、OutputStream类、PipedInputStream类和PipedOutput Stream类以及SequenceInputStream类,下面分别加以介绍。 1InputStream类 InputStream类是以字节为单位的输入流。数据来源可以是键盘,也可以是诸如Internet这样的网络环境。这个类可作为许多输入类的基类。InputStream是一个抽象类,因此不能建立它的实例,用户只能使用它的子类。注意,大多数输入

8、方法都抛出了IOException异常,因此如果程序中调用了这些输入方法,就必须捕获和处理IOException异常。,6.2.2 基本的I/O流,2OutputStream类 OutputStream是与InputStream相对应的输出流类,它具有输出流的所有基本功能。由于OutputStream实现输出流的许多方法与InputStream流的方法相对应,下面仅简单列出与输入流类相对应的方法。 public abstract void write(int b ) throws IOException:向流中写入一个字节。 public void write(byte b) throws I

9、OException:向流中写入一个字节数组。 public void write(byte b,int off,int len) throws IOException:在从数组中的第off个位置开始的len个位置上写入数据。 public void flush ( ) throws IOException:清空流并强制将缓冲区中所有数据写入到流中。 public void close ( ) throws IOException:关闭流对象。,6.2.2 基本的I/O流,3PipedInputStream和PipedOutputStream类 管道流用于线程之间的通信。一个PipedInpu

10、tStream必须连接一个PipedOutputStream,而且一个PipedOutputStream也必须连接一个PipedInputStream。这两个类用于实现与Unix中的管道相似的管道流。PipedInputStream实现管道的输入端,而PipedOutputStream用于实现管道的输出端。 PipedInputStream类从管道中读取数据时,这个管道数据是由PipedOutputStream类写入的。因此,在使用PipedInputStream类之前,必须将它连接到PipedOutputStream类。可以在实例化PipedInputStream类时建立这个连接,或者调用C

11、onnect()方法建立连接。PipedInputStream中包含用于读数据的底层方法,同时也提供了读数据的高层接口。,6.2.2 基本的I/O流,4SequenceInputStream类 SequenceInputStream类是InputStream类的一个子类。使用这个类可以将两个独立的流合并为一个逻辑流。合并后的流中的数据按照在各个流中指定的顺序读出。第一个流结束时,使用无缝连接的方式开始从第二个流中读取数据。 下面是一个使用SequenceInputStream类的例子,代码片段如下。 1 InputStream is1 = new FileInputStream(“file1.

12、dat“); 2 InputStream is2 = new FileInputStream(“file2.dat“); 3 SequenceInputStream sis = new SequenceInputStream(is1,is2); 4 / 合并两个流 5 for(;) 6 int data = sis.read( ); 7 if (data = = -1) break; 8 ,6.2.3 过滤流,从前面的介绍可以知道,过滤流FilterInputStream和FilterOutputStream分别是InputStream和OutputStream的子类,而且它们也都是抽象类。F

13、ilterInputStream类和FilterOutputStream类都重写了超类InputStream和OutputStream的方法。 FilterInputStream和FilterOutputStream为读写处理数据的过滤流定义接口。其子类则进一步实现接口和方法。这些子类有以下几种。 DataInputStream类和DataOutputStream类 BufferedInputStream和BufferedOutputStream类 LineNumberInputStream类 PushbackInputStream类,6.2.4 文件随机读写,前面介绍过流的随机读写是Java

14、输入输出的一个显著特点。RandomAccessFile类实现了上述功能。RandomAccessFile类具有DataInputStream和DataOutputStream对象的所有功能。当程序把一个RandomAccessFile对象与一个文件关联时,程序从文件定位指针指定的位置开始读写数据,并且把所有数据当成基本数据类型来操作。使用RandomAccessFile除了可以读写文件中任意位置的字节外,还可以读写文本和Java的基本数据类型。,6.2.5 流的分割,流的分割是由StreamTokenizer类实现的。该类把一个流的内容划分成若干个token单位,一次可以读写一个token。

15、token是文本分析算法可识别的最小单位(如单词、符号等)。一个StreamTokenizer对象可用于分析任何文本文件。它可以识别标识符、数字、引号包围的字符串以及各种注释形式。 尽管StreamTokenizer并不是从InputStream或OutputStream衍生的,但它只随同InputStream工作,所以十分恰当地包括在库的IO部分。StreamTokenizer类用于将任何InputStream分割为一系列“记号(Token)”。这些记号实际是一些断开的文本块,中间用我们选择的任何东西分隔。例如,记号可以是单词,中间用空白(空格)以及标点符号分隔。,6.3 对象的序列化,Ja

16、va的对象序列化用于将一个实现了Serializable接口的对象转换成一组byte,这样以后要用这个对象时候,就能把这些byte数据恢复出来,并据此重新构建那个对象了。这一点甚至在跨网络的环境下也是如此,这就意味着序列化机制能自动补偿操作系统方面的差异。也就是说,可以在Windows机器上创建一个对象,序列化之后,再通过网络传到Unix机器上,然后在那里进行重建,而不用担心在不同的平台上数据是怎样表示的,byte顺序怎样,或者别的什么细节。,6.3.1 存储对象,Java序列化技术可以将一个对象的状态写入一个byte流里,并且可以从其他地方把该byte流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象存储到数据库、文件等系统里。Java的序列化机制是RMI、EJB、JNNI等技术的技术基础。 并非所有的Java类都可以序列化,为了使指定的类可以实现序列化,必须使该类实现接口java.io.Serializable。需要注意的是,该接口什么方法也没有。实现该类只是简单的标记类准备支持序列

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 大学课件

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