Java 基本数据类型 byte 和 Byte 类

标签 java byte primitive-types datainputstream dataoutputstream

背景:我有一项任务,将在非常有限的范围内通过套接字传递信息。每条消息最多可以有 10 个字节,我想我只发送一个字节(因为一个字节足以表示协议(protocol)中 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。数据类型 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 中还是还有其他方法?

所有这些让我怀疑我是否可以相信一个对象 Byte 实际上只是相当于一个数据字节,仅此而已......我很困惑:(

提前致谢!

最佳答案

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

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

  3. The javadoc解释了 InputStream.read() 的作用。它读取一个字节,并将其转换为 0 到 255 之间的 int,以区分字节 -1 和表示“流结束”的 -1。要从返回的 int 中获取字节,请检查它是否不是 -1(这意味着流结束),并将其转换为字节:byte b = (byte) readValue;

关于Java 基本数据类型 byte 和 Byte 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13671765/

相关文章:

java - 我使用扫描仪遇到的数组错误

java - 创建无符号字节供串行端口使用

c# - 复制字节时出错 - 偏移量和长度超出范围。

java - 在JAVA中将短数组转换为字节数组

java - 为什么Java具有 “String”类型而不是 “string”?

java - 通过以前的 Objective-C 经验理解语法

java - 如何将哈希表向下转换为抽象类对象

java - 如何通过单击菜单项来更改布局?

java - Java如何识别一个位置是否持有原始或引用

Java boolean 数组,只有一个元素