黑马程序员技术交流社区
标题:
多次输入问题
[打印本页]
作者:
ssx0101
时间:
2012-11-15 22:16
标题:
多次输入问题
本帖最后由 曹自祥 于 2012-11-16 13:25 编辑
package pt;
import java.io.IOException;
public class File_3 {
/**
* @param args
*/
public static void main(String[] args) {
byte[]buf=new byte[1024];
for(int i=0;i<3;i++)
{
try {
System.in.read(buf);
} catch (IOException e) {
e.printStackTrace();
}
String s=new String(buf);
System.out.println(s);
}
}
}
复制代码
运行结果:
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