API-文件数据IO操作、异常

一.文件数据IO操作

1.Stream:

节点流:功能简单,只能进行byte读写

FIS  FOS

扩展流=高级流=过滤流=过滤器:

功能复杂,封装算法:在基本的byte流基础上扩展了复杂类型

读写:缓冲区,对象,字符串

2.高级扩展流使用更加便捷!扩展流依赖节点流!

加密文件->节点流->解密流->对象流

3.文本文件保存编码,和文本文件读取的编码不一致时,因为windows默认的是默认的GBK,所以有些文件是乱码的。

4.BufferedReader缓冲字符输入流:其内部提供了缓冲区,可以提高读取效率。

代码练习

 1 public class ReaderDemo01 {
 2     public static void main(String[] args) throws IOException {
 3         String file="demo.txt";
 4          /*
 5          * BufferedReader 也是扩展流,依赖最底层的节点流。 
 6          */
 7         //缓冲字符输入流Reader,不是Writer
 8         BufferedReader out=
 9         new BufferedReader(
10         //理解,记忆不深,是InputStreamReader,不是InputStreamWriter
11         new InputStreamReader(
12         new BufferedInputStream(
13         new FileInputStream(file)),"utf-8"));
14         String str;
15          /*
16          * readLine() 可以从文件中读取一行文本(到
17          * 回车字符为止),返回文本中不包含回车字符,
18          * 如果读取到文件的末尾,返回null 
19          * 如下代码可以从文件中读取所以的行
20          */
21         while((str=out.readLine())!=null){
22             System.out.print(str);
23         }
24         out.close();
25     }
26 }

5. PrintWriter是具有自动行刷新的缓冲该字符输出流。

 1 import java.io.BufferedOutputStream;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileOutputStream;
 4 import java.io.OutputStream;
 5 import java.io.OutputStreamWriter;
 6 import java.io.PrintWriter;
 7 import java.io.UnsupportedEncodingException;
 8 public class WriterDemo {
 9     public static void main(String[] args) throws UnsupportedEncodingException, FileNotFoundException {
10 /*
11          * 创建 PrintWriter 使用可以提供自动缓冲
12          * 刷出功能参数,true的时候开启自动缓冲刷出。
13          * 这个时候,调用 println, 方法会自动执行flush方法。
14          * 这个自动刷出功能在网络通信软件中很有用途
15          * 
16          * 如果要测试自动刷出功能,可以将out.close()
17          * 去掉测试!实际工作中必须关闭文件!
18          */
19         PrintWriter out=
20                 new PrintWriter(
21                         new OutputStreamWriter(
22                                 new BufferedOutputStream(
23                                         new FileOutputStream("demo01.txt")),"utf-8"),true);
24 //        PrintWriter out = 
25 //            new PrintWriter(file, "utf-8"); 
26         
27         /*
28          * PrintWriter 提供了非常便于输出文本的方法 println print。
29          * println方法可以向文件中输出一行文本,输出以后会自动
30          * 插入回车字符,作为一行的结束。
31          */
32         out.println("老师,您今天辛苦了");
33         out.println("您今天上午一定要过来");
34         out.write("要不我白来实验室刷存在感了");
35         out.close();
36     }
37 }

二、异常

1. Java异常结构中定义有Throwable类。Exceotion和Error是其派生的两个子类。

(1)Exception(程序可处理异常)表示由于网络故障、件损坏、设备错误、用户输入非法等情况导致的异常,这类异常是可以通过Java异常捕获机制处理的。

包括:

      1) IOException异常:其中IOException包括FileNotFoundException异常

      2)ParseException

      3)RuntimeException(非检查异常):编译器不检查这类异常。一个方法抛出非检查异常,调用时候编译器忽略是否处理异常检查!抛出非检查异常时候不用声明。

该类异常包括:NullPointerException,NumberFormatException,ArrayIndexOutOfBoundsException

(2)Error(不可恢复错误,无法处理)表示Java运行时环境出现的错误,例如:JVM内存溢出等。

      该类异常包括:OutOfMemoryError,StackOverflowError

2.异常处理try-catch

   try {...} 语句指定了一段代码,该段代码就是一次捕获并处理例外的范围。在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句分别对这些异常做相应的处理。如果没有列外产生,所有的catch代码段都被略过不执行

