为什么在发送之前将String转换为字节数组?

时间:2011-03-20 21:47:06

标签: java string bytearray

我正在读一个java程序,当它通过socket发送消息时,它会在发送之前将String转换为字节数组:

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

由于我是一名C ++程序员,我不知道在java中这样做有什么好处。谁能告诉我?

5 个答案:

答案 0 :(得分:2)

Java的字符串类型是Unicode:字符串是一系列字符(实际上是“代码点”)而不是字节。为了通过网络正确发送,您需要对这些代码点(其中大约有一百万个)如何表示为字节有一些约定。但是,如果您碰巧知道您的字符串完全是ASCII,那么您可以采用简单的方法,如您发布的代码所示,假设所有代码点都适合单个字节。

答案 1 :(得分:1)

因为Socket被设计为使用OutputStream在其中写入字节。 OutputStream的JavaDoc声明:

  

输出流接受输出字节   并将它们发送到一些水槽。

与C ++不同,String以UTF-16格式表示,是一系列字符java.lang.CharSequence,而不仅仅是一个ASCII字符数组(如C ++)。从此以后,为什么必须将String编码为您想要的编码(在您的实例中为ASCII)。

答案 2 :(得分:0)

在Java中,字符串始终是内部Unicode。因此,你不能直接将字符串写入二进制流而不对其进行编码(至少在理论上),因为没有“本地”表示,如 8bit ascii-and-whatever “chars”in其他语言。

答案 3 :(得分:0)

因为套接字(在系统级别)以字节为单位。这在C或C ++或使用系统套接字库的任何其他内容中都是相同的。

但是,在Java中,您可以抽象出来,例如:

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

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

答案 4 :(得分:0)

您可以直接将字符串写入Stream,但必须使用称为ObjectOutputStream的特殊类型的“过滤”流。

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

当然,使用它,字符串的格式不像字节数组,而是使用只有ObjectInputStream应该知道的专有格式。此Stream类型可用于编写任何可选的Serializable对象,而不仅仅是字符串。