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

简介: 文章目录写在前面1 FileReader与FileWriter1.1 文件字符流体系概述1.2 FileReader构造方法与相关方法摘要1.3 FileWriter构造方法与相关方法摘要2 案例实操2.1 FileReader案例2.2 FileWriter案例3 处理流3.1 BufferedReader介绍及使用案例3.2 BufferedWriter介绍及使用案例3.3 缓存文件拷贝

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();
            }
        }
    }
}

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();
            }
        }
    }
}


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();
            }
        }
    }
}


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();
                }
            }
        }
    }
}


3.2 BufferedWriter介绍及使用案例

将文本写入字符输出流,缓冲字符,以便有效地写入单个字符,数组和字符串,存在用单个字符、数组、字符串作为参数的方法写入数据;

可以指定缓冲区大小,或者可以接受默认大小(8192个字符)。对于大多数用途,默认值足够大,说明该类存在一个常量值用作默认缓冲区大小同时也可以通过构造函数指定大小;

提供了一个newLine()方法,它使用平台自己的行分隔符概念,由系统属性line.separator定义。并非所有平台都使用换行符(’\ n’)来终止行。因此,调用此方法终止每个输出行比直接编写换行符更为可取。用于进行输出的时候做换行操作且自动适用平台的换行分隔符,而非自定义的,比较灵活;

通常,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();
                }
            }
        }
    }
}


如果希望换行,则使用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月前
|
安全 Java 数据库连接
【Java每日一题】——第三十五题:一个父类Animal和两个子类Rabbit和Tiger描述动物世界的继承关系两个子类吃的行为各不相同(兔子吃草,老虎吃肉)但睡觉的行为是一致
【Java每日一题】——第三十五题:一个父类Animal和两个子类Rabbit和Tiger描述动物世界的继承关系两个子类吃的行为各不相同(兔子吃草,老虎吃肉)但睡觉的行为是一致
45 0
|
1月前
|
安全 Java 数据库连接
【Java每日一题】——第三十四题:设计一个学生类Student和它的一个子类Undergraduate
【Java每日一题】——第三十四题:设计一个学生类Student和它的一个子类Undergraduate
67 0
|
5天前
|
存储 缓存 Java
|
6天前
|
Java API
Java从入门到精通:2.1.5深入学习Java核心技术之文件操作
Java从入门到精通:2.1.5深入学习Java核心技术之文件操作
|
21天前
|
存储 Java 数据库连接
java使用mp持久化框架,写入5000个字符,但是VARCHAR(255) 会报错
使用Java的MyBatis Plus框架时,如果尝试将超过VARCHAR(255)限制的字符串(如5000个字符)存入数据库,会抛出异常。解决方法是将列类型改为TEXT。可通过在实体类属性上添加`@TableField(typeHandler = JdbcType.CLOB)`注解,如`private String content;`,将属性映射到CLOB类型列,以存储更长字符串。
9 0
|
29天前
|
SQL Java 数据库连接
Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
Cause: java.sql.SQLSyntaxErrorException: ORA-00911: 无效字符
12 0
|
1月前
|
Java
Java——子类的继承性
Java——子类的继承性
12 0
|
1月前
|
Java
38、Java 中的正则表达式(单字符匹配和预定义字符)
38、Java 中的正则表达式(单字符匹配和预定义字符)
18 0
|
2月前
|
Java
Java CSV文件写入、特殊字符处理等
1、生成CSV文件时要处理双引号、逗号、回车和中文字符
91 1
|
2月前
|
Java
java字符串练习题4、统计一行字符串中所有的字符类型数量
java字符串练习题4、统计一行字符串中所有的字符类型数量
30 0