【问题标题】:Java BufferedReader not reporting ready when it contains ">"Java BufferedReader 在包含“>”时未报告就绪
【发布时间】:2010-07-14 00:18:22
【问题描述】:

我之前尝试过问这个问题,但我的问题并不清楚。 Java BufferedReader action on character?

这是我的问题。我有一个 BufferedReader 设置为从设备读取。它读得很好。我把它设置为

if (Status.reader.ready()) {
    Lines = Status.reader.readLine();
}
if (Lines.contains(">")) {
    log.level1("ready to send data")
}

在我向设备发送更多数据之前,缓冲阅读器不会报告>。问题是当阅读器包含> 时,它还没有准备好报告。它会保留>,直到我输入更多数据。

我尝试了以下方法,但它什么也没返回。它甚至不返回 log.level0()

Lines = ""

try {
    Lines = Status.reader.readLine();
} catch (IOException e) {
    Log.level0("Attempted to read blank line");
}

这是发送的实际数据:

^M^M01 02 F3^M00 01 F3 3E^M>

但 BufferedReader 会忽略 >,直到发送了更多数据然后得到如下结果:

>0102

当我从命令提示符检查设备的实际数据时,它会返回我所期望的,> 存在。

BufferedReader 不会给我>。有什么方法可以检查这个字符吗?

【问题讨论】:

    标签: java bufferedreader


    【解决方案1】:

    BufferedReader.readLine() 方法一次读取一行数据。也就是说,它将尝试读取字符,直到它看到一个行尾序列(例如“\n”、“\r”或“\r\n”)或流的结尾。

    如果您的输入数据不是面向行的,那么您不应该使用readLine() 来读取它。我建议你自己做记录/消息提取;例如

    BufferedReader br = ...
    StringBuilder sb = new StringBuilder(...);
    int ch = br.read();
    while (ch != -1 && ch != '>') {
        sb.append((char) ch);
        ch = br.read();
    }
    String record = sb.toString();
    

    【讨论】:

    • 这是一个很长的添加对象的过程。最终的代码最终从原来的样子变成了一个带有 (char)lines.read(); 的 while 循环
    • @Adam Outler - 我不明白你在说什么,或者它与我的回答有什么关系。
    【解决方案2】:

    检查这个: http://download.oracle.com/docs/cd/E17476_01/javase/1.5.0/docs/api/java/io/BufferedReader.html

    我建议您改用函数public int read()。

    在谷歌你可以找到很多例子1

    【讨论】:

      【解决方案3】:

      有了这些 F3,在我看来,您的数据甚至不是面向字符的,更不用说面向行了。您的设备真的符合 Unicode 标准吗?

      我会使用 BufferedInputStream。

      【讨论】:

      • 它使用 ^M 分隔符传输十六进制数据。然后它使用 > 请求数据。它是整数数据。
      • 没错,所以您根本不应该使用阅读器。见上文。
      • 不,它工作正常。我只需要使用 read 而不是 readline。它是面向性格的。它非常面向字符。通过 (char) read() 传递数据;效果很好,并将我的分隔符更改为 \r 而不是原始的 ^M
      • 十六进制是一种显示字符的方式。
      • 这个答案没有抓住重点。设备无需符合 Unicode 即可生成可以在 Java 中读取为字符的数据。只需使用提供显式 encoding 参数的 InputStreamReader 来指定流的字符编码。
      猜你喜欢
      • 1970-01-01
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-17
      • 2021-08-12
      • 2022-12-03
      相关资源
      最近更新 更多