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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张森 中级黑马   /  2013-1-10 18:58  /  1401 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

try{
FileInputStream fileInput=new FileInputStream(“随便一个文件”);
int data=fileInput.read();
int number=fileInput.available();
System.out.println(number);
while(data!=-1){
System.out.write(data);
data=fileInput.read();
}
    //System.out.println("");
fileInput.close();
}
catch(IOException ioe){
System.err.println("Error"+ioe);
}

问题是每次读出文件内容的时候会读掉最后一行的内容,最奇怪的时候,我在输出内容的While循环后面加上任意一个输出(如注释中的),文件的最后一行又可以正常输出,是怎么回事?

5 个回复

倒序浏览
测试没有问题
回复 使用道具 举报
1.每次写到控制台后,刷新一下。System.out.flush();
2.程序退出前将标准输出流关闭。System.out.close();
3.将要读取的文件最后手动加上回车。
原因:
System.out返回的是PrintStream的一个实例对象,System类在对其初始化时,传入的流是字节流缓冲区,autoFlush为true.
所以写数据时并不是一个一个直接写出到控制台,而是先将数据写到缓冲区。
当调用该流的write方法时,会对\n和autoFlush进行判断,当两者都满足时才会自动对流刷新。

另外,代码还有点小问题。
  1. try
  2.                         {
  3.                                    FileInputStream fileInput=new FileInputStream("随便一个文件");
  4.                                    int data=fileInput.read();                        //此处应赋初值0  int data=0;
  5.                                    int number=fileInput.available();
  6.                                    System.out.println(number);                //上面不改的话,number值比实际文件大小小1字节,这是因为之前调用了一次read方法
  7.        while(data!=-1)                                        //此处改为while((data=fileInput.read())!=-1)
  8.                                           {                               
  9.                                                System.out.write(data);
  10.        data=fileInput.read();                        //此处去掉
  11.                                           }
  12.                                 //System.out.println("");                   
  13.                                   fileInput.close();
  14.                  
  15.                         }
  16.                  catch(IOException ioe)
  17.                  {
  18.                         System.err.println("Error"+ioe);
  19.                  }
复制代码
答的不对的地方还请同学们多批评指正。

回复 使用道具 举报
王晓州 发表于 2013-1-11 04:35
1.每次写到控制台后,刷新一下。System.out.flush();
2.程序退出前将标准输出流关闭。System.out.close();
...

是还没睡 还是睡醒了   我是睡不着啊
回复 使用道具 举报
现在就去睡。
回复 使用道具 举报
王晓州 发表于 2013-1-11 04:43
现在就去睡。

好梦      好觉
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马