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真的只是一个字节的数据而已......我很困惑:(
提前致谢!
是.例如,字节包装器还允许表示可空字节,或将字节值存储到集合和映射中.
您将文本发送到DataInputStream,并使用您的平台默认编码将此文本编码为字节.假设这是ASCII,第一个字符将因此被编码为一个字节,然后\r和\n发送,这是使用ASCII编码也.因此,您读取的3个字节是char +的ASCII编码值\r\n.
javadoc解释了什么InputStream.read().它读取一个字节,并将其转换为0到255之间的int,以便区分字节-1和-1,这意味着"流的结束".要从返回的int中获取一个字节,请检查它是否为-1(表示流的结尾),并将其强制转换为字节:byte b = (byte) readValue;