public class test { public static void main(String[] args) throws Exception{
// TODO Auto-generated method stub

BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
System.out.println("input x:");
int i = br.read();
System.out.println(i);

System.out.println("input y:");
int j = br.read();
System.out.println(j);

System.out.println("input z:");
int z = br.read();
System.out.println(z);
}}
运行后
sand:90% java test
input x:
我输入
1然后就跳出了下面的内容
49
input y:
10
input z:这是为什么呢?
我希望得到的是输出1
然后再input y:
等待我再次输入到底哪里有问题呢?

解决方案 »

  1.   

    br.read() 得到输入第一位对应的Ascii码. 
    所以, 你输入1得到49
    这里可以用readline()来去的一行的String
    然后再转换为int来使用
      

  2.   

    import java.io.*,public class IOStreamDemo {public void samples() throws IOException {//1. 这是从键盘读入一行数据.返回的是一个字符串
    BufferedReader stdin =new BufferedReader(new InputStreamReader(System.in)),
    System.out.print("Enter a line:"),
    System.out.println(stdin.readLine()),//2. 这是从文件中逐行读入数据BufferedReader in = new BufferedReader(new FileReader("IOStreamDemo.java")),
    String s. s2 = new String(),
    while((s = in.readLine())!= null)
    s2 += s + "
    ",
    in.close(),//3. 这是从一个字符串中逐个读入字节
    StringReader in1 = new StringReader(s2),
    int c,
    while((c = in1.read()) != -1)
    System.out.print((char)c),//4. 这是将一个字符串写入文件
    try {
    BufferedReader in2 = new BufferedReader(new StringReader(s2)),
    PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out"))),
    int lineCount = 1,
    while((s = in2.readLine()) != null )
    out1.println(lineCount++ + ": " + s),
    out1.close(),
    } catch(EOFException e) {
    System.err.println("End of stream"),
    }
    }
    }对于上面的例子.需要说明的有以下几点:1. BufferedReader是Reader的一个子类.它具有缓冲的作用.避免了频繁的从物理设备中读取信息.它有以下两个构造函数:
    BufferedReader(Reader in)
    BufferedReader(Reader in. int sz)这里的sz是指定缓冲区的大小.它的基本方法:
    void close() //关闭流void (int readAheadLimit) //标记当前位置boolean Supported() //是否支持标记int read() //继承自Reader的基本方法int read(char[] cbuf. int off. int len) //继承自Reader的基本方法String readLine() //读取一行内容并以字符串形式返回boolean ready() //判断流是否已经做好读入的准备void reset() //重设到最近的一个标记long skip(long n) //跳过指定个数的字符读取2. InputStreamReader是InputStream和Reader之间的桥梁.由于System.in是字节流.需要用它来包装之后变为字符流供给 BufferedReader使用.3. PrintWriter out1 = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out"))),这句话体现了Java输入输出系统的一个特点.为了达到某个目的.需要包装好几层.首先.输出目的地是文件IODemo.out.所以最内层包装的是FileWriter.建立一个输出文件流.接下来.我们希望这个流是缓冲的.所以用BufferedWriter来包装它以达到目的.最后.我们需要格式化输出结果.于是将PrintWriter包在最外层.
      

  3.   


    import java.io.BufferedReader;
    import java.io.InputStreamReader;
    public class test { /**
     * @param args
     */
    public static void main(String[] args) throws Exception{ 
    // TODO Auto-generated method stub  BufferedReader br=new BufferedReader(new InputStreamReader(System.in)); 
    System.out.println("input x:"); 
    //int i = br.read(); 
    System.out.println(br.read());  System.out.println("input y:"); 
    //int j = br.read(); 
    System.out.println(br.read());  System.out.println("input z:"); 
    int z = br.read(); 
    System.out.println(z); 

    System.out.println("input z:"); 
    int z1 = br.read(); 
    System.out.println(z1); 

    System.out.println("input z:"); 
    int z2 = br.read(); 
    System.out.println(z2); 

    }
    input x:
    a
    97
    input y:
    13
    input z:
    10后面的13 和 10 分别读的是   换行 ('\n')、回车 ('\r') 
      

  4.   

    对 其实你输入后面还有加/n/r的也就是你输入回车也算作字符流 读了进去 我是这样解决的public static int getKey() {
    //接受输入数字 只接受0-4
    int i = -1;
                     //这里你加上你对输入的要求 ascii码的限制
    while (i < 48 || i > 52) {
    try {
    i = System.in.read();
    } catch (IOException e) {
    return -1;
    }
    if ((i < 48 || i > 52) && i != 13 && i != 10)
    System.out.println("输入有误!重新输入!");
    }
    return i - 48;
    }