Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ajax/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在发送前将字符串转换为字节数组?_Java_String_Bytearray - Fatal编程技术网

Java 为什么在发送前将字符串转换为字节数组?

Java 为什么在发送前将字符串转换为字节数组?,java,string,bytearray,Java,String,Bytearray,我正在读一个java程序,当它通过套接字发送消息时,总是先将字符串转换为字节数组,然后再发送: public static void write(String msg, OutputStream out) { out.write (msg.getBytes("ASCII")); } 因为我是C++程序员,我不知道java的优势是什么。有人能告诉我吗?Java的字符串类型是Unicode:字符串是字符序列(实际上是“代码点”)而不是字节序列。为了在网络上正确发送,您需要对如何将这些代码

我正在读一个java程序,当它通过套接字发送消息时,总是先将字符串转换为字节数组,然后再发送:

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

<>因为我是C++程序员,我不知道java的优势是什么。有人能告诉我吗?

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

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

在Java中,字符串在内部始终是Unicode。因此,如果不对字符串进行编码(至少在理论上),就无法直接将字符串写入二进制流,因为在其他语言中,没有像8位ascii和任何“字符”这样的“本机”表示形式。

在Java中,字符串在内部始终是Unicode。因此,如果不对字符串进行编码(至少在理论上),就无法直接将字符串写入二进制流,因为在其他语言中没有“本机”表示形式,如8位ascii和任何“字符”。

因为套接字(在系统级)以字节为单位处理。在C或C++中,或者使用系统socket库的任何东西都是一样的。 但是,在Java中,您可以将其抽象出来,例如:

BufferedWriter  out = 
    new BufferedWriter(new OutputStreamWriter(clientSocket.getOutputStream()));
BufferedWriter包含一个
写入(字符串s,int off,int len)
方法。

因为套接字(在系统级别)以字节为单位进行处理。在C或C++中,或者使用系统socket库的任何东西都是一样的。 但是,在Java中,您可以将其抽象出来,例如:

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

BufferedWriter包含一个
写入(字符串s,int off,int len)
方法。

因为套接字设计为使用
输出流在其中写入字节。OutputStream的JavaDoc状态为:

输出流接受输出字节 然后把它们送到某个水槽


不同于C++,字符串以UTF 16格式表示,是一系列字符:代码> java .Lang.CalStords/Cuth>,而不仅仅是ASCII字符数组(如C++)。从今往后,这就是为什么必须将字符串编码为您想要的编码(在您的实例中为ASCII)。

因为套接字设计为使用
OutputStream
在其中写入字节。OutputStream的JavaDoc状态为:

输出流接受输出字节 然后把它们送到某个水槽


不同于C++,字符串以UTF 16格式表示,是一系列字符:代码> java .Lang.CalStords/Cuth>,而不仅仅是ASCII字符数组(如C++)。因此,有必要将字符串编码为所需的编码(在您的实例中为ASCII)。

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

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

当然,使用这种方法,字符串的格式并不像字节数组那样,而是使用只有ObjectInputStream应该知道的专有格式。此流类型可用于写入任意可序列化对象,而不仅仅是字符串。

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

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

当然,使用这种方法,字符串的格式并不像字节数组那样,而是使用只有ObjectInputStream应该知道的专有格式。此流类型可用于编写任意可序列化对象,而不仅仅是字符串。

C++完全能够使用Unicode字符串。而java的字符串/CalScordVC++与Car + char的事实是不相关的。这个问题是关于字符编码和从字符转换到字节的问题,如果使用Unicode字符串类型,C++中也存在一个问题。C++完全可以使用Unicode字符串。而java的字符串/CalScordVC++与Car + char的事实是不相关的。这个问题是关于字符编码和从字符转换到字节的问题,如果使用Unicode字符串类型,C++中也存在这个问题。