java IO流文件的输入流具体实例解析(一)
这里是在网上找来的几个关于 IO流文件的输入流具体实例代码,接下来试着将其解析得更清楚明白一些,希望初学者看完能有所收获,这篇这个例子的代码是把文件上的字符一个个连续输出
方法/步骤
-
网上找来的实例
import java.io.*;
public class ReadFile
{
public static void readFileByChars(String fileName) {
File file = new File(fileName);
Reader reader = null;
try {
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = reader.read()) != -1) {
if (((char) tempchar) != '\r') {
System.out.print((char) tempchar);
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String args[]) throws IOException
{
String path="D:\\f.txt";
ReadFile rf=new ReadFile();
rf.readFileByChars(path);
}
}
同时在D盘根目录新建一个f.txt文件
内容为:
一二三四五六七八九十零
一二三四五六七八九十零
一二三四五六七八九十零
一二三四五六七八九十零
一二三四五六七八九十零
一二三四五六七八九十零
一二三四五六七八九十零
一二三四五六七八九十零一二三四五六七八九十零一二三四五六七八九十零
-
接下来我们用eclipse运行程序,运行成功并得到一下结果,读取是正常的
-
接着我们分析一下程序的一些语句,先从主函数main(String args[])看起
String path="D:\\f.txt";
这句是定义一个字符变量存储文件的路径
ReadFile rf=new ReadFile();
ReadFile就是程序本身的主类,定义rf调用程序的函数
rf.readFileByChars(path);
readFileByChars就是程序定义的一个函数
-
接下来看函数readFileByChars(String fileName)
File file = new File(fileName);
Reader reader = null;
定义并初始化了读取文件需要的变量,File,Reader都是java的类,File类是文件对象,Reader类是所有字符输入的父类
try catch (Exception e)
是当发生错误时捕捉错误的语句
-
reader = new InputStreamReader(new FileInputStream(file));
Reader类是所有字符输入的父类,
FileInputStream类就是把文件按照字节读入,
InputStreamReader类就是把读入的字节转化为字符,
语句的意思就是把文件按照字节读入后,再转成字符,再赋值给reader,
int tempchar;
定义一个整型变量,作为读取的字符的暂存变量
-
while ((tempchar = reader.read()) != -1)
while是while循环,tempchar是读取的字符的暂存变量, reader.read()的表示读取文件一个字符,并返回这个字符的数值,read()读到文件没有字符可读时会返回-1
所以条件的意思是读取文件字符,并返回给tempchar,直到读到文件尾没有字符时,条件就为false结束循环
-
if (((char) tempchar) != '\r') {
System.out.print((char) tempchar);
}
if是条件判断,(char) 是强制类型转换为字符型,((char) tempchar)把字符的值转换为字符,'\r'是换行字符, System.out.print((char) tempchar);是输出字符
这个语句的意思是除开'\r'这个字符,其他字符都输出,
为什么要屏蔽'\r'呢?原因是windows文件换行结尾是\r\n这两字符,读取文件时也会一起读进来,如果这个两个字符一起输出或者连续输出是换一行,但如果分开不连续输出就是换两行,屏蔽'\r'是为为了避多出来的行
reader.close();
最后读完后把字符流关闭了
e.printStackTrace();
是输出发生错误时错误
-
最后我试一下如果不写 if (((char) tempchar) != '\r')这个判断语句会怎么样,
结果是毫无变化,因为程序是一一个字符连续输出,\n\r不会出现分开不连续输出的情况,所以不会有变化。
当然可能在非windows编译环境会多出一行。