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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 程宏志 中级黑马   /  2012-8-2 14:50  /  2285 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 程宏志 于 2012-8-2 15:49 编辑

//文件名为Demo.txt,内容为:abcdefg
import java.io.*;
class Test_3
{
public static void main(String[] args) throws IOException
{
  FileReader fr=new FileReader("Demo.txt");
  char[] buf=new char[3];
  int num1=fr.read(buf);//3
  System.out.println("num1="+num1+"...."+new String(buf));//abc
  int num2=fr.read(buf);//3
  System.out.println("num2="+num2+"...."+new String(buf));//def
  int num3=fr.read(buf);//按照视频中讲的num3为读到的字符个数,应该为1和gef,但不知为什么我的运行结果是3和g,
  System.out.println("num3="+num3+"...."+new String(buf));//
  int num4=fr.read(buf);//-1
  System.out.println("num4="+num4+"...."+new String(buf));//gef
  fr.close();
}
}
按照视频中讲的num3为读到的字符个数,那应该为1和gef,但不知为什么我的运行结果是3和g,难道和jdk版本有关吗?请高手帮忙解答?
追问一下,num到底是指读取的字符数组的长度还是读取字符的个数,虽然老师讲的是指后者,但运行程序时,显示的却是前者,好迷惑啊!给小弟弟解惑下,谢谢!

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

6 个回复

倒序浏览
不知道你用的是哪个版本,但是我从1.3-1.6都试过了,没有出现你的这个问题
地下的问题你看下这个例子

  1. public class test {
  2.         public static void main(String[] args) throws IOException {
  3.                 FileReader fr=new FileReader("F:\\Demo.txt");
  4.                   char[] buf=new char[1];
  5.                   System.out.println(new String(buf));
  6.                   int num1=fr.read(buf);//3
  7.                   System.out.println("num1="+num1+"...."+new String(buf));//abc
  8.                   int num2=fr.read(buf);//3
  9.                   System.out.println("num2="+num2+"...."+new String(buf));//def
  10.                   int num3=fr.read(buf);//按照视频中讲的num3为读到的字符个数,应该为1和gef,但不知为什么我的运行结果是3和g,
  11.                   System.out.println("num3="+num3+"...."+new String(buf));//
  12.                   int num4=fr.read(buf);//-1
  13.                   System.out.println("num4="+num4+"...."+new String(buf));//gef
  14.                   int num5=fr.read(buf);//-1
  15.                   System.out.println("num5="+num5+"...."+new String(buf));//gef
  16.                   int num6=fr.read(buf);//-1
  17.                   System.out.println("num6="+num6+"...."+new String(buf));//gef
  18.                   int num7=fr.read(buf);//-1
  19.                   System.out.println("num7="+num7+"...."+new String(buf));//gef
  20.                   int num8=fr.read(buf);//-1
  21.                   System.out.println("num8="+num8+"...."+new String(buf));//gef
  22.                   fr.close();
  23.         }
  24. }
复制代码
结果是
  1. num1=1....a
  2. num2=1....b
  3. num3=1....c
  4. num4=1....d
  5. num5=1....e
  6. num6=1....f
  7. num7=1....g
  8. num8=-1....g
复制代码
再看read方法的说明
  1. The number of characters read, or -1 if the end of the stream has been reached
复制代码
应该知道老师说的是对的了吧
回复 使用道具 举报
你的程序我运行了下,原因是在字符结尾处你输入了一个回车符。占了两个字符,
num是读取字符返回的个数,因为你设置的缓冲区是三个字符大小,所以前两次
数组会装满,当然读取字符的个数就是3了,会返回3.当读到结尾处,返回-1;

评分

参与人数 1技术分 +1 收起 理由
田建 + 1 赞一个!

查看全部评分

回复 使用道具 举报
刘健 发表于 2012-8-2 16:55
不知道你用的是哪个版本,但是我从1.3-1.6都试过了,没有出现你的这个问题
地下的问题你看下这个例子结果是 ...

您的代码我试过,将char[] buf=new char[3]中数组的length由你的1改为3.
正常理解的话:
             在第一次num1应该是num1=3,输出值为abc;
             在第一次num2应该是num2=3,输出值为def;
        但在第三次中的输出时,指针在寻找到g处时,应该停止,因为后面没有遍历到的元素,
        那在这次输出时,fw.read(buf)只读取了一个字符,那么对应的值num3=fw.read(buf)=1;
      但是,我通过你的程序再次验证,所得的结果竟然是3,和之前的一样即是数组buf的length,还是出现了冲突。
         而new String(buf)——》这个是将数组里面的数据全部输出,不存在问题。
回复 使用道具 举报
徐帅 发表于 2012-8-2 17:20
你的程序我运行了下,原因是在字符结尾处你输入了一个回车符。占了两个字符,
num是读取字符返回的个数,因 ...

确实是这样的,问题不在程序上,而在相关连的文本上,谢谢!
回复 使用道具 举报
刘健 发表于 2012-8-2 16:55
不知道你用的是哪个版本,但是我从1.3-1.6都试过了,没有出现你的这个问题
地下的问题你看下这个例子结果是 ...

问题找到了,原因是在相关联的文本的字符后有敲了回车键或是空格键,导致隐形的空字符产生长度!
回复 使用道具 举报
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马