2011-03-20 36 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。

相关问题