欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java IO流操作(FileReader、BufferedReader)

程序员文章站 2024-03-06 16:08:32
...

 

一、FileReader

1、介绍。

        FileReader类从InputStreamReader类继承而来。该类按字符读取流中数据。可以通过以下几种构造方法创建需要的对象:1、在给定从中读取数据的 File 的情况下创建一个新 FileReader,FileReader(File file)。2、在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader,FileReader(FileDescriptor fd) 。3、在给定从中读取数据的文件名的情况下创建一个新 FileReader,FileReader(String fileName) 。

        FileReader与FileInputStream对应,从文件系统中读取字符序列。CharArrayReader与ByteArrayInputStream 对应,从字符数组中读取数据。PipedReader与PipedInputStream 对应,从线程管道中读取字符序列。我这里主要介绍下FileReader,至于CharArrayReader和PipedReader的话,你可以对照下FileReader与FileInputStream的写法区别,然后仿照ByteArrayInputStream 和PipedReader写一下就可以了。

2、代码。

private static final String Pre_Path = "G:\\项目测试\\io流文件测试\\";

public static void main(String[] args) {
    fileReaderTest();//文件的复制(字符流)
}
//文件的复制(字符流,中文字符会有乱码问题)
private static void fileReaderTest() {
    Reader reader = null;//输入流
    Writer writer = null;//输出流
    try {
        reader = new FileReader(Pre_Path + "readerAndWrite\\test1.txt");
        writer = new FileWriter(Pre_Path + "readerAndWrite\\test2.txt");
        char[] chars = new char[1024];
        int len;
        while ((len = reader.read(chars)) != -1) {
            System.out.println("读取到的字符:\n" + new String(chars));
            writer.write(chars, 0, len);
            writer.flush();
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        try {
            if (reader != null) {
                reader.close();
            }
            if (writer != null) {
                writer.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

3、测试用例。

Java IO流操作(FileReader、BufferedReader)

4、结果。

Java IO流操作(FileReader、BufferedReader)

二、BufferedReader

1、介绍。

        为了提高字符流读写的效率,引入了缓冲机制,进行字符批量的读写,提高了单个字符读写的效率。BufferedReader用于加快读取字符的速度,BufferedWriter用于加快写入的速度。BufferedReader和BufferedWriter类各拥有8192个字符的缓冲区。当BufferedReader在读取文本文件时,会先尽量从文件中读入字符数据并放满缓冲区,而之后若使用read()方法,会先从缓冲区中进行读取。如果缓冲区数据不足,才会再从文件中读取,使用BufferedWriter时,写入的数据并不会先输出到目的地,而是先存储至缓冲区中。如果缓冲区中的数据满了,才会一次对目的地进行写出。

2、代码。

    private static final String Pre_Path = "G:\\项目测试\\io流文件测试\\";

    public static void main(String[] args) {
        bufferedReaderTest();//文件的复制(字符缓冲流,可以解决乱码问题)
    }

    //文件的复制(字符缓冲流,可以解决乱码问题)
    private static void bufferedReaderTest() {
        BufferedReader bufferedReader = null;
        BufferedWriter bufferedWriter = null;
        try {
            //FileWriter继承了InputStreamReader
            bufferedReader = new BufferedReader(new InputStreamReader(
                    new FileInputStream(Pre_Path + "buffer\\test1.txt"), "GBK"));
            bufferedWriter = new BufferedWriter(new FileWriter(Pre_Path + "buffer\\test2.txt"));
            //方法一
//            String readStr;
//            while ((readStr = bufferedReader.readLine()) != null) {
//                System.out.println("读取到的字符:"+readStr);
//                bufferedWriter.write(readStr);
//                bufferedWriter.newLine();//换行
//            }
            //方法二
            char[] chars = new char[1024];
            int len;
            while ((len = bufferedReader.read(chars)) != -1) {
                System.out.println("读取到的字符:\n" + new String(chars));
                bufferedWriter.write(chars, 0, len);
                bufferedWriter.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (bufferedWriter != null) {
                    bufferedWriter.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

3、测试用例。

Java IO流操作(FileReader、BufferedReader)

4、结果。

Java IO流操作(FileReader、BufferedReader)