黑马程序员07 IO流

来源:互联网 发布:2016淘宝有前景的类目 编辑:程序博客网 时间:2024/04/30 19:50

------- android培训、java培训、期待与您交流! ----------

IO流用来处理设备之间的数据传输

java对数据的操作是通过流的方式,JAVA用于操作流的对象都在IO包中,
流栈操作数据分为两种:字节流和字符流
按流向分为 输入流输出流。
字节流的抽象基类:
inputstream  和 OutputStream;
字符流的抽象基类:

Reader 和 Writer

一、异常概述

异常——概述 

异常:程序在运行过程中发生由于硬件设备问题、软件设计错误等导致的程序异常事件。

Java等面向对象的编程语言中,异常本身是一个类,产生异常就是产生了一个异常对象。

异常体系图


Java默认处理方式:JVM有一个默认的异常处理机制,即将该异常的名称、异常的信息、异常出现的位置打印在了控制台上,同时将程序停止运行。
标准打印流与错误打印流不同步。
异常相关操作:
创建异常对象(JDK已定义的异常会自动创建对象,自定义异常需要手动创建)
抛出异常(JDK已有定义的异常会自动抛出异常,自定义异常需要手动抛出)
处理异常
程序员在有异常抛出时,异常的处理方法有两种:
将异常捕获并处理
声明抛出异常

多异常捕获处理:
分别捕获分别处理,每个try对应一个catch
分别捕获分别处理,一个try对应所有catch
注意:大的异常不能在前边捕获
一次捕获共同处理
注意:不能同时捕获大的异常与小的异常


异常常见方法
重写了toString方法
public String getMessage()
public void printStackTrace()
public void printStackTrace(PrintStream s)


声明抛出异常与抛出异常
throws:用于声明函数抛出异常。用于函数声明。
是异常对象的处理方式之一。
多个异常可以同时声明抛出,用逗号分隔。
throw:用于抛出异常对象。用于函数内容。
当出现JDK异常对象时,JVM会自动创建一个异常对象并抛出。
自定义异常对象可以先创建异常对象,再使用throw抛出。抛出后再进行处理:或使用捕获或使用声明抛出。
自定义异常
如果涉及其他需求,JDK没有提供相应的异常对象,则可以自己定义异常。
定义格式:继承Exception或者RuntimeException。同时需要带参的构造方法,用于接收异常信息。
class MyException{
public MyException(String message){
super(message);
}
}

异常处理注意细节
运行时异常被抛出可以不处理。即不捕获也不声明抛出。
如果父类抛出了多个异常,子类覆盖父类方法时,只能抛出相同的异常或者是他的子集。
父类方法没有抛出异常,子类覆盖父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。
函数中已经出现返回语句返回值A,再在finally中修改A值,则最终的返回值仍为修改前A的值。但在该方法中A的值已经被修改了。
finally语句只有在退出虚拟机的情况下不会被执行。
注意不要超出异常捕获处理时的变量作用域。


二、字符流
字符流的特点:


数据最常见的体现形式是:文件


需求:在硬盘上,创建一个文件,并写入一些文字数据。


用于操作操作文件的Writer的子类FileWriter,后缀名是父类名。前缀名是该流对象的功能。
操作步骤:
1.创建一个FileWriter对象。该对象一被初始化就必须明确要被操作的文件,该文件会被创建到指定目录下,如果该目录下已经有同名文件,将被覆盖
FileWriter fw=new FileWriter("demo.txt");
2.调用write方法,将字符串写入到流中。
fw.write();
3.刷新流对象中的缓冲中的数据,将数据刷到目的地
fw.flush();
4.关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。和flush的区别,flush刷新后,流可以继续使用,close刷新后
将会将流关闭。
fw.close();

IO异常的处理方式:


FileWriter fw=null;try {fw=new FileWriter("demo.txt");fw.write("sdfasd");} catch (IOException e) {e.printStackTrace();}finally{try {if(fw!=null)fw.close();} catch (IOException e) {e.printStackTrace();}}}




文件的续写:
传递一个true参数,代表不覆盖已有文件,并在已知文件的末尾处进行数据续写。
FileWriter fw=new FileWriter("demo.txt",true);
换行转义字符:\r\n


文件的读取方式一:
FileReader();
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");
2.调用读取流的对象的read方法
    (1)int ch=fr.read();一次读一个字符,会自动往下读。
    (2)读出所有字符 
   
  while((ch=fr.read())!=-1)    {        System.out.println((char)ch);     }



3.关闭流资源,
fr.close();


文件的读取方式2:通过字符数组进行读取
1.创建一个FileReader对象。文件读取流对象,和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在会发生异常
FileReader fr=new FileReader("demo.txt");
2.定一个字符数组,用于存储读到字符,该rrad(char[])返回的是读到的字符个数。
char[] buf=new char[1024];一般定义1024-2个字节。
   
 int num=0;     while((num=fr.read(buf))!=-1)    {        System.out.println((new String(buf,0,num));     }




三、字符流的缓冲区
缓冲区的出现提高了对数据的读写效率
对应类:
BUfferWriter
BufferedReader
特点:缓冲区要结合流才可以使用,在创建缓冲区之前,必须要有流对象。在流的基础上对流的功能进行了增强。
BUfferWriter步骤:
1.创建一个字符写入流对象
FileWriter fw=new FileWriter("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
bufferedWriter bufw=new BufferedWriter(fw);
buff.write("asdasdas");
bufw.newLine();//换行符,跨平台的
3.将缓冲区刷新
bufw.flush;
4.关闭缓冲区,就是在关闭缓冲区中的流对象
bufw.close();

BufferedReader步骤
1.创建一个字符写入流对象
FileReader fr=new FileReader ("a.txt");
2.将需要被提高效率的流对象作为参数传递给缓冲区的构造函数
BufferedReader bufr=new BufferedReader (fr);
3.读取流对象:该缓冲区提供了一个一次读取一行的方法。当返回null时表示,文件读到末尾
String line=null;
while((line=bufr.readLine())!=null)
{
String s=line;}
4.关闭
bufr.close();


readLine()方法的原理:
无论是读一行,获取多个字符,最终都是在硬盘上一个一个读取,最终使用额还是read方法一次读一个的方法。


四、装饰设计模式
当想要对已有的独享进行功能增强时,可以定义类,将已有的对象传入,基于已经有的功能,
并提供加强功能,那么自定义的该类称为装饰类
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。


代码演示:
已知类:

Person(){  public void chifan()   {    }}增强类:superPerson(){   private Person p;   superPerson(Person p)   {     this.p=p;    }       public void superchifan()    {      p.chifan();      .........    {}自定义装饰类package com.io;import java.io.*;public class MyBufferedReader  {private Reader r;    public MyBufferedReader(Reader r) {super();this.r = r;}//可以一次读取一行的方法public String myReadLine() throws IOException{//定义一个临时容器。StringBulider容器,应用于存储字符数组StringBuilder sb=new StringBuilder();int ch=0;while((ch=r.read())!=-1){if(ch=='\r')continue;if(ch=='\n')return sb.toString();elsesb.append((char)ch);}if(sb.length()!=0)return sb.toString();return null;}//复写reader中的抽象方法//复写close方法public  void  close() throws IOException{r.close();}//复写read方法public int read (char[] c,int off,int len) throws IOException{return r.read(c, off, len);}}











0 0
原创粉丝点击