4.多个catch

  每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常 。catch捕获的异常类型由上至下的捕获异常类型的顺序应是子类到父类的。

  通常在书写代码的时候,我们应当在最后一个catch中捕获Exception,这样可以保证代码不会因为出现一个未在catch中声明的异常而导致捕获失败使得程序终止。

5. finally语句为异常处理提供一个统一的出口,无论try所指定的程序块中是否抛出例外,finally所指定的代码都要被执行,通常在finally语句中可以进行资源的消除工作,如关闭打开的文件、删除临时文件等。

finally语句块只能定义在try语句块之后,或者最后一个catch语句块之后,且只能定义一次。

6.throw和throws关键字

throw关键字:在某些时刻,您可能会想要自行抛出异常,例如在异常处理结束后,再将异常抛出,让下一层异常处理区块来捕捉,若想要自行抛出异常,可以使用“throw”关键词,并生成指定的异常对象。

throws关键字:程序中会声明许多方法(Method),这些方法中可能会因某些错误而引发异常,不希望直接在这个方法中处理这些异常,而希望调用这个它的方法来统一处理,这时候可以使用“throws”关键词来声明这个方法将会抛出异常

重写方法时的throws

当使用继承时,在父类的某个方法上声明了throws抛出某些异常,而在子类中重写该方法时,可以做以下的操作:

(1)不处理异常(重写方法时不声明throws)

(2)可仅在throws中声明父类中声明的部分异常

(3)可在throws中声明父类方法中抛出的异常的子类异常

但是不能做以下操作:

(1)重写方法时在throws中声明抛出额外的异常

(2)重写方法时在throws中声明父类方法中声明的抛出异常的父类异常

7.Throwable中定义了一个方法可以输出错误信息,用来跟踪异常事件发生时执行堆栈的内容。该方法定义为:

    void printStackTrace()

  Throwable中定义了一个方法可以得到有关异常事件的信息。该方法定义为:

   String getMessage()

8.自定义异常

Java异常机制可以保证程序更安全和更健壮。虽然Java类库已经提供很多可以直接处理异常的类,但是有时候为了更加精准地捕获和处理异常以呈现更好的用户体验,需要开发者自定义异常。

public class [自定义异常类名] extends Exception{...}

当定义好自定义异常后,我们可以通过Eclipse来自动生成相应的构造方法。具体步骤如下:

(1)声明一个类并继承自Exception

(2)右键点击Source

(3)选择Generate Constructors from Superclass

(4)选中父类中所有构造方法后确认生成

9.异常实例说明

(1)Error-OutOfMemoryError异常

 1 import java.util.ArrayList;
 2 import java.util.List;
 3 public class EXPDemo03 {
 4     public static void main(String[] args) {
 5         /*
 6          * OutOfMemoryError 是堆内存耗尽没有空间分配对象了!
 7          * 有个术语: 内存泄露
 8          * 原因:大量分配对象,而没有回收对象造成内存泄露!
 9          * 解决办法:及时回收对象,扩内存!
10          * 出现以后Java系统立即崩溃! 
11          */
12          //要复习集合了,又忘记知识点了
13         List<Koo> list=new ArrayList<Koo>();
14         for(int i=0; i<10000000; i++){
15             Koo k = new Koo();
16             //list.add(k);
17             k = null;
18         }
19         System.out.println("OK"); 
20     }
21 }
22 class Koo{
23     int n=8;
24     double d = 9;
25 }

(2)Error-StackOverflowError异常

 1 public class EXPDemo04 {
 2     public static void main(String[] args) {
 3         /*
 4          * 由于反复递归调用test方法照成 栈内存不够
 5          * 分配 出现了 StackOverflowError
 6          */
 7         test();
 8     }
 9         /*
10          *错误:编写方法是没有加static,因为main方法是static方法,
11          *不能调用非静态的,所以test方法必须加static
12          */
13     public static void test(){
14         int a = 4;
15         int b = 5;
16         test();
17     }
18 }

