如果我只需要通过套接字发送1个字节,我可以只使用一个字符吗?

时间:2019-01-13 17:33:36

标签: java sockets utf-8 tcp byte

我有一个客户端-使用TCP的服务器程序。现在,我想发送不同大小的不同消息。我读到Java中的char是2个字节。如果我使用的是UTF-8,是否可以发送一个char,它的大小为1个字节?

还有更好的用法:DataInputStreamDataOutputStreamBufferedInputStreamBufferedOutputStream吗?

3 个答案:

答案 0 :(得分:1)

您要使用OutputStreamWriter来包装OutputStream。这样一来,您就可以指定编码,并写出char而不是byteOutputStreamWriter的工作是了解编码,并将char s正确地转换为byte s。如果您指定OutputStreamWriter使用UTF-8,并且在UTF-8中编写了一个使用一个字节的字符,则可以预期只有一个字节被写入流中。

try (OutputStreamWriter writer = new OutputStreamWriter(myOutputStream, "UTF-8")) {
    writer.write('x');
}

您还可以将OutputStreamWriter包装在BufferedWriter中,以提高效率。

但是使用getBytes类的String方法自己进行编码只是重新发明了轮子。不要那样做。

有关OutputStreamWriter can be found in the Javadoc的更多信息。

答案 1 :(得分:0)

Java中通常的惯例是使用OutputStream写入字节。这里的两种方法都不接受char。您需要将字符转换为byte[]数组,例如

OutputStream out = ...
byte[] bytes = "my string".getBytes(Charset.forName("UTF-8"));
out.write(bytes);

如果您打算使用套接字,则可以检查Socket.getOutputStream()方法:

  

返回此套接字的输出流。

     

如果此套接字具有关联的通道,则结果输出流将其所有操作委托给该通道。如果通道处于非阻塞模式,则输出流的写操作将引发IllegalBlockingModeException

     

关闭返回的OutputStream将关闭关联的套接字。

答案 2 :(得分:0)

UTF-8编码使用1到4个字节来存储字符,因此不能保证它只有1个字节。

如果只想发送一个字节,请使用字节原始类型。

尝试以下代码:

try (BufferedOutputStream out = new BufferedOutputStream(socket.getOutputStream())) {
        String myString = "Hello";
        byte arr[] = myString.getBytes("UTF-8");
        out.write(arr);
    } catch (IOException e) {
        e.printStackTrace();
    }