gpt4 book ai didi

java - 输入流仅返回 1 个字节

转载 作者:行者123 更新时间:2023-12-01 13:44:53 24 4
gpt4 key购买 nike

我正在使用 java comm 库来尝试完成对串行端口的简单读/写。我能够成功写入端口,并捕获来自输入流的返回输入,但是当我从输入流读取时,我只能读取 1 个字节(当我知道应该返回 11 个字节时)

我可以使用 Putty 成功写入端口,并在那里收到正确的返回字符串。我对 Java、缓冲区和串行 I/O 还很陌生,我认为可能有一些明显的语法或对数据如何返回到 InputStream 的理解。有人可以帮助我吗?谢谢!

    case SerialPortEvent.DATA_AVAILABLE:
System.out.println("Data available..");
byte[] readBuffer = new byte[11];
try {
System.out.println("We trying here.");
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer, 1, 11);
System.out.println("Number of bytes read:" + numBytes);

}

System.out.println(new String(readBuffer));

} catch (IOException e) {System.out.println(e);}
break;
}

此代码返回以下输出:

Data available..
We trying here.
Number of bytes read:1
U

最佳答案

作为documentation

Reads up to len bytes of data from the input stream into an array of bytes. An attempt is made to read as many as len bytes, but a smaller number may be read.

这种行为是完全合法的。我还希望 SerialPortEvent.DATA_AVAILABLE 不能保证所有数据可用。它可能只有 1 个字节,但您会收到该事件 11 次。

您可以尝试的事情:

1) 继续阅读,直到读完所有字节。例如。将您的 InputStream 包装到 DataInputStream 中并使用 readFully ,这是解决常规 read 方法行为的最简单方法。如果 InputStream 不再提供任何字节并发出流结束信号,则此操作可能会失败。

DataInputStream din = new DataInputStream(in);
byte[] buffer = new byte[11];
din.readFully(buffer);
// either results in an exception or 11 bytes read

2) 当它们到来时读取它们并将它们附加到某个缓冲区。一旦你拥有了所有这些,就可以将缓冲区的上下文作为结果。

private StringBuilder readBuffer = new StringBuilder();
public void handleDataAvailable(InputStream in) throws IOException {
int value;
// reading just one at a time
while ((value = in.read()) != -1) {
readBuffer.append((char) value);
}
}

一些注意事项:

inputStream.read(readBuffer, 1, 11)

索引从 0 开始,如果您想将 11 个字节读入该缓冲区,则必须指定

inputStream.read(readBuffer, 0, 11)

否则它会尝试将第 11 个字节放在第 12 个索引处,这是行不通的。

关于java - 输入流仅返回 1 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20430800/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com