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开始
本文详细介绍了Java中字节流InputStream、读取器InputStreamReader以及BufferedReader之间的关系。通过实例展示了如何从字节流中读取数据,并解释了BufferedReader如何共享字节流数据,以及它们在读取文件时如何协作。通过InputStream读取文件的ASCII码,然后使用InputStreamReader将其转换为字符流,最后BufferedReader从中读取字符流数据。文章强调了BufferedReader在读取时会跳过已读取的字节,确保数据的连续性。

3万+

被折叠的 条评论
为什么被折叠?



