在每次使用FileInputStream的read方法时,需要用到字节数组bytes和真实读取长度len,如代码:
public static void read(){
File file = new File("D:/学习/Android/代码/Workplace/Java_8_1_File/a.txt");
try {
//针对文件创建一个输入流
InputStream in = new FileInputStream(file);
byte[] bytes = new byte[1024*1024*10];//定义一个10MB的字节数组
int len = -1;//每次真实读取的长度
StringBuffer buf = new StringBuffer();
try {
while((len = in.read(bytes))!=-1){
buf.append(new String(bytes,0,len));
}
in.close();//关闭
System.out.println(buf);
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
,其中在循环里,buf.append那一句中,每一次都把0处len字节数加入到buf中,那么倘若文件的数据是:
01234
为何最后输出的结果不是:
001012012301234
呢?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
首先呢这个bytes是干什么的?
缓冲区,就是防止大数据量的时候,我们每次只读取一部分数据到缓冲区中进行操作
那么这个len又是什么呢?
它是实际的读取字节的数
你如果学过数据结构就知道这是一种线性表的思想
因为有时候读取的数据是不能填满这个bytes的,那么len就是实际的数
你抓住读取思想:
每次都是读取文件的bytes大小数据放到bytes数组中
所以取的时候自然是从bytes的0处去取
buf.append(new String(bytes,0,len));
加上len,用于防止最后一次的操作错误,最后一次取的数据实际长度是小于等于bytes的长度的,如果小于,那么bytes还残留着上次的数据。
所以使用len来读取最后一次实际取的数据。
建议去看看线性表