2011-03-20 31 views
0

我讀一個Java程序,當它通過socket發送消息,其跳投字符串轉換爲字節數組發出前:爲什麼在發送之前將字符串轉換爲字節?

public static void write(String msg, OutputStream out) { 
    out.write (msg.getBytes("ASCII")); 
} 

因爲我是一個C++程序員,我不知道什麼是優勢在java中這樣做。誰能告訴我?

回答

2

Java的字符串類型是Unicode:字符串是一串字符(實際上是「代碼點」)而不是字節。爲了通過網絡正確地發送,你需要有一些約定來說明這些代碼點(其中大約一百萬個代碼點)是如何表示爲字節的。但是如果您碰巧知道您的字符串完全是ASCII,那麼您可以採用簡單的方法,如您發佈的代碼所示,假設所有代碼點都適合單個字節。

0

在Java中,字符串總是在內部是Unicode的。因此,如果沒有對其進行編碼(至少在理論上),則不能直接將字符串寫入二進制流,因爲在其他語言中沒有「原生」表示,如 8位ascii-and-whatever「chars」。

0

因爲套接字(在系統級)處理字節。這在C或C++或使用系統套接字庫的其他任何東西中都是一樣的。

但是在Java中,你可以是抽象掉,例如:

BufferedWriter out = 
    new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream())); 

的BufferedWriter包括write(String s, int off, int len)方法。

1

由於Socket被設計爲使用OutputStream在其中寫入字節。 OutputStream的JavaDoc狀態:

輸出流接受輸出字節 並將它們發送到某個接收器。

與C++,字符串在UTF-16格式被表示和是字符java.lang.CharSequence的序列,並且不只是的ASCII字符(如C++)的陣列。從今以後,爲什麼需要將字符串編碼爲您想要的編碼(在您的實例中爲ASCII)。

+0

C++完全可以使用Unicode字符串。事實上Java有String/CharSequence與C++ char *有點不相干。這個問題是關於字符編碼和從字符轉換爲字節的 - 如果您使用Unicode字符串類型,則也存在於C++中的問題。 – dty 2011-03-20 22:04:59

0

您可以直接將字符串寫入Stream,但必須使用稱爲ObjectOutputStream的特殊類型的「過濾」流。

ObjectOutputStream oos = new ObjectOutputStream(outputStream); 
oos.writeObject("Foo"); 

當然,使用此字符串的格式不像字節數組,但使用專有格式,只有ObjectInputStream應該知道。這個Stream類型可以用來編寫任意的Serializable對象,而不僅僅是Strings。

相關問題