【发布时间】: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