




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、Java面向对象程序设计8/18/20221IT企业文化口号训练1、Java,Java,I Love You!2、我一定要学好Java!3、我一定能学好Java!8/18/20222第6章 输入/输出和异常处理8/18/20223思考问题Why?Java程序必须同输入输出设备(文件、显示器、网络等)进行交互。How?8/18/202246.1 I/O流在Java中将不同来源和目标的数据统一抽象为流,通过对流对象的操作来完成I/O功能。Java中的流很灵活,可以连接到各种不同的源或目标,如磁盘文件、键盘(输入设备)、显示器(输出设备)、网络等。8/18/20225流的层次字节流8/18/2022
2、6流的层次字符流java.io.Reader 和 java.io.Writer类java.io.Reader 和java.io.Writer 是抽象(abstract )类是基于文本的其它读写器的父类(superclasses)输入/输出流字节流读写器是基于字符8/18/202276.1.3 字节流和字符流根据流处理数据类型的不同也可以将其分为两类:字节流与字符流,下面列出了这两种流的不同之处。字节流:字节流以字节为基本单位来处理数据的输入/输出,一般都用于对二进制数据的读写,如声音、图像等。字符流:字符流以字符为基本单位来处理数据的输入和输出,一般都用于对文本类型数据的读写,如文本文件、网络
3、中发送的文本信息等。虽然文本数据也可以看作二进制数据,但一般采用字符流处理文本数据比采用字节流效率更高,也更方便。8/18/20228处理数据流的核心思想处理数据流的核心思想能过循环处理每个数据单元,直到遇到结束符或出现异常(Exception)结束符在Unix操作系统下, 键入Control-D表示数据流的结束在Windows操作系统下, 键入Control-Z表示数据流的结束8/18/20229类 InputStream类java.io.InputStream 是一个抽象(abstract)类,声明了从原始字节数据流读入数据的基本方法类中声明的方法:public abstract int
4、read( ) throws IOException public int read(byte data) throws IOException public int read(byte data, int offset, int length) throws IOException public long skip(long n) throws IOException public int available( ) throws IOException public void close( ) throws IOException public void mark(int readlimit
5、) public void reset( ) throws IOException public boolean markSupported( ) 8/18/202210类InputStream的成员方法read( )读入单个无符号字节(unsigned byte)的数据,并返回一个整数类型(int)的值(与读入的无符号字节数据相对应)正常返回: 介于0和255之间的一个数 如果遇到数据流结束,则返回-1public abstract int read( ) throws IOException8/18/202211下面的两个方法可以一次读入多个字节到数组中java.io.InputStrea
6、m public int read(byte data) throws IOException public int read(byte data, int offset, int length) throws IOException8/18/202212方法 available( ) 给出可以读入的字节数这样在读数据之前就知道可以读入的字节数java.io.InputStreampublic int available( ) throws IOException8/18/202213当处理完数据流时,应当关闭该数据流,以便释放该数据流所关联的资源public void close( ) th
7、rows IOException8/18/202214类OutputStreamOutputStream 也是abstract 类类中的成员方法:public abstract void write(int b) throws IOException public void write(byte data) throws IOException public void write(byte data, int offset, int length) throws IOException public void flush( ) throws IOExceptionpublic void clo
8、se( ) throws IOException 有时输出流会先输出到缓存中,最后再一起将数据写到指定的位置(如文件)。方法flush( )可以强制进行输出,即强制将数据写到指定的位置(如文件/标准输出)8/18/202215Print 数据流类 java.io.PrintStream 是类FilterOutputStream的子类示例: System.out 和 System.err类PrintStream 的实例对象不会抛出(throws)异常(IOException)这个类“吃掉”(traps)所有的异常(IOExceptions)8/18/202216java.lang.Object
9、| +-java.io.OutputStream | +-java.io.FilterOutputStream | +-java.io.PrintStream8/18/2022176.2 I/O流的使用标准的I/O流java.lang.Object | +-java.lang.Systemstatic PrintStream err 标准错误输出流static InputStream in 标准输入流static PrintStream out 标准输出流 在Java语言中,键盘用stdin表示,监视器用stdout表示。它们均被封装在System类的类变量in和out中,分别对应于Syste
10、m.in和System.out。事实上,类变量in和out分别属于类InputStream和PrintStream,只是由于InputStream和PrintStream不能用new()方法直接创建,所以才在System类中声明为如右的3个类变量。8/18/2022186.2 I/O流的使用JDK5.0开始提供了类似C语言中的格式化输出的printf()方法。public PrintStream printf(String format,Object args)8/18/202219使用Scanner工具Java 5添加了java.util.Scanner类,这是一个用于扫描输入文本的新的实用
11、程序。它是以前的StringTokenizer和Matcher类之间的某种结合。由于任何数据都必须通过同一模式的捕获组检索或通过使用一个索引来检索文本的各个部分。于是可以结合使用正则表达式和从输入流中检索特定类型数据项的方法。这样,除了能使用正则表达式之外,Scanner类还可以任意地对字符串和基本类型(如int和double)的数据进行分析。借助于Scanner,可以针对任何要处理的文本内容编写自定义的语法分析器。Scanner是SDK1.5新增的一个类,可是使用该类创建一个对象.8/18/202220Scanner的使用Scanner reader=new Scanner(System.i
12、n);然后reader对象调用下列方法(函数),读取用户在命令行输入的各种数据类型:next.Byte(),nextDouble(),nextFloat,nextInt(),nextLine(),nextLong(),nextShot()上述方法执行时都会造成堵塞,等待用户在命令行输入数据回车确认.例如,拥护在键盘输入12.34,hasNextFloat()的值是true,而hasNextInt()的值是false. NextLine()等待用户输入一个文本行并且回车,该方法得到一个String类型的数据。下面是一个实例: 8/18/202221 import java.util.*;publ
13、ic class Examplepublic static void main(String args)System.out.println(请输入若干个数,每输入一个数用回车确认);System.out.println(最后输入一个非数字结束输入操作);Scanner reader=new Scanner(System.in);double sum=0;int m=0;while(reader.hasNextDouble() double x=reader.nextDouble(); m=m+1; sum=sum+x;System.out.printf(%d个数的和为%fn,m,sum);S
14、ystem.out.printf(%d个数的平均值是%fn,m,sum/m);8/18/2022226.2.3 过滤流过滤流FilterInputStream和FilterOutputStream分别是InputStream和OutputStream的子类,而且它们也都是抽象类。FilterInputStream类和FilterOutputStream类都重写了超类InputStream和OutputStream的方法。FilterInputStream和FilterOutputStream为读写处理数据的过滤流定义接口。其子类则进一步实现接口和方法。这些子类有以下几种。DataInputSt
15、ream类和DataOutputStream类BufferedInputStream和BufferedOutputStream类LineNumberInputStream类PushbackInputStream类8/18/2022236.2.4 文件随机读写RandomAccessFile类具有DataInputStream和DataOutputStream对象的所有功能。当程序把一个RandomAccessFile对象与一个文件关联时,程序从文件定位指针指定的位置开始读写数据,并且把所有数据当成基本数据类型来操作。使用RandomAccessFile除了可以读写文件中任意位置的字节外,还可以
16、读写文本和Java的基本数据类型。8/18/202224随机访问文件方式可以在指定位置读/写字节内容RandomAccessFile 实例对象同时具有类DataInputStream和类DataOutputStream的功能类RandomAccessFile实现了接口DataInput和DataOutput类DataInputStream实现了接口DataInput类DataOutputStream实现了接口DataOutput8/18/202225java.lang.Object | +-java.io.RandomAccessFilepublic class RandomAccessFil
17、eextends Objectimplements DataOutput, DataInput;8/18/202226当RandomAccessFile的实例对象与某个文件相关联在指定位置读取或写出数据,位置指定方法如下:void seek(long pos)基本数据类型数据具有固定字节数(如: double 8字节等等)这是Java基本数据类型数据的基本特点8/18/202227当RandomAccessFile提供的构造方法 RandomAccess fname,String mode); RandomAccess fe,String mode); 其中fname是文件名参数; mode是
18、文件访问模式,有“r”和“rw”。8/18/202228当RandomAccessFile提供的主要读方法void seek(long pos)char readChar()long get()short readShort()int skipBytes(int n)int readInt()long length()long readLong()int read()float readFloat()boolean readBoolean()doubl readDouble()byte readByte()String readLine()8/18/202229当RandomAccessFil
19、e提供的主要写方法8/18/202230示例:随机访问文件 / J_RandomAccessimport java.io.IOException;import java.io.RandomAccessFile;public class J_RandomAccessFile public static void main(String args ) try RandomAccess RandomAccessFile(test.txt, rw); double d; for (int i=0; i10; i+) f.writeDouble(0.5*i); f.seek(16); f.writeDo
20、uble(0); f.seek(0); for (int i=0; i 10; i+) d=f.readDouble( ); System.out.println( + i + : + d); / for循环结束 f.close( ); catch (IOException e) System.err.println(发生异常: + e); e.printStackTrace( ); / try-catch结构结束 / 方法main结束 / 类J_RandomAccessFile结束8/18/2022316.2.5 流的分割流的分割是由StreamTokenizer类实现的。该类把一个流的内容
21、划分成若干个token单位,一次可以读写一个token。token是文本分析算法可识别的最小单位(如单词、符号等)。一个StreamTokenizer对象可用于分析任何文本文件。它可以识别标识符、数字、引号包围的字符串以及各种注释形式。尽管StreamTokenizer并不是从InputStream或OutputStream衍生的,但它只随同InputStream工作,所以十分恰当地包括在库的IO部分。StreamTokenizer类用于将任何InputStream分割为一系列“记号(Token)”。这些记号实际是一些断开的文本块,中间用我们选择的任何东西分隔。例如,记号可以是单词,中间用空白
22、(空格)以及标点符号分隔。8/18/202232Reader和Writer处理文本数据可以采用类java.io.Reader 和 java.io.Writer类java.io.Reader 和java.io.Writer 是抽象(abstract )类是基于文本的其它读写器的父类(superclasses)输入/输出流字节流读写器是基于字符8/18/202233类java.io.Reader中的成员方法类似于类java.io.InputStream中的成员方法类java.io.Writer中的成员方法类似于类java.io.OutputStream中的成员方法8/18/202234public
23、 void write(int c) throws IOException写出双字节的单个字符(其值范围: 从0到65535)。其它write方法:public void write(char text) throws IOException public abstract void write(char text, int offset, int length) throws IOException public void write(String s) throws IOException public void write(String s, int offset, int length
24、) throws IOException8/18/202235带缓存的Reader可以提高读取数据性能类 java.io.BufferedReader 是类java.io.Reader的子类java.lang.Object | +-java.io.Reader | +-java.io.BufferedReader当读取数据量很大时,一个很好的方法是: 通过类BufferedReader,这时需要给Reader的子类(如: )“外包”上类BufferedReader示例: BufferedReader br = new BufferedReader(new (test);8/18/202236类
25、 java.io.LineNumberReader类 java.io.LineNumberReader是类java.io.BufferedReader的子类:带有行号信息java.lang.Object | +-java.io.Reader | +-java.io.BufferedReader | +-java.io.LineNumberReader类LineNumberReader中的部分方法public LineNumberReader(Reader in)public LineNumberReader(Reader in, int size)public void setLineNumb
26、er(int lineNumber)public int getLineNumber( )8/18/202237类 InputStreamReader类 java.io.InputStreamReader 起到了从输入流到Reader的桥梁作用示例: InputStreamReader isr = new inputStreamReader(System.in);8/18/202238类 OutputStreamWriter类 java.io.OutputStreamWriter起到了从输出流到Writer的桥梁作用示例:OutputStreamWriter osw = new OutputS
27、treamWriter(System.out);8/18/202239读取文件内容类 java.lang.Object | +-java.io.Reader | +-java.io.InputStreamReader | +-java.io.示例: fr = new (test);8/18/202240写文本文件类 java.io.java.lang.Object | +-java.io.Writer | +-java.io.OutputStreamWriter | +-java.io.示例: fw = new (“test);8/18/202241写文本文件类 java.io.java.la
28、ng.Object | +-java.io.Writer | +-java.io.OutputStreamWriter | +-java.io.示例: fw = new (“test);8/18/2022426.3 对象的序列化Java的对象序列化用于将一个实现了Serializable接口的对象转换成一组byte,这样以后要用这个对象时候,就能把这些byte数据恢复出来,并据此重新构建那个对象了。这一点甚至在跨网络的环境下也是如此,这就意味着序列化机制能自动补偿操作系统方面的差异。也就是说,可以在Windows机器上创建一个对象,序列化之后,再通过网络传到Unix机器上,然后在那里进行重建,
29、而不用担心在不同的平台上数据是怎样表示的,byte顺序怎样,或者别的什么细节。8/18/2022436.3.1 存储对象Java序列化技术可以将一个对象的状态写入一个byte流里,并且可以从其他地方把该byte流里的数据读出来,重新构造一个相同的对象。这种机制允许将对象通过网络进行传播,并可以随时把对象存储到数据库、文件等系统里。Java的序列化机制是RMI、EJB、JNNI等技术的技术基础。并非所有的Java类都可以序列化,为了使指定的类可以实现序列化,必须使该类实现接口java.io.Serializable。需要注意的是,该接口什么方法也没有。实现该类只是简单的标记类准备支持序列化功能。
30、8/18/2022446.3.2 对象的序列化Java1.1以后添加了对象序列化机制,可以把实现了Serializable接口的对象序列化。Serializable接口中没有定义任何方法,只是一个特殊的标记,用来告诉Java 编译器,这个对象参加了序列化的协议,可以把它序列化。因此一个类实现Serializable接口时,并不需要实现任何针对该接口的方法,8/18/2022456.3.3 对象序列化中的一些问题在对对象序列化的过程中需要注意以下两个问题。(1)性能问题为了序列化类A的一个实例对象,所需保存的全部信息如下。与此实例对象相关的全部类的元数据(metadata)信息;因为继承关系,类
31、A的实例对象也是其任一父类的对象。因而,需要将整个继承链上的每一个类的元数据信息,按照从父到子的顺序依次保存起来。(2)版本信息当用readObject()方法读取一个序列化对象的byte流信息时,会从中得到所有相关类的描述信息以及示例对象的状态数据;然后将此描述信息与其本地要构造的类的描述信息进行比较,如果相同则会创建一个新的实例并恢复其状态,否则会抛出异常。这就是序列化对象的版本检测。8/18/2022466.4 文 件 管 理前面的章节介绍了Java中的各种I/O流,在使用I/O流的过程中很多情况下源与目标都是文件。因此,本节将介绍在Java中如何获取目录、文件的信息以及对目录、文件进行
32、管理。8/18/2022476.4.1 File类简介Java中专门提供了一个表示目录与文件的类java.io.File,通过其可以获取文件、目录的信息,对文件、目录进行管理。File类一共提供了4个构造器,8/18/2022486.4.2 使用File类下面的例子创建MyFile文件夹,接着在MyFile文件夹下创建Child文件,并向文件中写入字符串。通过使用java.io包中提供的File类可以方便地对文件、目录进行管理。实际开发中如果有需要,可以参照本例进行开发。File类中的常用方法见P189的表 8/18/202249public class CreateFile public s
33、tatic void main(String args) try File(mydir);f1.mkdir();for(int i=0;i20;i+)BufferedInputStream bin=new BufferedInputStream(new (Create);BufferedOutputStream bout= new BufferedOutputStream(new (new ,Create);int n;while(n=bin.read()!=-1)bout.write(n);bin.close();bout.close();f1=new ,mydir);f1.mkdir();
34、catch(Exception e)e.printStackTrace();8/18/202250实训题目运行D盘下的Create文件删除D盘下mydir文件夹。8/18/202251参考代码:import java.io.*;public class DeleteFile void delete(File f)if(f.isDirectory()String ();for(int i=0;i)delete(new (),filesi);f.delete();public static void main(String args) Delete DeleteFile();app.delete(
35、new File(mydir);8/18/202252Java 异常处理(Exception)基础异常(Exception)?异常(Exception)是正常程序流程所不能处理或没有处理的异常情况或异常事件。在有些书中,异常也称作例外。8/18/202253格式在try语句块中包含可能会产生异常的语句紧接着若干个catch语句块,进行异常处理catch语句块与finally语句块至少存在一个try / 可能会抛出异常的代码catch (ExceptionType ref) / 异常处理代码finally / 8/18/202254为什么需要异常?强制程序异常/错误处理同时指定需要异常的种类异常
36、处理模型提供了一种统一处理异常/错误的模式传统程序方法: 设置标志位,或返回错误码,分别处理各种异常情况。但在编程时常常出现这样的情况:忘了对某些异常情况进行处理,尤其是当存在多个分支或者多个开发人员共同开发程序时。简化对异常情况的处理,减少if-else语句8/18/202255什么时候会发生异常?数组的下标越界打开不存在的文件网络无法连接操作数超出所要求的范围少了所需加载的类,自定义异常,要求程序处理8/18/202256处理异常的几种常用方法一旦捕获异常,马上进行处理重新抛出异常捕获异常,但并不处理通过语句System.exit()退出应用程序8/18/202257异常(Exceptio
37、ns)类型常见异常内存耗尽数组下标越界除数为0非法的参数(方法的参数)8/18/202258异常(Exception)的层次结构8/18/202259运行时发生的异常(RuntimeExceptions)异常随时都可以发生ArrayIndexOutOfBoundsExceptionNullPointerException定义了引用,但不指向任何对象(object)ClassCastException数据类型间的转换不合法良好的编程习惯,可以减少很多异常的发生8/18/202260受检异常和非受检异常受检异常必须在方法声明时通过throws列出在编译时就能被检测出非受检测异常不必在throws列
38、表中错误(Errors) 和运行时异常(RuntimeExceptions)受检异常,必须处理才能通过编译运行时异常只有在运行时才能被发现错误常常指的是致命性错误,常常也无法处理8/18/202261处理多种异常(Exception)类型如果含有多外catch语句块,则异常会被第一个与其相匹配的catch语句块处理8/18/202262finally 语句块在异常处理过程中,finally 语句块总是会被执行到: 无论有没有异常发生,也无论有没有异常被捕捉到可选项: finally 语句块,通常位于catch 语句块的后面可以用来释放try语句块中获得的资源例如,关闭在try语句块中打开的文件8/18/202263throws 列表在方法的声明处列出所有的受检异常返回类型 方法名( 参数列表 ) throws 异常类型1, 异常类型2, / 方法体在本方法内就可以不处理这些异常调用该方法的方法就必须处理这些异常示例:public static void g( ) throws Exception throw new Exception( ); / 方法g结束8/18/202264异常处理: 捕捉-或者-
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 大直径、高强度特种钢丝绳企业县域市场拓展与下沉战略研究报告
- 电气机械和器材企业县域市场拓展与下沉战略研究报告
- 制棍机械企业数字化转型与智慧升级战略研究报告
- 新能源汽车MEA企业数字化转型与智慧升级战略研究报告
- 中碱短切玻璃纤维企业ESG实践与创新战略研究报告
- 淬炼钢铁团队点燃热血征程-企业军事化拓展方案
- 混合性失语康复
- 产品市场占有率波动原因分析环境分析重点基础知识点
- 特殊儿童康复家庭指导
- 公共绿地建设材料管理与质量保证措施
- 《空间向量基本定理》示范课教学设计【高中数学人教】
- GB/T 25742.4-2022机器状态监测与诊断数据处理、通信与表示第4部分:表示
- GB/T 6417.1-2005金属熔化焊接头缺欠分类及说明
- GB/T 14823.2-1993电气安装用导管特殊要求-刚性绝缘材料平导管
- 北医安全法规考试题
- 2023年宜昌市中医医院医护人员招聘笔试题库及答案解析
- 内部控制建设课件
- 水塘排水、清淤质量检验记录表
- 加强施工管理、严格保护环境
- 抗拔桩裂缝计算表格(自动版)
- 血透室传染病登记本
评论
0/150
提交评论