背景:我有一项任务,我将通过套接字在非常有限的范围内传递信息。它可以是每个消息最多10个字节,我以为我只发送一个字节(因为一个字节足以在协议中发出256个不同的状态)。现在我开始四处寻找有关这方面的信息,我遇到了很多问题。请纠正我的假设错误的地方,如果可以,请回答我的字面问题。
所以有原始数据类型字节(基本上是介于-128和127之间的数字,对吧?)。如果我使用
byte b = 125;
System.out.println(b);
...我得到正确的数字打印到控制台,如果我尝试分配超出限制的值,编译器会抱怨。
然后我们有了类Byte,它显然是从字节数据类型(或API中的int)创建一个Byte对象:
Byte b = new Byte(20);
System.out.println(b);
这也产生了预期的结果,并且20被打印到控制台,如果我尝试使用高于127的数字,编译器会抱怨。
1。数据类型字节和类字节之间有什么区别?是否主要是因为类提供了很多方法,比如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声明为字节或字节无关紧要,结果是相同的,我已经混合了从字节b中获取值,依此类推,但这三行(或更多)是总是结果,我想要的只是输入回到我身边)
基本上我对此有点困惑,但最后,我想要的只是发送这些单个字节的合理方式,当我发送34时,我希望对方收到34,没有别的。
第3。假设我没有使用类Byte,只想在流上发送一个类型字节。所有常规流和读取器似乎都只读取一个int(我假设它们会阻塞,直到它们至少有两个字节的输入,因为我只发送一个)。我是否被迫使用DataInputStream
和 DataOutputStream
我必须在对象字节中包装类型字节还是有其他方法?
所有这一切让我怀疑我是否可以相信一个对象Byte真的只是一个字节的数据而已......我很困惑:(
提前致谢!
答案 0 :(得分:5)
是。例如,字节包装器还允许表示可空字节,或将字节值存储到集合和映射中。
您将文本发送到DataInputStream,并使用您的平台默认编码将此文本编码为字节。假设它是ASCII,因此第一个字符将被编码为一个字节,然后发送\r
和\n
,它们也使用ASCII编码。因此,您读取的3个字节是char + \r\n
的ASCII编码值。
The javadoc解释了InputStream.read()
的作用。它读取一个字节,并将其转换为0到255之间的int,以便区分字节-1和-1,这意味着“流结束”。要从返回的int中获取一个字节,请检查它不是-1(表示流的结尾),并将其强制转换为字节:byte b = (byte) readValue;
答案 1 :(得分:0)
在你的情况下没有必要包装到对象字节,你在处理集合时主要需要字节。
DataOutPutStream很好,使用方法write(int b)
byte b = (byte) 0x03;
DataOutPutStream dos;
// ....
dos.write(b);
答案 2 :(得分:-1)
正如你所说,区别在于Byte是一个字节的包装类。
由于byte
是基元,因此您无法将null
分配给任何byte
变量。
相比之下,Byte
是一个对象,因此您可以指定null
。
所以:
byte primitiveByte = null; // Compiler error
Byte objectByte = null; // works
正如Vulcan所说,Byte被自动装箱到字节,这意味着如果JVM发现它可以使用字节而不是字节对象,它会用字节字符替换出现的字段。