我有一个客户端-使用TCP的服务器程序。现在,我想发送不同大小的不同消息。我读到Java中的char
是2个字节。如果我使用的是UTF-8,是否可以发送一个char
,它的大小为1个字节?
还有更好的用法:DataInputStream
和DataOutputStream
或BufferedInputStream
和BufferedOutputStream
吗?
答案 0 :(得分:1)
您要使用OutputStreamWriter
来包装OutputStream
。这样一来,您就可以指定编码,并写出char
而不是byte
。 OutputStreamWriter
的工作是了解编码,并将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();
}