黑马程序员技术交流社区

标题: 多次输入问题 [打印本页]

作者: ssx0101    时间: 2012-11-15 22:16
标题: 多次输入问题
本帖最后由 曹自祥 于 2012-11-16 13:25 编辑
  1. package pt;

  2. import java.io.IOException;

  3. public class File_3 {

  4.         /**
  5.          * @param args
  6.          */
  7.         public static void main(String[] args) {
  8.                 byte[]buf=new byte[1024];
  9.                 for(int i=0;i<3;i++)
  10.                 {
  11.                         try {
  12.                                 System.in.read(buf);
  13.                         } catch (IOException e) {
  14.                                 e.printStackTrace();
  15.                         }
  16.                         String s=new String(buf);
  17.                         System.out.println(s);

  18.                 }
  19.         }

  20. }
复制代码
运行结果:
abc def
abc def

abc
abc
ef

def
def
ef
为什么会这样?
作者: 陈莹    时间: 2012-11-15 22:36
首先你定义了一个byte数组,第一次读,abc def,将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。那么数组中就是{a,b,c, ,d,e,f}
第二次读时,也是将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推,也就是说第二次读入的abc覆盖了之前的数据的一部分,但是没有完全覆盖,
你可以测试一下,第一次读入9个字节,第二次读入5个字节,所以把a,b,c, , d都覆盖了。
第三次读入同理。
不知道你明白了没有。你应该把数组定义在for循环里头,这样每次循环就定义一个新的数组,就不会出现你的那种情况了。
作者: 陈莹    时间: 2012-11-15 22:37
首先你定义了一个byte数组,第一次读,abc def,将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推。那么数组中就是{a,b,c, ,d,e,f}
第二次读时,也是将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] 中,依次类推,也就是说第二次读入的abc覆盖了之前的数据的一部分,但是没有完全覆盖,
你可以测试一下,第一次读入9个字节,第二次读入5个字节,所以把a,b,c, , d都覆盖了。
第三次读入同理。
不知道你明白了没有。你应该把数组定义在for循环里头,这样每次循环就定义一个新的数组,就不会出现你的那种情况了。
作者: 程宏志    时间: 2012-11-15 22:39
你的代码不全面,还有你读取的文件是什么,你也没贴出来,你想要什么结果,我们不知道,所以不知该怎么去说明你的问题,我就不好给你解释了!


作者: 陈莹    时间: 2012-11-15 22:53
陈莹 发表于 2012-11-15 22:37
首先你定义了一个byte数组,第一次读,abc def,将读取的第一个字节存储在元素 b[0] 中,下一个存储在 b[1] ...

to古银平我测试了一下,回车换行也就是\r\n占用了两个字节,那么abc\r\n就占用了5个字节,abc空格def\r\n就占9个字节,第二次读入后,就覆盖了第一次读入的前5个字节,所以数组中就变成abc\r\nef\r\n了。明白了吗?

作者: madianguo    时间: 2012-11-16 00:17
本帖最后由 madianguo 于 2012-11-16 02:40 编辑

       byte[]buf=new byte[1024];   
       for(int i=0;i<3;i++)
       {
           System.in.read(buf);      
           String s=new String(buf);   
           System.out.println(s);
        }


一开始你就在在内存空间分配一个长度为1024的数组,但三次循环都用的这一个数组。所以在这个程序没有释放之前数组长度和里面的数据会一直存在。所以才有这么多的空格行。以及多余的字节。   
你把定义数组写在for循环中则每次for循环都重新定义 也不会出现这种错误了。
或者在for循环外定义成byte[] buf = null;    在for循环内定义成 buf = new byte[1024];


//abc def \r \n   这里包括空格9个字节  在缓存区中占就个字节。
//abc  \r \n 这里包括5个字节 ,但缓存区中还有abc def \r \n 数据  导致还有4个多余的字节 ef \r \n 打印在显示器上
//def  \r \n 也是同理。







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2