IO流(四)FileReader、FileWriter

一、FileReader

1.1FileReader读入数据的基本操作

1.1.1实现步骤

  1. File类的实例化,指明要读取的文件。
  2. 提供具体的流,实例化FileReader流。
  3. 数据读入。
  4. 流的关闭操作。

1.1.2注意点

  •  read():返回读入的一个字符。如果达到文件末尾,返回-1。
  • 异常的处理:为了保证流资源一定会被关闭,需要使用try-catch-finally来处理。
  • 读入的文件一定要存在,否则会报FileNotFoundException
    @Test
    public void testFileReader() {
        FileReader fr = null;
        try {
            //1.实例化file对象,指明要操作的文件
            File file = new File("hello.txt");//相较于当前module
            //2.提供具体的流
            fr = new FileReader(file);

            //3.数据的读入
            //read():返回读入的一个字符。如果达到文件末尾,返回-1
            int data;
            while ((data = fr.read()) != -1) {
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.流的关闭操作
            try {
                if (fr != null) {
                    fr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

1.2FileReader中使用read(char[] cbuf)

1.2.1实现步骤

整体实现过程,同上。

1.2.2注意点

  • read(char cbuf[]) :返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1。
  • 每次遍历cbuf[]的长度为每次read(char cbuf[])方法返回的len,而不是cbuf[]数组本身的长度。
    //对read()操作升级:使用read的重载方法
    @Test
    public void testFileReader1() {
        FileReader fr = null;
        try {
            //1.实例化file对象
            File file = new File("hello.txt");
            //2.提供具体的流
            fr = new FileReader(file);
            //3.数据的读入
            //read(char cbuf[]) :返回每次读入cbuf数组中的字符的个数。如果达到文件末尾,返回-1。
            char[] cbuffer = new char[5];
            int len;
            while ((len = fr.read(cbuffer)) != -1) {
                //方式一:遍历数组
                for (int i = 0; i < len; i++) {
                    System.out.print(cbuffer[i]);
                }

                //方式二:char数组转String
                String str =new String(cbuffer,0,len);
                System.out.print(str);

            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.资源的关闭
            try {
                if (fr != null) {
                    fr.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


二、FileWriter

2.1FileWriter写出数据的操作

2.1.1实现步骤

  1. File类的实例化,指明要写出的文件。
  2. 提供具体的流,实例化FileWriter流。
  3. 数据写出。
  4. 流的关闭操作。

2.1.2注意点

  • 输出操作,对应的File可以不存在,并不会报异常。
  • File对应的文件如果不存在,在输出的过程,会自动创建文件。
  • File对应的文件如果存在:
    • 如果流使用的构造器是FileWriter( file , false ) / FileWriter( file )  ,对原文件的覆盖
    • 如果流使用的构造器是FileWriter( file , true),对原文件追加在末尾。
    /**
     * 从内存中写数据到硬盘文件里
     */
    @Test
    public void testFileWriter() {
        FileWriter fw = null;
        try {
            //1.提供File类的对象,指明要导出的文件
            File file = new File("hello1.txt");
            //2.提供流的对象
            fw = new FileWriter(file, false);

            //3.导出数据
            fw.write("I have a dream!\n");
            fw.write("you need a dream!");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流资源
            try {
                if (fw != null) {
                    fw.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

三、使用FileReader和FileWriter实现文本文件的复制

    @Test
    public void testFileReaderFileWriter() {
        FileReader fr = null;
        FileWriter fw = null;

        try {
            //1.提供File类的对象,指明读入和写出的文件
            File srcFile = new File("hello.txt");
            File destFile = new File("hello1.txt");

            //2.提供流的对象
            fr = new FileReader(srcFile);
            fw = new FileWriter(destFile);

            //3.读入、写出数据
            char[] cbuf = new char[5];
            int len;
            while ((len = fr.read(cbuf)) != -1) {
                fw.write(cbuf, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            //4.关闭流资源
            try {
                if (fr != null)
                    fr.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                if (fw != null)
                    fw.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    }

上一篇:2022Java学习笔记七十九(网络编程:TCP通信,TCP通信:多个客户端消息【重点】,追踪客户端的上线和下线功能、线程池优化)


下一篇:Java集合中的Set集合必备文章