我被赋予了创建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()
方法都不会返回!
我该如何解决这个问题?
编辑:我必须使用任何已设置的InputStream System.in。
答案 0 :(得分:1)
创建仅实现InputStream
的自定义int read()
的方法正朝着正确的方向发展,遗憾的是,最终为int read(byte[] b, int off, int len)
调用的继承的BufferedReader.readLine
是尝试填充整个缓冲区,除非已到达流的末尾。
因此,您还必须覆盖此方法,如果没有更多可用字节,则允许更早返回:
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
,如果还没有读完整行。
答案 1 :(得分:0)
使用可以这样写:
Scanner console = new Scanner(System.in);
System.out.println(console.next());
答案 2 :(得分:0)
以下是答案,没有使用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());
答案 3 :(得分:0)
如果提供足够的文本来填充8192字节(默认字符缓冲区大小为BufferedReader
),它将返回。当您致电readLine()
时,它最终会拨打a.read()
。它应该提供至少8192个字节。