【问题标题】:Java stream reader blocks until end-of-streamJava 流读取器阻塞直到流结束
【发布时间】:2019-01-25 03:39:54
【问题描述】:

基本上,我已经为自己编写了一些 InputStream(作为 System.in 进一步使用),它接受并使用 Swing 组件加载的缓冲区。

注意:为了调试目的插入了打印语句。

read() 方法:

@Override
public int read() {
    System.out.print("[READ] Querying buffer... ");
    while(this.buffer.isEmpty());
    int val = buffer.poll(); // Consumes the first element
    System.out.format("done - 0x%x\n",  val);
    return val;
}

从流 WORKS 中读取原始字节:

InputStream input = new TestStream();
int chunk = 0;
while(chunk != '\n') {
    chunk = input.read();
    System.out.format("Byte: 0x%x", chunk);
}
input.close();

输出:

[Read] Querying buffer... done - 0x4c
Byte: 0x4c
...
Byte: 0x a

0x a 是 NL 字符(是的,我在类似 Unix 的系统上)

它输出消耗的字符,因为流被提供了额外的数据,并且在没有时阻塞。

但这不起作用:

InputStream input = new TestStream();
Scanner scn = new Scanner(input);
System.out.println("Line: " + scn.nextLine());
scn.close();
input.close();

这种方法只是消耗输入流中的所有可用数据,并阻塞直到到达流的末尾( read() 返回 -1 )。要么似乎完全忽略了流中的 NL 字符,要么 NL 以错误的方式插入缓冲区(我非常怀疑是后者)

如果出现问题,您认为原因是什么?

【问题讨论】:

  • 扫描仪不使用read() 方法。它使用read(byte[]),你重写了吗?
  • 不,我没有。我假设它由底层实现正确处理。愚弄我的昨天。我现在明白了。非常感谢。您绝对可以将其发布为答案。
  • 对不起,我之前的说法是错误的。你不需要实现read(byte[])。能不能把TestStream()的代码加进去
  • 我目前无法使用我的开发机器,但我可以在可以访问它时将其发布在这里。但是,我可以发布我记得的内容。但是您的陈述似乎合乎逻辑(可能不是read(byte[]),而是read(byte[], int, int),因为它更通用),我将尝试在我的测试环境中对其进行测试。同时,最好将您的初始评论发布为值得的答案,因为它可能对未来的人们有所帮助。

标签: java buffer java.util.scanner inputstream


【解决方案1】:

k5_已经在评论中指出了答案:

扫描仪不使用read() 方法。它使用read(byte[]),你重写了吗?

但没有将其重写为答案,所以我这样做了。所有功劳归于他。

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 2012-10-19
    • 2017-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2012-08-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多