java IO流文件的输入流具体实例解析(二)
1、网上俣挫呲蹀找来的实例import java.io.*;public class ReadFile{ public static vo足毂忍珩id readFileByChars(String fileName) { File file = new File(fileName); Reader reader = null; try { char[] tempchars = new char[10]; int charread = 0; reader = new InputStreamReader(new FileInputStream(fileName)); while ((charread = reader.read(tempchars)) != -1) { if ((charread == tempchars.length)&& (tempchars[tempchars.length - 1] != '\r')) { System.out.print(tempchars); } else { for (int i = 0; i < charread; i++) { if (tempchars[i] == '\r') { continue; } else { System.out.print(tempchars[i]); } } } } } catch (Exception e1) { e1.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } } public static void main(String args[]) throws IOException { String path="D:\\f.txt"; ReadFile rf=new ReadFile(); rf.readFileByChars(path); }}同时在D盘根目录新建一个f.txt文件内容为:一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零

2、关于部分代码的讲解可以参考上篇的内容,两者例子的代码有相同之处,我们下面直接讲解while循环内的代码
3、while ((charread = reader.read(tempchars)) != -1)charread 是上面定义的整型变量,tempchars是上面定义的字符组,存储个数是10,reader.read(tempchars)和(一)篇的reader.read()有较大不一样,首先reader.read(tempchars)一次读取多个字符,并直接赋值给tempchars这个字符组,tempchars存储个数是10,如果文件有多于10个字符可读取,那就读取10个,剩下的下次读取。然后reader.read(tempchars)返回的值是读取字符的个数,如果读了10个字符,就返回10,读了5个,就返回5。reader.read(tempchars)读到文件结尾时,也是返回-1。所以条件的意识就是读取一组字符,并返回读取字符的个数赋给charread,读到文件尾时就为false结束循环


8、结果是:一二三四五六七八九十f零一二三四五六七f八九十零一二三四f五六七八九十零一f二三四五六七八九十零f一二三四五六七八f九十零一二三四五f六七八九十零一二f三0四1五2六3七4八5九6十7零8af一二三四五六七八九f十零一二三四五六七八f九十零一二三四五六七f八9九10十11零12ff代表一次while循环的结束,a表示执行了continue;语句,123这些数字表示System.out.print(tempchars[i]);的执行次数输出的结果得出几个结论:第一,在文件的最后一个字符是\r,但不会被读进数组中第二,除了文件的最后一行,其他行的末尾都有\r\n这两个字符,而且\r几乎都没删除,因为只出现了一个a,而每两个f之间可见只有八个字符,但我们设置的字符组有10位长度,剩下的俩个字符应该是\r\n第三,代码没能力排除多行文件的\r,甚至会造成不规律的多一行情况,因为只出现了一次a,而且不是在最后出现
9、最后的最后改良一下代码while循谪藁钴碳环改为 while ((charread = reader.read(tempchars)) != -1) { inner: for (int i = 0; i < charread; i++) { if (tempchars[i] == '\r') { System.out.print('a'); continue inner; } else { System.out.print(tempchars[i]); } } System.out.print('f'); }有两行System.out.print('a');System.out.print('f');是多余,用了检测代码运行情况的结果是一二三四五六七八九十f零a一二三四五六七f八九十零a一二三四f五六七八九十零a一f二三四五六七八九十零fa一二三四五六七八f九十零a一二三四五f六七八九十零a一二f三四五六七八九十零af一二三四五六七八九f十零一二三四五六七八f九十零一二三四五六七f八九十零f从结果来看每行末尾/r都没有输出