请输入如下代码的输出结果,并解释原因 DataInputStream a = new DataInputStream(System.in);int b = a.readInt();System.out.println(b);当我输入数字12并回车的时候,输出什么呢? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 此回复为自动发出,仅用于显示而已,并无任何其他特殊作用楼主【tteesstt】截止到2008-07-30 08:56:01的历史汇总数据(不包括此帖):发帖的总数量:138 发帖的总分数:8900 每贴平均分数:64 回帖的总数量:95 得分贴总数量:11 回帖的得分率:11% 结贴的总数量:138 结贴的总分数:8900 无满意结贴数:0 无满意结贴分:0 未结的帖子数:0 未结的总分数:0 结贴的百分比:100.00% 结分的百分比:100.00% 无满意结贴率:0.00 % 无满意结分率:0.00 % 敬礼!取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=tteesstt 输出什么没意义.这玩意似乎是拿来进行持久化类的.理由在API DOCS 上面有.读取四个输入字节并返回一个 int 值。设 a 为第一个读取字节,b 为第二个读取字节,c 为第三个读取字节,d 为第四个读取字节。返回的值是: (((a & 0xff) << 24) | ((b & 0xff) << 16) | ((c & 0xff) << 8) | (d & 0xff)) 此方法适用于读取用接口 DataOutput 的 writeInt 方法写入的字节。 肯定不是12,至于多少就要测试过了。因为你输入内容是当作字符串的,所以12会变成3132的十六进制来传递。你读取的是int,就是读取4个字节,而输入的只有两个字节,系统会补上什么应该会和系统有关吧。一般好像是你输入的换行符,windows默认好像是\r\n。那么你获取的int的16进制数应该是31320D0A int readInt()返回此输入流的下四个字节,将它们解释为一个 int。 readInt()会读取4个字节,你输入12后回车,程序读取了字符1(ASCII 49) 字符2(ASCII 50) 回车符(ASCII 13) 换行符(ASCII 10)然后计算((49 << 24) + (50 << 16) + (13 << 8) + (10 << 0))就得到了结果 825363722! 代码:import java.io.DataInputStream;import java.io.IOException;public class Tteesstt { public static void main(String[] args) throws IOException { DataInputStream a = new DataInputStream(System.in); int b = a.readInt(); System.out.println(b); }}输入:12输出:825363722分析:下面是 java.io.DataInputStream.readInt() 方法的源代码: public final int readInt() throws IOException { int ch1 = in.read(); int ch2 = in.read(); int ch3 = in.read(); int ch4 = in.read(); if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException(); return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0)); }其中 in 是包装入此 DataInputStream 的输入流,也就是这里的 System.in,而 readInt 方法里的 in.read() 在代码中也就相当于 System.in.read() 了。剩下的请看下面代码的运行结果:import java.io.IOException;public class Test { public static void main(String[] args) throws IOException { System.out.println("1, 2, \\r, \\n 这四个 Unicode 字符编码值的二进制形式如下:"); System.out.printf("%1$32s\n", Integer.toBinaryString((int)'1')); System.out.printf("%1$32s\n", Integer.toBinaryString((int)'2')); System.out.printf("%1$32s\n", Integer.toBinaryString((int)'\r')); System.out.printf("%1$32s\n", Integer.toBinaryString((int)'\n')); System.out.println(); System.out.println("请输入 12 然后回车:"); int a = System.in.read(); int b = System.in.read(); int c = System.in.read(); int d = System.in.read(); System.out.println("虽然感觉上我们只输入了两个字符 1 和 2,但实际上在这之后"); System.out.println("还有两个字符即回车符 \\r 和换行符 \\n 也一同被输入进去了。"); System.out.println("所以实际上一共输入了 4 个字符,其 Unicode 编码值的二进制形式如下:"); System.out.printf("%1$32s\n", Integer.toBinaryString(a)); System.out.printf("%1$32s\n", Integer.toBinaryString(b)); System.out.printf("%1$32s\n", Integer.toBinaryString(c)); System.out.printf("%1$32s\n", Integer.toBinaryString(d)); System.out.println(); System.out.println("剩下的就简单了,此源代码中的 4 次 System.in.read() 每次会"); System.out.println("将一个字符 16 位编码值的低 8 位当作一个字节,前面补上 24 个 0 后凑够 32 位后"); System.out.println("被当作一个 int 类型的值返回出来,所以上面四次 read() 读出的是 4 个字符低 8 位的二进制信息。"); System.out.println("而楼主代码的输出结果是 825363722,它的二进制形式为:"); System.out.println(); System.out.printf("%1$32s\n", Integer.toBinaryString(825363722)); System.out.println(); System.out.println("这恰好是在 DataInputStream.readInt() 中将这 4 个字节数据拼成一个完整的 32 位整数的结果。"); }} 肯定不是12,因为采用的是流的方式进行输入,当写入12写进流的时候将12转换为二进制数据,利用readInt进行读取的时候读前四个字节,12只有两个字节,故回车也被读出。 定义对象问题 Java for循环 帮忙 输入血型,返回用户性格,遇到AB血型,char不能识别怎么办? Java声音控制控件 养成JAVA编写好习惯,小心被忽悠 关于Java的传值问题,个人感觉书上说的都不好,请进来听听我的看法。 有关Instanceof的问题,请指教! 根本不会JAVA的人提出的问题,请赐教 我的C盘已损坏,怎么才能恢复呢? Java中的this 关键字的问题 父窗体点击菜单弹出输入对话框,然后父窗体等待输入窗体的响应,如输入窗体录入数据并确认,返回父窗体一个字符串,怎么做? 如何把string数组类型转换成int类型
楼主【tteesstt】截止到2008-07-30 08:56:01的历史汇总数据(不包括此帖):
发帖的总数量:138 发帖的总分数:8900 每贴平均分数:64
回帖的总数量:95 得分贴总数量:11 回帖的得分率:11%
结贴的总数量:138 结贴的总分数:8900
无满意结贴数:0 无满意结贴分:0
未结的帖子数:0 未结的总分数:0
结贴的百分比:100.00% 结分的百分比:100.00%
无满意结贴率:0.00 % 无满意结分率:0.00 %
敬礼!
取消马甲机器人,请点这里:http://www.java2000.net/mycsdn/robotStop.jsp?usern=tteesstt
理由在API DOCS 上面有.读取四个输入字节并返回一个 int 值。设 a 为第一个读取字节,b 为第二个读取字节,c 为第三个读取字节,d 为第四个读取字节。返回的值是:
(((a & 0xff) << 24) | ((b & 0xff) << 16) |
((c & 0xff) << 8) | (d & 0xff))
此方法适用于读取用接口 DataOutput 的 writeInt 方法写入的字节。
因为你输入内容是当作字符串的,所以12会变成3132的十六进制来传递。你读取的是int,就是读取4个字节,而输入的只有两个字节,系统会补上什么应该会和系统有关吧。一般好像是你输入的换行符,windows默认好像是\r\n。
那么你获取的int的16进制数应该是31320D0A
返回此输入流的下四个字节,将它们解释为一个 int。
然后计算((49 << 24) + (50 << 16) + (13 << 8) + (10 << 0))就得到了结果 825363722!
import java.io.IOException;public class Tteesstt { public static void main(String[] args) throws IOException {
DataInputStream a = new DataInputStream(System.in);
int b = a.readInt();
System.out.println(b);
}}输入:12输出:825363722分析:下面是 java.io.DataInputStream.readInt() 方法的源代码: public final int readInt() throws IOException {
int ch1 = in.read();
int ch2 = in.read();
int ch3 = in.read();
int ch4 = in.read();
if ((ch1 | ch2 | ch3 | ch4) < 0) throw new EOFException();
return ((ch1 << 24) + (ch2 << 16) + (ch3 << 8) + (ch4 << 0));
}其中 in 是包装入此 DataInputStream 的输入流,也就是这里的 System.in,而 readInt 方法里的 in.read() 在代码中也就相当于 System.in.read() 了。剩下的请看下面代码的运行结果:import java.io.IOException;public class Test { public static void main(String[] args) throws IOException {
System.out.println("1, 2, \\r, \\n 这四个 Unicode 字符编码值的二进制形式如下:");
System.out.printf("%1$32s\n", Integer.toBinaryString((int)'1'));
System.out.printf("%1$32s\n", Integer.toBinaryString((int)'2'));
System.out.printf("%1$32s\n", Integer.toBinaryString((int)'\r'));
System.out.printf("%1$32s\n", Integer.toBinaryString((int)'\n'));
System.out.println();
System.out.println("请输入 12 然后回车:");
int a = System.in.read();
int b = System.in.read();
int c = System.in.read();
int d = System.in.read();
System.out.println("虽然感觉上我们只输入了两个字符 1 和 2,但实际上在这之后");
System.out.println("还有两个字符即回车符 \\r 和换行符 \\n 也一同被输入进去了。");
System.out.println("所以实际上一共输入了 4 个字符,其 Unicode 编码值的二进制形式如下:");
System.out.printf("%1$32s\n", Integer.toBinaryString(a));
System.out.printf("%1$32s\n", Integer.toBinaryString(b));
System.out.printf("%1$32s\n", Integer.toBinaryString(c));
System.out.printf("%1$32s\n", Integer.toBinaryString(d));
System.out.println();
System.out.println("剩下的就简单了,此源代码中的 4 次 System.in.read() 每次会");
System.out.println("将一个字符 16 位编码值的低 8 位当作一个字节,前面补上 24 个 0 后凑够 32 位后");
System.out.println("被当作一个 int 类型的值返回出来,所以上面四次 read() 读出的是 4 个字符低 8 位的二进制信息。");
System.out.println("而楼主代码的输出结果是 825363722,它的二进制形式为:");
System.out.println();
System.out.printf("%1$32s\n", Integer.toBinaryString(825363722));
System.out.println();
System.out.println("这恰好是在 DataInputStream.readInt() 中将这 4 个字节数据拼成一个完整的 32 位整数的结果。");
}}