【问题标题】:Receive byte[] using ByteArrayInputStream from a socket使用 ByteArrayInputStream 从套接字接收 byte[]
【发布时间】:2012-05-15 14:18:08
【问题描述】:

这是代码,但出现错误:

bin = new ByteArrayInputStream(socket.getInputStream());

是否可以使用ByteArrayInputStream 从套接字接收byte[]

【问题讨论】:

  • "但出现错误:" 出现什么错误?始终将异常和错误输出复制/粘贴到问题中(使用代码标签)。
  • 你的问题没有意义。 ByteArrayInputStream 从字节数组中读取字节。如果要从套接字读取,则无法从字节数组中读取。您想在这里解决什么问题?

标签: java sockets io inputstream bytearrayinputstream


【解决方案1】:

没有。当你有一个字节数组时,你使用ByteArrayInputStream,并且你想从数组中读取,就像它是一个文件一样。如果您只想从套接字读取字节数组,请执行以下操作:

InputStream stream = socket.getInputStream();
byte[] data = new byte[100];
int count = stream.read(data);

变量count将包含实际读取的字节数,数据当然会在数组data中。

【讨论】:

  • “new byte[100]”中数字 100 的意义是什么?我会用 100 分配过多还是分配不足
  • 这是数组的大小,因此是一次读取的最大字节数。您可以使用任何您喜欢的大小,并且可以循环读取,直到到达文件末尾(此时计数将变为 -1。)
  • 感谢@Ernest。这是有道理的
【解决方案2】:

您无法通过直接从套接字读取来获取ByteArrayInputStream 的实例。
您需要先阅读并找到字节内容。
然后使用它来创建ByteArrayInputStream 的实例。

InputStream inputStream = socket.getInputStream();  

// read from the stream  
ByteArrayOutputStream baos = new ByteArrayOutputStream();  
byte[] content = new byte[ 2048 ];  
int bytesRead = -1;  
while( ( bytesRead = inputStream.read( content ) ) != -1 ) {  
    baos.write( content, 0, bytesRead );  
} // while  

现在,由于您手头有 bao,我认为您还不需要 bais 实例。
但是,为了使其完整,
您可以生成字节数组输入流,如下所示

ByteArrayInputStream bais = new ByteArrayInputStream( baos.toByteArray() );  

【讨论】:

    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-02
    相关资源
    最近更新 更多