Java基础:如何读取控制台输入?如何读取字符?

115 阅读2分钟

今天,运用字节流读取控制台输入在技术上仍是可行的,但这样做需要用到不被赞成的方法,这种做法不值得推荐。Java 2中读取控制台输入的首选方法是字符流,它使程序容易符合国际标准并且易于维护。

注意:Java没有像标准C的函数scanf()或C++输入操作符那样的统一的控制台输入方法。

Java中,控制台输入由从System.in读取数据来完成。为获得属于控制台的字符流,在BufferedReader对象中包装System.in。

BufferedReader 支持缓冲输入流。它最常见的构造函数如下:

BufferedReader(Reader inputReader) 

这里,inputReader是链接被创建的BufferedReader实例的流。Reader是一个抽象类。它的一个具体的子类是InputStreamReader,该子类把字节转换成字符。为获得链接System.in的一个InputStreamReader的对象,用下面的构造函数:

InputStreamReader(InputStream inputStream) 

因为System .in引用了InputStream 类型的对象,它可以用于inputStream。综上所述,下面的一行代码创建了与键盘相连的BufferedReader对象。

BufferedReader br = new BufferedReader(new 
                    InputStreamReader(System.in)); 

当该语句执行后,br是通过System.in生成的链接控制台的字符流。

从BufferedReader读取字符,用read()。我们所用的read()版本如下:

int read( ) throws IOException 

该方法每次执行都从输入流读取一个字符然后以整型返回。当遇到流的末尾时它返回-1。你可以看到,它要引发一个IOException异常。

下面的例子程序演示了read()方法,从控制台读取字符直到用户键入“q”:

// Use a BufferedReader to read characters from the console. 
import java.io.*; 
class BRRead { 
 public static void main(String args[]) 
 throws IOException 
 { 
 char c; 
 BufferedReader br = new 
 BufferedReader(new InputStreamReader(System.in)); 
 System.out.println("Enter characters, 'q' to quit."); 
 // read characters 
 do { 
 c = (char) br.read(); 
 System.out.println(c); 
 } while(c != 'q'); 
 } 
}

下面是程序运行:

Enter characters, 'q' to quit. 
123abcq 
1 
2 
3 
a 
b 
c 
q

程序的输出看起来与预想的略有不同,因为System.in在默认情况下是以行来缓冲的。这意味着在你键入ENTER以前实际上是没有输入的。你能猜想,这不能充分体现交互式控制台输入条件下read()的独特价值。