更新问题(以更清晰):
有没有方法设计下面的输入流,使得BufferedReader#readLine()
在读取新行字符后立即返回?
在下面的示例中,即使读者已经读取了新行,readLine()
会永远挂起,因为(大概是)它正在等待缓冲区填满。理想情况下,readLine()
将在读取新行字符后立即返回。
我知道像我想要的这样的东西是可能的,因为当您使用BufferedReader#readLine()
从System.in
读取时,它不会等待缓冲区填满才返回。
import java.io.*;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class Example {
private static final class MyInputStream extends InputStream {
public final BlockingQueue<String> lines = new LinkedBlockingQueue<>();
private InputStream current = null;
@Override
public int read() throws IOException {
try {
if(current == null || current.available() == 0)
current = new ByteArrayInputStream(lines.take().getBytes("UTF-8"));
return current.read();
}
catch(InterruptedException ex) {
return -1;
}
}
}
public static void main(String[] args) throws Exception {
MyInputStream myin = new MyInputStream();
myin.lines.offer("a line\n");
BufferedReader in = new BufferedReader(new InputStreamReader(myin));
System.out.println(in.readLine());
}
}
此外,如果有更好的方法将字符串发送到InputStream中,我很乐意听取建议。
接受的解决方案:
基于Sotirios Delimanolis在他的解决方案评论中的建议,我只是使用了PipedInputStream。我将其与PipedOutputStream配对,并且只要在发送包含换行符的字符串后调用PipedOutputStream#flush(),BufferedReader#readLine()就会立即返回。