Java IO流操作(FileReader、BufferedReader)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_36511401/article/details/102725571

一、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、测试用例。

4、结果。

二、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、测试用例。

4、结果。

猜你喜欢

转载自blog.csdn.net/qq_36511401/article/details/102725571