(3)Exception--ParseException异常(编译器检查语法)

 1 import java.text.ParseException;
 2 import java.text.SimpleDateFormat;
 3 import java.util.Date;
 4 
 5 public class EXPDemo05 {
 6 
 7     public static void main(String[] args) {
 8         String str="2015-03-24";
 9         //日期这部分掌握的也不是很好啊。SimpleDateFormat都写错了,---真的欠练
10         /* 
11          * 字符串转换为日期对象
12          */
13         SimpleDateFormat format=
14                 new SimpleDateFormat("yyyy-MM-dd");
15         str="甲午年仲秋";
16         /*
17          * parse 方法上声明了异常抛出,
18          * Java 编译器检查:调用有异常,就必须处理 异常,否则有编译错误.
19          * 好处:parse 出现错误的机会很高!
20          *  可以强行要求程序员,必须对可能出现的 错误加以干预,减少运行期间对用户的影响!
21          *  str = "甲子年仲秋";
22          * 如:采用策略,如果str错误的,就采用当前时间
23          */
24         Date d;
25         try{
26             d=format.parse(str);
27             System.out.println("成功解析时间");
28         }catch(ParseException e){
29             System.out.println("解析时间失败");
30             d=new Date();
31         }
32         System.out.println(d);
33     }
34 }

(4)Exception-RuntimeException(非检查异常)-NumberFormatException

 1 public class EXPDemo02 {
 2     public static void main(String[] args) {
 3         String str = "A66";
 4         /*
 5          * parseInt 当参数不能转换为数字时候会出现意外结果:NumberFormatException
 6          * parseInt 如果参数能够转换为int数字。     
 7          * 如果出现意外结果,方法抛出一个异常对象,
 8          * 阻止软件继续运行,直到被try catch捕获为止
 9          */
10         /*
11          * 使用try 将可能出故障(异常)的代码库包裹起来,利用catch抓取可能出现的异常。
12          * catch参数是抓取异常类型名
13          * 执行流程:
14          * 如果try中的代码没有执行故障(异常)就
15          * 将try中的代码块执行,并不执行catch中的代码。
16          * 如果有异常故障,就跳到catch中执行代码
17          * 
18          * 如果不处理异常,Java的当前线程会被终止执行!
19          * 程序被异常"卡"掉了结束了。"闪退"
20          * 
21          * 程序中应用处理异常!
22          */
23         
24         try{//异常处理语句块
25             int n = Integer.parseInt(str);
26             System.out.println(n);
27         }catch(NumberFormatException e){
28             System.out.println("解释失败!");
29         }
30         System.out.println("OK");
31     }
32 }

 (5)finally实例说明

 1 public class ExpDemo08 {
 2     public static void main(String[] args) {
 3         try{
 4             String s = "A";              //1 //1
 5             int a = Integer.parseInt(s); //2 //2
 6             System.out.println(a);       //3   
 7         }catch(NumberFormatException e){ 
 8             System.out.println("异常");        //3
 9         }finally{
10             //finally 无论是否有异常,都会执行!
11             System.out.println(
12                     "我还会回来的!");       //4 //4
13         }
14         System.out.println("end");        //5 //5
15     }
16 }

(6)多个catch实例说明

 1 package day10;
 2 public class EXPDemo10 {
 3 
 4     public static void main(String[] args) {
 5         int n = test("");
 6         System.out.println(n);//5
 7     }
 8     public static int test(String str){
 9         try{
10             char c = str.charAt(0);
11             return c - '0'; // '0'=48  '5'=53
12         }catch(NullPointerException e){
13             e.printStackTrace();
14             return -1;
15         }catch(StringIndexOutOfBoundsException e){
16             e.printStackTrace();
17             System.out.println("-2");
18             return -2;
19         }finally{
20             System.out.println("-10");
21             return -10;
22         }
23         //return -5; 不可执行的代码
24     }
25 }

(7)throw和throws关键字

 1 import java.io.IOException;
 2 import java.io.PrintWriter;
 3 public class EXPDemo09 {
 4     public static void main(String[] args) {
 5         
 6     }
 7     
 8     public static void save(String file, 
 9             String msg) 
10             throws IOException{
11         /*
12          * 处理不了抛出去 
13          */
14         PrintWriter out = null;
15         try{
16             out=new PrintWriter(file);
17             /**
18              * 如果println 有异常,这个时候
19              * 不会执行close(), 文件没有可靠关闭
20              */
21             out.println(msg);
22         }catch(IOException e){
               //此处抛出,方法定义上必须也抛出
23 throw e; 24 }finally{ 25 //利用finally可靠关闭文件! 26 if(out!=null){ 27 out.close(); 28 } 29 } 30 } 31 }

 

posted @ 2015-12-07 13:53  等一等再放弃  阅读(457)  评论(0)    收藏  举报