背景:我有一个任务,我将在非常有限的范围内通过套接字传递信息。每条消息最多可以有 10 个字节,我想我只发送一个字节(因为一个字节足以在协议中发出 256 个不同状态的信号)。现在我开始四处寻找有关此的信息,并且遇到了很多问题。如果可以的话,请纠正我的假设错误并回答我的字面问题。
所以有原始数据类型字节(基本上是介于 -128 和 127 之间的数字,对吗?)。如果我使用
byte b = 125;
System.out.println(b);
...我将正确的数字打印到控制台,如果我尝试分配超出限制的值,编译器会抱怨。
然后我们有 Byte 类,它显然是从 byte 数据类型(或 API 中所说的 int )创建一个 Byte 对象:
Byte b = new Byte(20);
System.out.println(b);
这也会产生预期的结果,并且 20 会打印到控制台,如果我尝试使用高于 127 的数字,编译器会抱怨。
1.数据类型byte和类Byte有什么区别?是否主要是因为该类提供了很多方法,例如 Integer 类为 int 类型提供的方法?
下一个片段会产生奇怪的结果(对我来说):
import java.io.*;
public class ByteTest {
public static void main(String[] args) {
DataInputStream in = new DataInputStream(System.in);
try {
byte d;
while((d = in.readByte()) != 0) {
System.out.println(d);
}
}
catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
}
2. 读取输入,然后输出将输入解释为十进制形式的 ASCII 字符(例如,1 返回 49),然后是数字 13 和 10 的另外两行。这是为什么?
(如果我将 d 声明为 Byte 或 byte 都没有关系,结果是相同的,我已经混合使用从 Byte b 获取值等等,但是这三行(或更多)始终是结果我想要的只是输入马上回到我身上)
基本上我对此有点困惑,但最后,我想要的只是发送这些单个字节的合理方式,当我发送 34 时,我希望对方接收 34,仅此而已。
3. 假设我不使用 Byte 类,只想通过流发送类型字节。所有常规流和阅读器似乎都只读取一个 int (我假设这意味着它们将阻塞,直到它们具有至少两个字节的输入,而我只会发送一个字节)。我是否被迫使用DataInputStream
以及 DataOutputStream
必须将类型字节包装在对象字节中的位置,还是有其他方法?
所有这一切都让我怀疑我是否可以相信一个对象 Byte 真的只是相当于一个数据字节,仅此而已......我很困惑 :(
提前致谢!