Java中的流Stream和读取器Reader及其之间的关系
简介
字节流(InputStream ):InputStream inputStream = new FileInputStream(dataFile);
,使用Inputstream获取dataFile(完整路径+文件名,比如C:\\Users\\Administrator\\Desktop\\1.txt
)的字节流(即ASCII码,即下图左侧红框中的 65 62 等等)。
读取字节流(InputStreamReader):InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
,使用InputStreamReader从获取到的字节流InputStream中读取数据(即ASCII码,即下图左侧红框中的 65 62 等等)并输出。
读取字符流(BufferedReader):BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
,使用BufferedReader将InputStreamReader中读取的字节流数据转换为字符流数据(即下图右侧红框中的eb 9a 等等)并输出。
InputStreamReader与BufferedReader是共享字节流的关系
因为BufferedReader在初始化的时候,是使用new BufferedReader(inputStreamReader)
来进行初始化的,所以InputStreamReader与BufferedReader是共享文件字节流数据InputStream
的。更具体地说,当使用InputStream inputStream = new FileInputStream(dataFile);
获取上图红框的文件字节流(ASCII码)后,若使用inputStreamReader.read()从字节流inputStream中读出一个int后,再使用bufferReader从inputStream中读取一行数据时,其会跳过inputStreamReader刚读出的int,从下一位开始读到本行结束,如下方代码所示。
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
/*******************测试bufferReader能否将inputStreamReader从字节流变为字符流********************/
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
int resultArray = inputStreamReader.read();
System.out.println("使用inputStreamReader从.dat文件中读到int中的数据的ASCII值是:"+ resultArray);//读取的第一个数据是101
String reultString = bufferedReader.readLine();
System.out.println("使用BufferReader从.dat文件中读到第" +i+ "个数据是:"+reultString);
使用inputStreamReader从.dat文件中读到int[988]中的第0个数据是:101 //Eclipse输出的101是十进制,换算成为十六进制后,是上图左侧红框第一行第一个字符65,对应右侧红框中的e。
使用BufferReader从.dat文件中读到第0个数据是:b 9a c0 0d 02 00 f9 f9 //在上一行代码读出一个e后,再使用BufferReader读取字符流数据时,其输出从e之后的b开始