BufferedReader不会返回

时间:2016-05-23 11:10:25

标签: java stream

我被赋予了创建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。

4 个答案:

答案 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个字节。