Java IO 中的 FileReader 和 FileWriter


Java IO 的流,有三个分类的维度:

  • 输入流 or 输出流
  • 节点流 or 处理流
  • 字节流 or 字符流
    在这里插入图片描述

FileReader和FileWriter是Java IO流中用于处理字符文件读取和写入的两个类,它们分别继承自Reader和Writer,是处理文本文件的便利类

一 FileReader(字符流、节点流、输入流)

1. 定义与用途

  • FileReader类用于从文本文件读取数据,每次读取一个字符或者一个字符数组。它继承自InputStreamReader,并默认使用平台默认的字符编码来解码文件内容。

2. 构造方法

  • FileReader(File file): 根据给定的File对象构造一个FileReader对象。
  • FileReader(String fileName): 根据给定的文件名构造一个FileReader对象。
  • FileReader(FileDescriptor fd): 构造一个与给定文件描述符相关联的FileReader对象。

3. 常用方法

  • int read(): 读取文件中的下一个字符,并返回它。如果到达文件末尾,则返回-1。
  • int read(char[] cbuf, int off, int len): 读取文件中的字符,并将它们存储到字符数组cbuf中,从cbuf[off]开始的位置存储,最多读取len个字符。返回实际读取的字符个数,如果到达文件末尾,则返回-1。
  • void close(): 关闭流并释放与流相关联的任何系统资源。

4. 注意事项

  • FileReader要求文件必须存在,否则将抛出FileNotFoundException。
  • 读取文件时,建议使用try-with-resources语句或try-catch-finally语句来确保流资源被正确关闭。

5. 示例一:使用 read() 单个字符读取

下面的代码实现了功能:读取文件内容,并显示。
d:\abc.txt 文件中,有一行“hello,csdn.net” 文字;使用了 read() 方法,单个字符读入,并打印出来。

public class FileReaderDemo {
    /**
     * 读取文件内容,并显示
     */
    @Test
    public void fileReader(){
        String filePath = "d:\\abc.txt";
        int data = 0;
        try {
            FileReader fileReader = new FileReader(filePath);
            //使用read循环读取,单个字符读入
            while((data = fileReader.read())!=-1){
                System.out.print((char) data);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

执行后,输出结果:

hello,csdn.net

6.示例二:使用 read(char[] cbuf) 按照字节数组读取,提升效率

还是上面的文件d:\abc.txt ,这次内容变为两行

Hello,world!
Hello,csdn 官网!

public class FileReaderDemo {
    /**
     * 字符数组读取文件
     */
    @Test
    public void fileReader1(){
        String filePath = "d:\\abc.txt";
        //字符数组
        char[] buf = new char[8];
        int readData = 0;
        FileReader fileReader = null;
        try {
            fileReader = new FileReader(filePath);
            //循环读取,使用read(buf),返回的是实际读取到的字符数
            //返回-1,说明文件结束
            while((readData = fileReader.read(buf))!=-1){
                System.out.print(new String(buf,0,readData));
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(fileReader!=null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

执行测试方法后,输出内容为:

Hello,world!
Hello,csdn 官网!

二 FileWriter (字符流、节点流、输出流)

1. 定义与用途

  • FileWriter类用于向文本文件写入数据,每次写入一个字符、一个字符数组或者一个字符串。它继承自OutputStreamWriter,并默认使用平台默认的字符编码来编码写入的数据。

2. 构造方法

  • FileWriter(File file): 根据给定的File对象构造一个FileWriter对象。如果文件已存在,则会被覆盖。
  • FileWriter(File file, boolean append): 根据给定的File对象构造一个FileWriter对象。如果append为true,则写入的数据会追加到文件末尾,而不是覆盖文件。
  • FileWriter(String fileName): 根据给定的文件名构造一个FileWriter对象。如果文件已存在,则会被覆盖。
  • FileWriter(String fileName, boolean append): 根据给定的文件名构造一个FileWriter对象。如果append为true,则写入的数据会追加到文件末尾,而不是覆盖文件。
  • FileWriter(FileDescriptor fd): 构造与给定文件描述符相关联的FileWriter对象。

3. 常用方法

  • void write(int c): 写入一个字符。
  • void write(char[] cbuf): 写入一个字符数组。
  • void write(char[] cbuf, int off, int len): 写入字符数组的一部分,从cbuf[off]开始,写入len个字符。
  • void write(String str): 写入一个字符串。
  • void write(String str, int off, int len): 写入字符串的一部分,从str[off]开始,写入len个字符。
  • void flush(): 刷新流,将缓冲区中的数据写入底层输出流中。
  • void close(): 关闭流并释放与流相关联的任何系统资源。

4. 注意事项

  • 如果指定的文件不存在,FileWriter会在写入数据时自动创建该文件。
  • 写入文件时,建议使用try-with-resources语句或try-catch-finally语句来确保流资源被正确关闭。
  • 当使用FileWriter的append模式时,如果文件已存在,则写入的数据会追加到文件末尾,而不是覆盖文件。

5.示例

public class FileWriterDemo {
    @Test
    public void fileWriter(){
        String filePath = "d:\\file-writer.txt";
        FileWriter fileWriter = null;
        String outTxt = "翠花,上酸菜!";
        char[] cui = {'c','u','i','h','u','a'};
        try {
            fileWriter = new FileWriter(filePath);
            fileWriter.write('C');
            fileWriter.write(cui);
            fileWriter.write(cui,0,3);
            fileWriter.write(outTxt);
            fileWriter.write(outTxt,0,4);

            //在数据量大时,可以使用循环操作

        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                //fileWriter.flush();
                //关闭文件流,等价于 flush() + 关闭
                fileWriter.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

执行测试方法后,输入结果为:

在这里插入图片描述


三 综合使用 FileReader 和 FileWriter 拷贝文件

由于FileReader 和 FileWriter 是针对字符流的,所以图片等二进制文件拷贝后,无法正常打开。
所以我们来拷贝文本文件。

public class FileCopy2 {
    @Test
    public void fileCopy() throws IOException {
        String srcPath = "d:\\raokouling_src.txt";
        String targetPath = "d:\\raokouling_target.txt";
        char [] buf = new char[1024];
        int readLength = 0;
        FileReader fileReader = new FileReader(srcPath);
        FileWriter fileWriter = new FileWriter(targetPath);
        while((readLength = fileReader.read(buf))!=-1){
            fileWriter.write(buf,0,readLength);
        }
        fileReader.close();
        fileWriter.close();
    }
}

执行测试方法后,在d盘生成了:raokouling_target.txt,我们打开后,与src中的一致:

在这里插入图片描述

以上就是 Java IO 中的 FileReader 和 FileWriter 的全部内容,感谢阅读!

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值