【问题标题】:Byte Array through Input Stream [duplicate]通过输入流的字节数组[重复]
【发布时间】:2020-09-27 09:25:46
【问题描述】:

我正在处理文件/图像的客户端-服务器发送和接收。我使用来自 Socket 的输入流。

这是代码

byte[] sizeAr = new byte[4];
int num = inputStream.read();
sizeAr = ByteBuffer.allocate(4).putInt(num).array();
int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();

与此代码相同

byte[] sizeAr = new byte[4];
inputStream.read(sizeAr);
int size = ByteBuffer.wrap(sizeAr).asIntBuffer().get();

【问题讨论】:

  • 不,两者都是错误的。您正在寻找DataInputStream.readInt(),然后是readFully()

标签: java arrays image sockets client-server


【解决方案1】:

此代码 [...] 是否与此代码相同?

没有。


第一个对我来说没有多大意义:

  1. 分配一个 4 字节数组(无缘无故?)
  2. 从流中读取单个字节
  3. 创建一个新的 4 字节缓冲区,
    • 将上一行读取的字节作为int放入缓冲区,
    • 获取缓冲区的后备数组,替换第一行中的数组
  4. 将前一个缓冲区中的数组包装在一个新的字节缓冲区中,
    • 将其转换为 int 缓冲区
    • 从这个缓冲区中获取int,并将这个int分配给size

基本上,这是一种非常复杂且低效的做法

int size = inputStream.read();

我认为这不是你想要的。 :-)

第二个更有意义:

  1. 分配一个 4 字节数组
  2. 从输入流中最多读取4个字节到数组中(注意你应该检查read(byte[])的返回值,要获得读取的字节数,它可能少于数组的大小)
  3. 将数组包装在缓冲区中,
    • 将其转换为 int 缓冲区
    • 以int形式获取值并将其分配给size

此版本会将完整的 32 位 int 值读入size,这可能是您想要的。但是,第 2 步并不安全,因为您可能读取不到 4 个字节。

也许,更好的方法是使用类似的东西:

DataInput dataInput = new DataInputStream(inputStream);
int size = dataInput.readInt(); // Will read exactly 4 bytes or throw EOFException 

【讨论】:

    猜你喜欢
    • 2011-06-21
    • 1970-01-01
    • 2011-05-15
    • 1970-01-01
    • 2023-03-20
    • 2018-07-14
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    相关资源
    最近更新 更多