缓冲读取器不返回



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

相关内容

  • 没有找到相关文章

最新更新