Reader类read方法的学习

import java.io.*;

public class Test {
    public static void main(String[] args){
        FileReader fi=null;
        FileWriter fo=null;
        try {

            File srcFile=new File("sb.txt");


            fi=new FileReader(srcFile);


            char[] cbuf= new char[4];

            while((fi.read(cbuf))!=-1){

                System.out.print(cbuf);
            }
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }
        finally {
            try {
                if(fo!=null){
                    fo.close();
                }
            }catch (IOException e){
                e.printStackTrace();
            }finally {
                try {
                    if (fi!=null) {
                    fi.close();
                    }
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
        }
      }
    }

sb.txt 存的就是四个字母
abcd

在学习IO的学习过程中,对于像我这样的初学者,Reader类的read函数用像

int read(char[ ] cbuf)

这种形式就行,不会出问题。对于代码的大致理解就是文件中的字符被换算成数字存进了cbuf数组了,但具体是怎么存的,却不太清楚。

今天要讲的就是进阶用法

int read(char[ ] cbuf,int off, int len)

实际上查看源码,发现上面这种写法就是调用了Reader类里的的抽象方法

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

默认的off等于0,cbuf等于数组大小

改改会怎么样?

我喜欢先不看课本,先自己试试,看是个什么意思

这里我们分别输入以下几种情况

fi.read(cbuf,0,1)
fi.read(cbuf,0,2)
fi.read(cbuf,1,2)
fi.read(cbuf,1,3)

对于结果会出现特殊字符,我用"*"号代替

a***b***c***d   
ab**cd**  
*ab**cd*
*abc*dbc

大致可以猜出off代表cbuf数组会从哪个位置开始存字母的Ascii码值,而len代表一次会从文件读几个字符。

上述都只进行了两次循环,都将abcd四个字母打印了出来,所以猜测循环终止是以是否读到文件中最后一个字母。

return n + implRead(cbuf, off, off + len);
 int implRead(char[] cbuf, int off, int end) 

源码的具体内容看不懂,但好像就是在记录position,当n+position=-1时,循环结束。
还有待进一步学习。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值