2016-05-23 5 views
3

System.in.read(byte[])またはSystem.in.read(byte[],int,int)を呼び出さずにコンソールから最初の行を読み取り、返すJavaメソッドを作成するタスクが与えられました。 (System.inは、それらが呼び出された場合IOExceptionをスローするように変更されました。)BufferedReaderが返さない

私はこの解決策を考え出した:どんなに私はconsoleReader.readLine()メソッドが返すことはありませんコンソールに書かれたものは

InputStream a = new InputStream(){ 
    public int read() throws IOException{ 
     return System.in.read(); 
    } 
}; 
BufferedReader consoleReader = new BufferedReader(new InputStreamReader(a)); 
return consoleReader.readLine(); 

! これを修正するにはどうすればよいですか?

編集:InputStream System.inが設定されているものを使用する必要があります。

答えて

1

ストリームの終わりに達した場合を除きだけ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を呼び出します。

0

使用してこの方法のようにそれを書くことができます:ここでは

Scanner console = new Scanner(System.in); 
System.out.println(console.next()); 
+0

このコードでは、NoSuchElementExceptionが "No line found"と表示されます。 – Gergely

+1

確かに私のために正常に動作しています。 コード: 'import java.util.Scanner; パブリッククラスScannerClassTest {パブリック静的無効メイン(文字列[] args){ スキャナコンソール=新しいスキャナ(System.in)。 System.out.println(console.next()); } } ' –

+0

' Scanner'が 'System.in.read(byte []、int、int)'を呼び出すのではなく、私が既に質問に書いているので 'IOException'を投げます。しかし、 'Scanner'は別の' IOException'を投げることはできません。したがって、もしそれを捕まえると 'NoSuchElementException'がスローされます。 – Gergely

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()); 
0

あなたがBufferedReaderのデフォルトのcharバッファのサイズである8192バイトを満たすのに十分なテキストを提供する場合はを返します。 readLine()に電話すると、電話はa.read()になります。少なくとも8192バイトを供給する必要があります。

関連する問題