2016-11-24 43 views
0

我有一個代碼不能按預期工作,它必須使用System.in.read()方法做些事情。程序是指從控制檯讀取直到我按下「C」或「C」一個簡單的java程序輸出不如預期的IO

import java.io.*; 

public class Input{ 
    public static void main(String args[])throws IOException{ 
     char b; 

     outer: 
     do{ 
      b= (char)System.in.read(); 
      System.out.println(b); 
      if(b=='c'||b=='C'){ 
       break outer; 
      } 
     } while(true);  
    } 
} 

輸出是

D:\ex\1>java Input 
d 
d 



c 
c 

D:\ex\1> 

爲什麼是在輸出有空行

+0

因爲你按在一行的末尾輸入? – Jens

+0

您還打印換行和回車。這些都不可見在控制檯 – XtremeBaumer

+0

是輸入值後我按下回車鍵。但如何更改代碼,所以不會出現空行 – Chinna

回答

0

只需更換System.out.println(b);

int a = (int) b; 
if (a != 13 && a != 10) { 
    System.out.println(b); 
} 

它不會打印字符,如果它的整數值是換行和回車

+0

s它的工作,謝謝 – Chinna

2

當你調用read第一次,它讀取'd'並用一個新行打印出來(因爲你使用println代替print)。這解釋了第一條新線。在循環的第一次迭代之後,再次調用read。這一次,它讀取回車符'\r'。第三次調用read時,它讀取新行字符'\n'。這就是爲什麼有3條新線。

這些新行字符從哪裏來?

每次你輸入一個字符,你按「輸入」吧?這是新的路線!由於您使用Windows,因此會插入\r\n。在我的Mac上,一條新線只是\n。這就是爲什麼你的代碼在我的Mac上運行時產生2而不是3個新行。

的解決方案是不讀新線:

do{ 
    b= (char)System.in.read(); 
    if (b == '\r' || b == '\n') continue; 
    System.out.println(b); 
     if(b=='c'||b=='C'){break outer;} 

}while(true); 

或者你可以使用一個Scanner

char b; 
Scanner sc = new Scanner(System.in); 
outer: 
do{ 
    b= sc.findWithinHorizon(".", 0).charAt(0); 
    System.out.println(b); 
    if(b=='c'||b=='C'){break outer;} 

}while(true); 
+0

我真的建議使用掃描儀或其他基於字符的解決方案。解釋字節流總是意味着你需要處理字符編碼。因爲這是屁股疼痛,你真的想要別人照顧它。使用掃描儀,你可以傳入_charsetName_你想把輸入視爲。 – Alexander