Java原始数据类型字节和类Byte

fas*_*xes 1 java byte dataoutputstream primitive-types datainputstream

背景:我有一个任务,我将通过套接字传递信息到非常有限的程度.它可以是每个消息最多10个字节,我以为我只发送一个字节(因为一个字节足以在协议中发出256个不同的状态).现在我开始四处寻找有关这方面的信息,我遇到了很多问题.如果可以的话,请纠正我的假设错误并回答我的字面问题.

所以有原始数据类型字节(基本上是介于-128和127之间的数字,对吧?).如果我使用

byte b = 125;
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

...我得到正确的数字打印到控制台,如果我尝试分配超出限制的值,编译器会抱怨.

然后我们有类Byte,它显然是从字节数据类型(或API中的int)创建一个Byte对象:

Byte b = new Byte(20);
System.out.println(b);
Run Code Online (Sandbox Code Playgroud)

这也产生了预期的结果,并且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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

2.输入被读取和输出将输入解释为十进制形式的ASCII字符(例如,1返回49),接着是另外两行,数字为13和10.这是为什么?

(如果我将d声明为字节或字节无关紧要,结果是相同的,我已经混合了从字节b获取值,依此类推,但这三行(或更多)始终是结果而我想要的只是输入回到我身边)

基本上我对此有点困惑,但最后,我想要的只是发送这些单个字节的合理方式,当我发送34时,我希望对方收到34,没有别的.

3.假设我没有使用类Byte,只想在流上发送一个类型字节.所有常规流和读取器似乎都只读取一个int(我假设它们会阻塞,直到它们至少有两个字节的输入,因为我只发送一个).我是否被迫使用DataInputStream并且 DataOutputStream我必须在对象字节中包装类型字节或者还有其他方法吗?

所有这一切让我怀疑我是否可以相信一个对象Byte真的只是一个字节的数据而已......我很困惑:(

提前致谢!

JB *_*zet 5

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

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

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