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

相关文章
|
6月前
|
安全 Java 开发者
掌握Java文件操作,让你的代码“飞”起来!读写、复制、删除全攻略!
【6月更文挑战第27天】Java文件操作涵盖读写、复制、删除。使用NIO的`Files`类提升效率:读取文件用`newBufferedReader`实现逐行读,写入文件用`newBufferedWriter`,复制文件用`copy`方法,删除文件用`deleteIfExists`,确保安全。这些最佳实践优化了内存使用,简化了代码。
40 0
|
2月前
|
Java 编译器
【一步一步了解Java系列】:子类继承以及代码块的初始化
【一步一步了解Java系列】:子类继承以及代码块的初始化
137 3
|
2月前
|
Java
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
本文探讨了在Java中,当父类的方法返回`this`对象或变量时,子类调用该方法的行为,以及`this`关键字在不同类中调用方法时的指向问题。
16 0
java中父类方法return this.对象还是变量,子类去调用this.这个方法的问题
|
3月前
|
Java
Java文件操作
本文介绍了Java中`File`类的使用方法,包括构造方法、常见成员方法及其实现功能。`File`对象可以表示文件或文件夹,支持绝对路径和相对路径。构造方法有三种:基于完整路径、父级路径与子路径组合、`File`对象与字符串组合。成员方法涵盖判断类型、获取大小、获取路径、创建与删除文件/文件夹、获取文件列表、重命名等操作。文章通过示例代码详细展示了各个方法的应用场景及注意事项。
42 1
Java文件操作
|
2月前
|
Java 程序员 编译器
【Java】继承、super、final、子类构造方法
【Java】继承、super、final、子类构造方法
35 0
|
4月前
|
Java 编译器
JAVA中的夫类与子类
JAVA中的夫类与子类
|
4月前
|
Java
Java——编码GBK的不可映射字符
Java——编码GBK的不可映射字符
46 1
|
4月前
|
存储 Java Apache
|
5月前
|
Java API 索引
Java中的字符串与字符操作详解
Java中的字符串与字符操作详解