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时,循环结束。
还有待进一步学习。