黑马程序员—java—IO流

来源:互联网 发布:带租约商铺 知乎 编辑:程序博客网 时间:2024/05/01 17:04

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

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

流按操作数据分为两种字节流字符流

流按流向分为输入流输出流

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


字节流的抽象基类InputStream,OutputStream;

字符流的抽象基类Reader,Writer;

由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。


Writer子类创建文件写入内容的步骤(3步都得出来异常):

1、创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖;如FileWriter fw=new FileWriter(“demo.txt”);如果需要在此文件中续写,传递一个true参数(如:(“demo.txt”,true),代表不覆盖已有文件,并在已有文件的末尾处进行数据续写;

2、调用write方法,将字符串写入到流中;如fw.write(“abcda”);

3、刷新流对象中的缓冲区的数据,将数据刷到目的地中,如:fw.flush();fw.close。

如果是读取数据依然可以参照上面的3个步骤,只要创建相应的对象(FileReader)及调用相应的方法(read)就可以了.

以下举个例子:文件的复制及异常处理

import java.io.*;class FileReaderDemo{public static void main(String[] args){FileReader fr=null;FileWriter fw=null;try{fr=new FileReader("FileWriterDemo.java");//创建一个文件读取对象fw=new FileWriter("demo.txt");//创建一个文件写入对象char[] ch=new char[1024];//创建一个数组,用于存储读取的数据int num=0;while((num=fr.read(ch))!=-1){fw.write(ch,0,num);//将数组写入文本中}}catch (IOException e)//IO异常处理{System.out.println(e.toString());}finally{if(fr!=null)try{fr.close();//关闭资源}catch (IOException e){System.out.println(e.toString());}        if(fw!=null)try{fw.close();}catch (IOException e){System.out.println(e.toString());}}}}


缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前,必须要先有流对象,有BufferedReader和BufferedWriter;BufferReader缓冲类中值得注意的一个方法readLine(),一行一行的读取,但需注意此方法返回的是字符串,不包括行截止符,所以在调用时需加行截止符;BufferedWriter缓冲类中值得注意的一个方法是newLine(),写入一个行分隔符,只有在这个类中有这个方法,能实现跨平台换行。


以下举个例子:用缓冲区对文件进行复制

import java.io.*;class  FileBufferReader{public static void main(String[] args) {BufferedReader bufr=null;BufferedWriter bufw=null;try{bufr=new BufferedReader(new FileReader("FileDemo.java"));//创建一个读取缓冲区bufw=new BufferedWriter(new FileWriter("Demo.txt"));//创建一个写入缓冲区String line=null;//定义一个字符串中转站while((line=bufr.readLine())!=null)//循环读写实现拷贝数据{bufw.write(line);bufw.newLine();//插入换行符bufw.flush();}}catch (IOException e ){throw new RuntimeException("读写失败");}finally{try{if(bufr!=null)bufr.close();//关闭资源}catch (IOException e){throw new RuntimeException("读取关闭失败");}try{if(bufw!=null)bufw.close();}catch (IOException e){throw new RuntimeException("写入关闭失败");}}}}


装饰设计模式:当想要对已有的对象进行功能增强时,可以定义一个类,将已有对象传入,基于已有对象的功能,并提供加强功能,那这个自定义的类就称为装饰类。
装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。
装饰模式比继承要灵活,避免了继承体系臃肿,而且降低了类与类之间的关系;装饰类因为增加已有对象,具备的功能和已有的是相同的,只不过提供了更强功能,所以装饰类和被装饰类通常是都属于一个体系中。


流操作的基本规律:通过三个明确来完成
     1、明确源和目的;源:输入流,InputStream    Reader;目的:输出流,OutputStream   Writer。
     2、操作的数据是否是纯文本;是:字符流;不是:字节流。
     3、当体系明确后,在明确要使用哪个具体的对象,通过设备进行区分;源设备:内存,硬盘,键盘;目的设备:内存,硬盘,控制台。

递归要注意
   1、限定条件;

   2、要注意递归的次数,尽量避免内存溢出。
         打印流:该流提供了打印方法,可以将各种数据类型的数据都原样打印。
         

字节打印流:PrintStream
构造函数可以接收的参数类型

         1、file对象,File;

         2、字符串路径,String;

         3、字节输出流OutputStream。


字符打印流:PrintWriter
构造函数可以接收的参数类型:

         1、file对象,File;

         2、字符串路径,String;

         3、字节输出流OutputStream;

         4、字符输出流。





原创粉丝点击