我正在读一个java程序,当它通过socket发送消息时,它会在发送之前将String转换为字节数组:
public static void write(String msg, OutputStream out) {
out.write (msg.getBytes("ASCII"));
}
由于我是一名C ++程序员,我不知道在java中这样做有什么好处。谁能告诉我?
答案 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对象,而不仅仅是字符串。