我被赋予了一个创建java方法的任务,该方法从控制台读取并返回第一行,而无需调用System.in.read(byte[])
或System.in.read(byte[],int,int)
。(System.in
已被修改为在调用它们时引发IOException
。
我想出了这个解决方案:
InputStream a = new InputStream(){
public int read() throws IOException{
return System.in.read();
}
};
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(a));
return consoleReader.readLine();
无论我在控制台中写入什么内容,consoleReader.readLine()
方法都不会返回!我该如何解决这个问题?
编辑:我必须使用 System.in 设置的任何输入流。
创建仅实现int read()
的自定义InputStream
的方法正朝着正确的方向发展,不幸的是,最终为 BufferedReader.readLine
调用的继承int read(byte[] b, int off, int len)
正在尝试填充整个缓冲区,除非已到达流的末尾。
因此,您还必须重写此方法,如果没有更多可用字节,则允许更早返回:
InputStream a = new InputStream(){
@Override
public int read() throws IOException {
return System.in.read();
}
@Override
public int read(byte[] b, int off, int len) throws IOException {
int r=0;
do {
int x=read();
if(x<0) return r==0? -1: r;
b[off++]=(byte)x;
r++;
} while(r<len && System.in.available()>0);
return r;
}
};
BufferedReader reader = new BufferedReader(new InputStreamReader(a));
return reader.readLine();
请注意,这遵循在每个读取操作中至少读取一个字符的约定(除非已到达流的末尾)。这是其他 I/O 类所期望的,如果尚未读取完整的行,BufferedReader
将再次调用read
。
Use 可以这样写:
Scanner console = new Scanner(System.in);
System.out.println(console.next());
这是答案,没有使用 System.in。
// using Console
Console console = System.console();
if (console == null) {
System.out.println("No console: not in interactive mode!");
System.exit(0);
}
System.out.print(console.readLine());
如果您提供足够的文本来填充 8192 字节(默认字符缓冲区大小为 BufferedReader
),它将返回。当你调用readLine()
时,它最终会调用a.read()
。它应至少提供 8192 字节。