A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 魏征 中级黑马   /  2012-5-2 21:10  /  3058 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

视频中毕老讲的FileInputStream,本人不理解,希望高手讲解一下,希望结合例子全面讲解透彻,不要全篇理论,便于理解。还有代码中注释的问题。
public static void main(String[] args) throws IOException
{
  FileInputStream fis=new FileInputStream("bfwt.txt");
  byte []b=new byte[1024];
  int len=0;
  while ((len=fis.read(b))!=-1)//fis.read(b)返回的到底为什么值
  {
   System.out.println(new String(b,0,len));//为什么是一次打印出来的,不是在遍历么?
  }
  fis.close();
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

8 个回复

倒序浏览
把你文档里的数据放在数组中   放完的时候就返回-1
回复 使用道具 举报
首先是fis.read(b)这句代码:b代表的是一个1024长度的数组,该代码的意思就是从文件中一个
字节一个字节地读取数据,并把数据存入数组b中。len=fis.read(b) 这句代码返回的是数组中
所存数据的长度。注意:如果一次读不到文件的末尾,那么该数组中的1024个字节肯定都装满了
数据,即:len=1024。如果恰好读到了文件的末尾,但数组没装满,那么len就不是1024。比如,
文件的长度是2050字节,那么通过循环读写,第1次向数组中读入1024个字节,len为1024,第2
次和第1次是一样的,但此时还剩下2个字节的数据,所以第3次读取只向数组中读入了2个字节就
结束了,len的值为2。

因为文件的长度一般大于数组的长度,所以要循环读写,也就是说要不断地向数组中装入数据(这里
可以把数组形象的想象为一个盛水的杯子),每次数组装满,都要将字节形式的数据变为字符串打印
出来,而数组中究竟有多少数据,是有len来显示的, new String(b, 0, len)就是将数组中的有效数据
变成字符串。而len长度后面的若干字节,由于有默认初始化的作用,都是byte形式的0,是没有意义的,
所以不能将整个数组变为字符串。

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 天道酬勤 于 2012-5-2 21:38 编辑

public static void main(String[] args) throws IOException
{
  //通过打开一个实际文件的连接来创建一个FileInputStream。
  FileInputStream fis=new FileInputStream("bfwt.txt");
  //定义一个缓冲区,提高效率
  byte []b=new byte[1024];
  //定义一个变量
  int len=0;
  //fis.read(b)返回一个int ,表示读取多少个字节。
  //举个例子,你定义的文件中有24个字节,其实后面还有一个windows的结束标记,
  //那么read()方法把这24个字节全部读到你定义的字节数组中
  //然后while循环,第一次读到24之后,发现windows的结束标记,结束读的动作,返回24
  //,并将记录的指针放到数组的开头,
  //第二次读的时候,因为数组里面没有任何字节,发现windows的结束标记,并返回-1,结束了循环。
  while ((len=fis.read(b))!=-1)//返回读到的数组的中的个数,
  {
//这里调用了String 的构造方法,将字节数组转换成字符串。
   System.out.println(new String(b,0,len));
  }
  fis.close();
}

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 贾联国 于 2012-5-2 21:41 编辑

while ((len=fis.read(b))!=-1)//fis.read(b)返回的值是通过read读入缓冲数组b中的字节数,也就是写到b数组里多少个字节,就返回多少,如果数据只有3个字节就返回3。循环开始时没有数据可写就返回-1. 超过1024字节的数据,将先传1024进入循环,之后再循环将剩下的数据进行打印,所以这里如果直到数据没有不到1024字节的话,可以直接用len=fis.read(b))!=-1;  不用循环。
  {
   System.out.println(new String(b,0,len));//这里打印的是从数组的0指针开始,到写入数组长度的字节数,如果只传了3个字节,就打印数组的前3个数组。
  }

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
如果文件的长度是2050字节,我定义的byte[] b=new byte[1024],当循环完,我要怎么取这个文件的全部内容,我的数组b只能装1024个数值,如果用new String(b,0,len)能全部取到么
回复 使用道具 举报
赵玮_Tom 发表于 2012-5-2 21:30
首先是fis.read(b)这句代码:b代表的是一个1024长度的数组,该代码的意思就是从文件中一个
字节一个字节地 ...

如果文件的长度是2050字节,我定义的byte[] b=new byte[1024],当循环完,我要怎么取这个文件的全部内容,我的数组b只能装1024个数值,如果用new String(b,0,len)能全部取到么
回复 使用道具 举报
魏征 发表于 2012-5-2 21:48
如果文件的长度是2050字节,我定义的byte[] b=new byte[1024],当循环完,我要怎么取这个文件的全部内容 ...

并不是一次就将文件的所有数据存入数组的,要通过循环反复存入。
回复 使用道具 举报
哦明白了,上面自己的问题有点无脑,谢谢楼上的各位这个问题我清楚了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马