字符流

字符流

字符流的抽象基类:

Reader,Writer

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

字符流写入数据---FileWriter

//读、写都会发生 IO 异常

public static void main(String[] args) throws IOException {

//【1】创建一个FileWriter的对象。该对象一初始化就必须要明确被操作的文件(其实就是明确数据要存放的目的地)

(如果指定位置,出现了同名文件,文件会被覆盖)

            FileWriter fw=new FileWriter("new.txt");

//【2】调用write的方法,将字符串写入流中

//(将数据变成流,方法就是管道,字符流通过管道输入指定文件)

            fw.write("asdsfg");

//【3】flush()刷新缓冲区,将缓冲区中的数据刷到目的地文件中

//flush()就是将管道的字符流流全都推向目的地,只有刷新流的对象,目标文件才有数据

//在没有close()关闭流之前,流的对象还存在,可以继续追加write()写入

            fw.flush();

    //【4】close()关闭流,其实关闭的就是 java 调用的系统底层资源。在关闭前,会先刷新该流。

fw.close();

}

    close()和 flush()的区别:

flush():将缓冲区的数据刷到目的地中后,流可以使用。

close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源。注意,java在调用系统的资源来完成数据的建立,所以一定要释放资源

IO异常的基本处理方式

public static void main(String[] args) {

    //【1】如果在try内创建FileWriter的对象,那么finally无法使用该对象

    //【2】在外边创建引用,在try内初始化

        FileWriter fw=null;

        try {

            fw=new FileWriter("new.txt");

            fw.write("asdsfg");

        } catch (IOException e) {

            e.printStackTrace();

        }

        finally{

            //使用finally关闭资源

            try {

//【3】如果FileWriter的对象创建失败,会无法使用该对象关闭流,导致异常

                if(fw!=null){

                    fw.close();

                }

            } catch (IOException e) {

                e.printStackTrace();

            }

        }

    }  

    字符流读取数据---FileReader

第一种方式:read()单个字符单个字符读取(很麻烦)

//【1】创建一个文件读取流对象,和指定名称的文件相关联

//【2】要保证文件是已经存在,如果不存在,会发生异常FileNotFoundException

        FileReader fr=new FileReader("new.txt");

    //【3】调用读取流对象的read方法

    //read()一次读取一个字符,而且指定往下读

        int ch=0;

        //【4】读取完数据,java就会返回-1

        while((ch=fr.read())!=-1){

        System.out.print((char)ch);//asdsfg

        //读取的是 int类型97、115、100、115、102、103

        //System.out.print(ch);

        }  

    //【5】关闭流

            fr.close();

read读取方式

字符流

第二种方式:(推荐)

read(char[])以数组存储数据返回存储字符的长度,

再通过String(char[],0,数组元素实际长度)将数组转换为字符串:

 

//【1】创建一个文件读取流对象,和指定名称的文件相关联

//要保证文件是已经存在,如果不存在,会发生异常FileNotFoundException

        FileReader fr=new FileReader("new.txt");

        //【2】定义一个字符数组。用于存储读到字符

        //【3】该read(char[])返回的是读到字符个数

        char[] buf=new char[1024];

//【4】初始化实际数组字符长度

        int num=0;

        //【5】读取完数据,java就会返回-1

        while((num=fr.read(buf))!=-1){

            /【6】/通过String()截取实际数组字符长度,读取数据

            System.out.print(new String(buf,0,num));

        }  

//【7】刷新数据同时关闭流  

            fr.close();

复制文本文件

  1. 在D盘创建一个文件,用于存储C盘中的数据
  2. 定义读取流和C盘文件的关联
  3. 通过不断的读取完成数据存储
  4. 关闭资源

 public static void copy(){

       FileWriter fw=null;

       FileReader fr=null;

       try {

          //【1】创建目的地(写入目标文件)

fw=new FileWriter("C:/Users/Administrator/Desktop/newcopy111.txt");

        //【2】与已有文件关联(读取目标源文件)

        fr=new FileReader("C:/Users/Administrator/Desktop/zzz.txt");

        //【3】定义字符数组接收独处的字符

        char[] buf=new char[1024];

        //【4】初始化实际字符数组的长度

        int count=0;

        while((count=fr.read(buf))!=-1){

            //【5】每次读取实际字符数组内的字符

            fw.write(buf, 0, count);

        }

    } catch (IOException e) {

//一般读取文件失败,应该停止程序

        throw new RuntimeException("读取失败!!!");

    }

       finally{

           if(fr!=null){

         try { fr.close();}

catch (IOException e) {e.getMessage();}

           }

         if(fw!=null){

         try { fw.close();}

catch (IOException e) {e.getMessage();}

              }

          }

   }