程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA編程入門知識 >> JAVA printWriter中write()和println()區別

JAVA printWriter中write()和println()區別

編輯:JAVA編程入門知識

PrintWriter 的Write()方法和println()方法有何細微的區別?

最近學習JAVA網絡編程,在服務器端和客戶端產生一個Socket 後,

兩邊各自用getIputStream()和getOutputStream()方法,構造各自的輸入輸出流。

其中服務器端的Socket ss

BufferedReader is=new BufferedReader(new InputStreamReader(ss.getInputStream()) );

PrintWriter  os=new PrintWriter (new OutputStreamWriter(ss.getOutputStream()) );

os.writer("一個亂七八糟的字符串");

客戶端的Socket cs

BufferedReader is=new BufferedReader(new InputStreamReader(cs.getInputStream()) );

PrintWriter  os=new PrintWriter (new OutputStreamWriter(cs.getOutputStream()) );

System.out.println(is.readLine());

按理說,應該是ss的 os對應著cs的 is.  為什麼在服務器端寫入了,在客戶端這邊沒法讀出來呢?

另外,如果服務器端用os.println("字符串");就好使了。

請問這是問什麼? 

以下整理了開源中國社區的回答:

  • print() 方法等同於 write() 方法

    println() 方法是在 print() 的基礎上多調用了一個 newLine() 方法(私有方法)

    而 newLine() 方法會調用 flush()

    所以關鍵在於 flush()

  • 補充下,我只是把我出問題的關鍵程序段概括的寫出來了,不要說我沒刷新服務器Socket的輸出流。

    最好有個人能好好解釋解釋有關IO中的輸出流中的writer。以及如何從一個輸出流中提取用write()方法寫入到該流中的字符。

  • 你用PrintWriter,確實就應該調用println()方法,而不是父類集成過來的write方法。因為PrintWriter本身就是用來執行Print操作的。顯然那個write方法是直接繼承了父類的方法,可能子類中沒有重寫或者做了其他操作。

    btw socket通信最好使用DataInputStream和DataOutputStream去封裝讀寫的操作,或者用 ObjectInputStream和ObjectOutputStream,而不要使用你寫的BufferedReader和 BufferedWriter。

  • 關鍵是客戶端是is.readLine(),println是會自動在字符後面加上回車換行符的,或者你在服務端os.writer("一個亂七八糟的字符串\r\n");  
    •  的確是要加上/r /n 有沒有比較詳細的原因? 
  • 查了一下,網上有很多人問這個問題,老外多一下。

    問題主要集中在,為什麼客戶端調用了write()和flush()後,服務器端依然read不到數據。因為 socket.getOutputStream()取到的實現類是java.net.SocketOutputStream,這個類並沒有覆寫flush 方法,它的父類java.io.FileOutputStream也沒有覆寫,於是最終就調到了最頂層java.io.OutputStream的 flush()方法,這就惡心了,這個方法是空的。於是...

    因此,還是使用Reader.readLine()和Writer.println()來處理socket吧,或者直接使用NIO。

    (注意,SocketOutputStream類在JavaDoc中不存在,只在源碼中有,他是個受保護的類。)

  • 光說我的了,lz用的是PrintWriter,自己實現了flush,但也是調用內部包裝的子對象的,且受autoFlush屬性控制,可能跟我的情況不太一樣。但可以確定就是flush和\r\n的問題,可以調試一下代碼看看。
  • print() 方法等同於 write() 方法

    println() 方法是在 print() 的基礎上多調用了一個 newLine() 方法(私有方法)

    而 newLine() 方法會調用 flush()

    所以關鍵在於 flush()

  • 關鍵是客戶端是is.readLine(),println是會自動在字符後面加上回車換行符的,或者你在服務端os.writer("一個亂七八糟的字符串\r\n");  這個根據系統而定。我機器貌似就不支持。 如果一定要用write()的話,就在加一句printWriter.println()即可。因為newLine()方法是私有的,外部無法直接調用  
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved