【问题标题】:Input Stream only returning 1 byte输入流仅返回 1 个字节
【发布时间】:2013-12-24 05:04:48
【问题描述】:

我正在使用 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

【问题讨论】:

  • 您在哪里以及如何定义inputStream
  • 如果您期望 11 个字节,您需要继续阅读,直到获得所有 11 个字节。 available() 方法在这里对您没有帮助,您想读入第一个字节 0 而不是 1。然后是 1。然后是 2,然后是 3,等等。

标签: java buffer inputstream java-communication-api


【解决方案1】:

正如documentation 所述

从输入流中读取最多 len 个字节的数据到一个字节数组中。尝试读取多达 len 个字节,但可能会读取较小的数字

这种行为是完全合法的。我还希望 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 个索引处,这是行不通的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-12-06
    • 1970-01-01
    • 1970-01-01
    • 2013-09-13
    • 2011-12-27
    • 1970-01-01
    • 2013-08-28
    相关资源
    最近更新 更多