我读一个Java程序,当它通过socket发送消息,其跳投字符串转换为字节数组发出前:为什么在发送之前将字符串转换为字节?
public static void write(String msg, OutputStream out) {
out.write (msg.getBytes("ASCII"));
}
因为我是一个C++程序员,我不知道什么是优势在java中这样做。谁能告诉我?
我读一个Java程序,当它通过socket发送消息,其跳投字符串转换为字节数组发出前:为什么在发送之前将字符串转换为字节?
public static void write(String msg, OutputStream out) {
out.write (msg.getBytes("ASCII"));
}
因为我是一个C++程序员,我不知道什么是优势在java中这样做。谁能告诉我?
Java的字符串类型是Unicode:字符串是一串字符(实际上是“代码点”)而不是字节。为了通过网络正确地发送,你需要有一些约定来说明这些代码点(其中大约一百万个代码点)是如何表示为字节的。但是如果您碰巧知道您的字符串完全是ASCII,那么您可以采用简单的方法,如您发布的代码所示,假设所有代码点都适合单个字节。
在Java中,字符串总是在内部是Unicode的。因此,如果没有对其进行编码(至少在理论上),则不能直接将字符串写入二进制流,因为在其他语言中没有“原生”表示,如 8位ascii-and-whatever“chars”。
因为套接字(在系统级)处理字节。这在C或C++或使用系统套接字库的其他任何东西中都是一样的。
但是在Java中,你可以是抽象掉,例如:
BufferedWriter out =
new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
的BufferedWriter包括write(String s, int off, int len)
方法。
由于Socket被设计为使用OutputStream
在其中写入字节。 OutputStream的JavaDoc状态:
输出流接受输出字节 并将它们发送到某个接收器。
与C++,字符串在UTF-16格式被表示和是字符java.lang.CharSequence
的序列,并且不只是的ASCII字符(如C++)的阵列。从今以后,为什么需要将字符串编码为您想要的编码(在您的实例中为ASCII)。
您可以直接将字符串写入Stream,但必须使用称为ObjectOutputStream的特殊类型的“过滤”流。
ObjectOutputStream oos = new ObjectOutputStream(outputStream);
oos.writeObject("Foo");
当然,使用此字符串的格式不像字节数组,但使用专有格式,只有ObjectInputStream应该知道。这个Stream类型可以用来编写任意的Serializable对象,而不仅仅是Strings。
C++完全可以使用Unicode字符串。事实上Java有String/CharSequence与C++ char *有点不相干。这个问题是关于字符编码和从字符转换为字节的 - 如果您使用Unicode字符串类型,则也存在于C++中的问题。 – dty 2011-03-20 22:04:59