IO流中的FileReader和FileWriter

利用IO流中的FileReader和FileWriter来实现读写操作

注意:字符流是不能对非文本文件进行复制操作的
文本文件:.txt, .java, .c, .cpp
非文本文件(.jpg, .mp3, .mp4, .avi, .doc, .ppt…),使用字节流来处理

总的来说就是分为四个步骤
①造文件
②造流
③对文件的处理
④资源的关闭

在对文件的处理的时候通过一个char型数组来提高效率。

Reader抽象类的read方法(源码)
只要cbuf中还有数据,read方法就不不停的读入,直到读完返回-1

public int read(char cbuf[]) throws IOException {
        return read(cbuf, 0, cbuf.length);
}

public abstract int read(char cbuf[], int off, int len) throws IOException;

通过源码注释可知,返回值为读入字节的个数

Writer抽象类的write方法(源码)

public void write(char cbuf[], int off, int len) throws IOException {
        se.write(cbuf, off, len);
}

在这里插入图片描述
通过源码可知write方法通过第二个参数和第三个参数来写入文件中,off为起始索引,len为结束索引。所以在下面的对文件读写的操作代码中写的是fr.wirte(cbuf, 0, len)而不是fr.write(cbuf, 0, cbuf.length)因为cbuf中并不一定全部都是刚刚写入的数据。
在这里插入图片描述

比如说这个hello文件,如果使用前者方法读出来的是helloworld123,如果使用后者则会读出来helloworld123ld,因为read操作实际上是对cbuf数组的覆盖,而ld仍然在cbuf数组中,所以读出来的时候根据cbuf.length会读出123ld出来。

至于为什么cbuf数组的大小设置为5,这个取决于文件的大小(因为该例子文件过小所以设置为5),如果数组大小设置过大则会占用内存空间,如果数组大小设置过小,则会多次读写导致效率低,所以通常是取1024的.

import org.junit.Test;

import java.io.*;

/**
 * @author LTH
 * @date 2021/4/4 - 8:14
 */
public class FileReaderFileWriter {

    //注意:在IDEA中单元测试方法相对路径是当前Module下,main方法的相对路径是当前工程下
    @Test
    /**
     * 利用FileReader和FileWriter对文件进行读写操作
     */
    public void fileReaderFileWriter() throws IOException {
        //1.造文件
        File srcFile = new File("hello.txt");
        File destFile = new File("hello1.txt");

        //2.造流
        FileReader fr = new FileReader(srcFile);
        FileWriter fw = new FileWriter(destFile);
    
        //3.数据的读入reader和写出操作writer
        //这里的char型数组可以类似为快递小哥的小车,打包好后再送会提高效率,不然多次读写磁盘会降低效率
        char[] cbuf = new char[5];
        int len;//记录每次读入到cbuf数组中的字符的个数
        while((len = fr.read(cbuf)) != -1){
            fw.write(cbuf, 0, len);
        }
        
        //4.流的关闭
        fw.close();
        fr.close();
    }
    
    @Test
    /**
     * 利用FileReader和FileWriter对文件进行读写操作
     * 因为涉及到资源的关闭,所以说选择使用try-catch-finally来处理异常
     */
    public void fileReaderFileWriter1() {
        FileReader fr = null;
        FileWriter fw = null;
        try {
            File srcFile = new File("hello.txt");
            File destFile = new File("hello1.txt");
            fr = new FileReader(srcFile);
            fw = new FileWriter(destFile);
            char[] cbuf = new char[5];
            int len;
            while((len = fr.read(cbuf)) != -1){
                fw.write(cbuf, 0, len);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fw != null){
                try {
                    fw.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (fr != null){
                try {
                    fr.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值