毕向东老师Java视频笔记-IO流 FileReader类FileWriter类以及文件复制

一. 概论

  • 字符流和字节流
  • 字节流两个基类:

    1. InputStream类
    2. OutStream类
  • 字符流

    1. Reader类
    2. Writer类

1. Writer类(character stream)

Witer类的方法基本上都要子类去实现,因为子类规定了特定的功能,或者提高了效率;

a. 例如,常见的FileWriter类

import java.io.*;
public class FileWriterDemo {
    public static void main(String[] args) throws IOException{
        //创建一个FileWriter对象,该对象初始化时就必须明确被操作的文件
        //而且该文件会被创建到指定的目录下,默认是和project文件在同一个目录下;如果该目录下已有同名文件,将被覆盖;
        //其实该步就是在确定数据要存放的目的地;
        FileWriter fw = new FileWriter("demo.txt");
        //将字符串数据存入到流对象中;
        fw.write("hello");
        //刷新流对象中的缓冲,将数据刷到目的地中;
        fw.flush();
        //关闭流资源,关闭之前会刷新一次内部的缓冲,将数据刷到目的地中,和flush()的区别在于,
        //flush()刷新后,流可以继续使用,而close()后流不能使用。
        fw.close();
    }

}

三步走:

  • 创建对象,明确(拿到)被操作的文件;new
  • 将字符串写入流;write
  • 将流中缓冲数据刷新到目的地,或者关闭流;flush

这些方法都会抛出异常,那么如何处理io异常?

/* * 如何处理FileWriter类中的异常 * 注意保证代码的健壮性! * */

package com.cityu.io;

import java.io.*;

public class FileWriterException {
    public static void main(String[] args) {
        FileWriter fw = null;//因为finally代码块必须执行,因此在try-catch块外定义引用变量;
        try {
            fw = new FileWriter("D:\\Demo1.txt");
            fw.write("hello");
        } catch (IOException e) {
            e.printStackTrace();
        }
        finally{//finally中放置的是必须要执行的代码,通常是关闭资源
            try {
                if(fw!=null)//如果不写这句,会抛出NullPointException异常;
                    fw.close();//close方法本身也会抛出异常;
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

b. 文件的续写(修改文件)

package com.cityu.io;
import java.io.*;

public class FileWriterTrue {
    public static void main(String[] args) {
        FileWriter fw = null;
        try {
            fw = new FileWriter("D:\\demo1.txt", true);
            fw.write("\r\nworld!");//windows下有的软件换行是\r\n;Linux下均为\n
        } catch (IOException e) {
            e.printStackTrace();
        } finally{
            try {
                if(fw!=null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

2. Reader类

package com.cityu.io;

import java.io.*;

public class ReaderDemo {
    public static void main(String[] args) throws IOException {
        FileReader fr = new FileReader("D:\\java\\HashMapEx.java"); 
        int num = 0;
        char[] buf = new char[1024];
        while((num = fr.read(buf))!=-1){
            System.out.print(new String(buf,0,num));
        }
    }

}

3. 文件的复制(读写)

需求:复制一个文本文件:
1. 创建输入输出流,读一个字符,存入一个字符;
2. 创建输入输出流,从输入流中读出所有的字符,存入一个数组,将数组存入输出流中,刷新输出流,将其中的字符写入文件;

package com.cityu.io;

import java.io.*;

import com.cityu.reflect.Demo;
public class CopyDemo {
    public static void main(String[] args) throws IOException{
        copy_1();
        copy_2();
    }
    public static void copy_1() throws IOException{
        FileReader fr = new FileReader("D:\\Demo.txt");//创建Reader
        FileWriter fw = new FileWriter("D:\\Demo_Copy.java");//创建Writer:目标文件
        int ch = 0;
        while((ch=fr.read())!=-1){//从fr中一个字符一个字符读取,返回字符的整型值,如果到达文件末尾,将返回-1;
            fw.write(ch);//写入单个字符;
        }
        fr.close();//关闭输入流;
        fw.close();//关闭输出流;
    }
    public static void copy_2(){
        FileReader fr = null;
        FileWriter fw = null;
        //对于try-catch-finally的处理:不仅要确保正常运行的情况(没有异常);
        //更需要考虑的是如果try中的语句不执行,那么finally里的语句该如何修改!
        try{
            fr = new FileReader("D:\\Demo.txt");
            fw = new FileWriter("D:\\Demo_copy2.java");
            char[] buf = new char[1024];//定义一个中间的字符数组来存放;
            int len = 0;
            while((len = fr.read(buf))!=-1){//记住len = fr.read(buf)的含义:将fr流中read出的字符存入buf数组中(一次性读入,如果返回-1,那么在返回-1之前其中记录的就是输入的字符长度),返回读入的字符数,如果读到结尾,返回-1 
                fw.write(buf,0,len);
            }
        }catch(IOException e){
            e.printStackTrace();
        }finally{
            try {
                if (fr!=null)
                    fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fw!=null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

你可能感兴趣的:(java,字符流)