2011-03-04 101 views
2

我遇到了這個程序,它沒有按照預期的方式工作。Java字符串的奇怪行爲

public class StringTest 
{ 
     public static void main(String[] args) 
     { 
      String s = "Hello world"; 
      for(int i = 0 ; i < s.length() ; i++) 
      { 
       System.out.write(s.charAt(i)); 
      } 
     } 
} 

如果我們認爲它應該打印Hello world,但它不打印任何東西。到底是怎麼回事?有任何想法嗎?提前致謝。

+9

你忘了'flush()'。 – 2011-03-04 21:01:32

回答

12

你想:System.out.print(s.charAt(i));

APIwrite的:

注意,字節寫入給出;要編寫將根據平臺的默認字符編碼進行翻譯的字符,請使用print(char)或println(char)方法。

正如你對問題的評論所指出的,如果你真的想使用write()你需要flush()


爲什麼write(int)沒有打印任何東西的原因是因爲它僅僅刷新上\n流,當autoFlush是真實的。

public void write(int b) { 
    try { 
     synchronized (this) { 
     ensureOpen(); 
     out.write(b); 
     if ((b == '\n') && autoFlush) 
      out.flush(); 
     } 
    } 
    catch (InterruptedIOException x) { 
     Thread.currentThread().interrupt(); 
    } 
    catch (IOException x) { 
     trouble = true; 
    } 
} 
+1

你是對的,但是你沒有解決主要問題:爲什麼用print()打印的字符最終被刷新,而用write()打印的字符不能? – ChrisJ 2011-03-04 21:19:47

+0

@ChrisJ:你說的沒錯。我添加了更多信息。 – Jeremy 2011-03-04 21:30:10

+0

@Jeremy:你添加的東西是正確的,但是如果你看看代碼,print(char)就會調用write(String),它具有與write(int)相同的行爲。所以我仍然沒有得到它... 然後Jonathon回答: @ChrisJ這應該是一個評論,但回答「爲什麼」:系統類初始化出來,像這樣:new PrintStream(new BufferedOutputStream(fdOut ,128),真)。它將autoFlush設置爲true。 – ChrisJ 2011-03-04 22:05:28