2

背景:我有一个任务,我将在非常有限的范围内通过套接字传递信息。每条消息最多可以有 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 真的只是相当于一个数据字节,仅此而已......我很困惑 :(

提前致谢!

4

3 回答 3

5
  1. 是的。例如,字节包装器还允许表示一个可为空的字节,或将字节值存储到集合和映射中。

  2. 您将文本发送到 DataInputStream,然后使用您的平台默认编码将此文本编码为字节。假设它是 ASCII,那么第一个字符将因此被编码为一个字节,然后\r\n发送,这也是使用 ASCII 编码的。因此,您读取的 3 个字节是 char + 的 ASCII 编码值\r\n

  3. The javadoc explains what InputStream.read() does. It reads one byte, and converts it to an int between 0 and 255, in order to distinguish between the byte -1 and the -1 which means "end of stream". To get a byte from the returned int, check it isn't -1 (which means end of stream), and cast it to a byte: byte b = (byte) readValue;

于 2012-12-02T17:36:12.053 回答
0

There is no need to wrap to object Byte in your case, you mainly need Byte when working with collections.

DataOutPutStream is fine, use method write(int b)

byte b = (byte) 0x03;
DataOutPutStream dos;
// ....
dos.write(b);
于 2012-12-02T17:37:10.310 回答
-1

正如您所说,不同之处在于 Byte 是字节的包装类。作为byte原语,您不能null对任何byte变量进行赋值。相反,Byte是一个对象,所以你可以赋值null

所以:

byte primitiveByte = null; // Compiler error
Byte objectByte = null; // works

正如 Vulcan 所说,Byte 被自动装箱为 byte,这意味着如果 JVM 看到它可以使用 byte 而不是 Byte 对象,它会用 byte 原语替换出现。

于 2012-12-02T17:35:23.787 回答