• 【Java】文件操作篇(三)字符输入流、字符输出流及常用子类


    💁 个人主页:黄小黄的博客主页
    ❤️ 支持我:👍 点赞 🌷 收藏 🤘关注
    🎏 格言:All miracles start from sometime somewhere, make it right now.
    本文来自专栏:JavaSE从入门到精通
    在这里插入图片描述

    写在前面

    🐱 较为完整的JavaIO流体系图如下:
    在这里插入图片描述
    本文涉及到Reader字符输入流与Writer字符输出流常用的子类:

    • FileReader:字符输入流;
    • FileWriter:字符输出流;
    • BufferedFileReader:字符缓冲输入流;
    • BufferedFileWriter:字符缓冲输出流。


    1 FileReader与FileWriter

    1.1 文件字符流体系概述

     FileReader 与 FileWriter均是字符流,即按照字符来操作JavaIO,其继承体系如下图:
    在这里插入图片描述

    1.2 FileReader构造方法与相关方法摘要

    ✌️ FileReader 构造方法摘要:
    在这里插入图片描述
    ⭕️ FileReader 相关方法:

    方法名说明
    read()每次读取单个字符,返回该字符,如果到文件末尾,则返回-1
    read(char[])批量读取多个字符到数组,返回读取到的字符数,如果到达文件末尾就返回-1

    1.3 FileWriter构造方法与相关方法摘要

    ✌️ FileWriter 构造方法摘要:
    在这里插入图片描述
    ⭕️ FileWriter 相关方法:

    方法名说明
    writer(int)写入单个字符
    writer(char[])写入指定数组
    writer(char[], off, len)写入指定数组的指定部分
    writer(string)写入整个字符串
    writer(string, off, len)写入字符串的指定部分

    FileWriter使用后,必须要关闭(close)或刷新(flush),否则写入不到指定的文件中。


    2 案例实操

    2.1 FileReader案例

    使用FileReader从story.txt读取内容,并在控制台显示。

    1️⃣ 单个字符读取方式

    import java.io.FileReader;
    import java.io.IOException;
    
    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     * 演示 FileReader 读取 story.txt
     */
    public class FileReaderTest {
        public static void main(String[] args){
            //创建流
            FileReader fileReader = null;
            int data = 0;
            try {
                fileReader = new FileReader("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story.txt");
                //循环读取
                while ((data = fileReader.read()) != -1){
                    System.out.print((char) data);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //关闭资源
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31

    2️⃣ 多个字符读取方式

    import java.io.FileReader;
    import java.io.IOException;
    
    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     * 演示 FileReader 读取 story.txt
     */
    public class FileReaderTest {
        public static void main(String[] args){
            //创建流
            FileReader fileReader = null;
            int readLen = 0;
            char[] buff = new char[8];
            try {
                fileReader = new FileReader("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story.txt");
                //循环读取
                while ((readLen = fileReader.read(buff)) != -1){
                    String str = new String(buff, 0, readLen);
                    System.out.print(str);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //关闭资源
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    在这里插入图片描述

    2.2 FileWriter案例

    使用FileWriter将“奇迹皆有始,当下即行动!”写入到 say.txt 文件中。

    ⌨️ 参考代码及结果:

    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     * FileWriter使用案例
     */
    public class FileWriterTest {
        public static void main(String[] args) {
            //创建流
            FileWriter fileWriter = null;
            try {
                fileWriter = new FileWriter("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\say.txt");
                //写入数据
                String str = "奇迹皆有始,当下即行动!";
                fileWriter.write(str);
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                try {
                    //释放资源
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    在这里插入图片描述


    3 处理流

    3.1 BufferedReader介绍及使用案例

    BufferedReader继承于Reader
    BufferedReader的作用是为其他字符输入流添加一些缓冲功能,是一种处理流也叫包装流。

    🐱构造函数

    • BufferedReader(Reader in): 创建一个使用默认大小输入缓冲区的缓冲字符输入流
    • BufferedReader(Reader in, int sz): 创建一个使用指定大小输入缓冲区的缓冲字符输入流

    使用BufferedReader读取文件,并显示在控制台

    ⌨️ 参考代码与结果:

    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    
    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     */
    public class BufferedReaderTest {
        public static void main(String[] args) {
            //创建缓冲流对象,套接在指定节点流基础上
            BufferedReader bufferedReader = null;
            try {
                bufferedReader = new BufferedReader(
                        new FileReader("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story.txt"));
                //读取文件,按行读取效率高
                //到达文件末尾,readLine方法返回null
                String line;
                while ((line = bufferedReader.readLine()) != null){
                    System.out.println(line);
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //关闭资源,只需要关闭外层流即可
                if (bufferedReader != null){
                    try {
                        bufferedReader.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    在这里插入图片描述

    3.2 BufferedWriter介绍及使用案例

    1. 将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串,存在用单个字符、数组、字符串作为参数的方法写入数据;
    2. 可以指定缓冲区大小,或者可以接受默认大小(8192个字符)。对于大多数用途,默认值足够大,说明该类存在一个常量值用作默认缓冲区大小同时也可以通过构造函数指定大小;
    3. 提供了一个newLine()方法,它使用平台自己的行分隔符概念,由系统属性line.separator定义。并非所有平台都使用换行符(’\ n’)来终止行。因此,调用此方法终止每个输出行比直接编写换行符更为可取。用于进行输出的时候做换行操作且自动适用平台的换行分隔符,而非自定义的,比较灵活;
    4. 通常,Writer会立即将其输出发送到基础字符或字节流。除非需要提示输出,否则建议将BufferedWriter包装在任何write()操作可能代价高昂的Writer周围,例如FileWriters和OutputStreamWriters。

    使用BufferedWriter将“Hello,黄小黄!”写入到hxh.txt文件中。

    ⌨️ 参考代码与结果:

    import java.io.BufferedWriter;
    import java.io.FileWriter;
    import java.io.IOException;
    
    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     * 案例演示
     */
    public class BufferedWriterTest {
        public static void main(String[] args) {
            //创建字符输入缓冲流
            BufferedWriter bw = null;
            try {
                bw = new BufferedWriter(new FileWriter("D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\hxh.txt"));
                //内容写入
                String str = "Hello, 黄小黄!";
                bw.write(str);
                //插入换行符
                bw.newLine();
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //释放资源,只需要关闭外层流即可
                if(bw != null){
                    try {
                        bw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34

    在这里插入图片描述

    如果希望换行,则使用bw.newLine()方法进行操作,该方法会根据系统插入相应的换行符。

    3.3 缓存文件拷贝

    采用缓存字符流的方式,复制一份story.txt文件。

    🐱 参考代码:

    具体见注释

    import java.io.*;
    
    /**
     * @author 兴趣使然黄小黄
     * @version 1.0
     * 字符缓存流复制文本文件演示
     */
    public class BufferedCopyTest {
        public static void main(String[] args) {
            String srcFilePath = "D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story.txt";
            String destFilePath = "D:\\Ideaproject2021\\JavaSE\\src\\IOchapter\\story副本.txt";
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
                //创建流对象
                br = new BufferedReader(new FileReader(srcFilePath));
                bw = new BufferedWriter(new FileWriter(destFilePath));
                //读取,边读边写
                String line = null;
                //readLine 读取一行的内容,但是没有换行符
                while ((line = br.readLine()) != null){
                    bw.write(line);
                    //插入换行符
                    bw.newLine();
                    //刷新
                    bw.flush();
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                //释放资源
                try {
                    if (br != null){
                        br.close();
                    }
                    if (bw != null){
                        bw.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    在这里插入图片描述


    写在最后

    最后啰嗦一下,本文内容都是关于字符流的,请不要使用字符流对二进制文件进行操作,否则,容易出现读取错误等问题。
    🌟以上便是本文的全部内容啦,后续内容将会持续免费更新,如果文章对你有所帮助,麻烦动动小手点个赞 + 关注,非常感谢 ❤️ ❤️ ❤️ !
    如果有问题,欢迎私信或者评论区!
    在这里插入图片描述

    共勉:“你间歇性的努力和蒙混过日子,都是对之前努力的清零。”
    在这里插入图片描述

  • 相关阅读:
    简单工厂,工厂方法,抽象工厂模式
    AI智能剪辑,仅需2秒一键提取精彩片段
    java--赋值运算符
    我们为何看好投资 DAO?
    Python 操作 lxml库与Xpath(爬取网页指定内容)
    双列集合 JAVA
    程序员的悲哀
    React学习笔记二
    在Ubuntu系统上部署Inis博客,并使用内网穿透将博客网站发布到公共互联网上
    做自媒体的素材都是在哪里找的呢?
  • 原文地址:https://blog.csdn.net/m0_60353039/article/details/126830737