Java DataOutputStream.writeBytes添加零字节

Java DataOutputStream.writeBytes添加零字节,java,tcp,Java,Tcp,我有一个小的TCP服务器程序和一个相应的客户端,它们通过ServerSocket和Socket类以及DataInputStream/DataOutputStream进行通信。我在向服务器发送字符串时遇到问题 connection = new Socket("localhost", 2233); outStream = new DataOutputStream(connection.getOutputStream()); outStream.writeBytes(fileName); 此时,

我有一个小的TCP服务器程序和一个相应的客户端,它们通过ServerSocket和Socket类以及DataInputStream/DataOutputStream进行通信。我在向服务器发送字符串时遇到问题

connection = new Socket("localhost", 2233);

outStream = new DataOutputStream(connection.getOutputStream());

outStream.writeBytes(fileName);
此时,fileName是一个硬编码字符串,值为“listener.jardesc”。服务器使用以下代码读取字符串:

inStream = new DataInputStream(connection.getInputStream());

String fileName = inStream.readLine();

字符串已正确接收,但在结尾添加了三个零值字节。为什么会这样?我怎样才能阻止它发生?(当然,我可以修剪接收到的字符串,或者以其他方式阻止这个问题的发生,但我宁愿完全避免这个问题)

我将把这个问题抛到一边。您使用的readLine()方法在Java 5、6和7中已被弃用。API文档非常清楚地指出,这种方法“不能正确地将字节转换为字符”。我将以字节的形式读取它,或者使用缓冲读取器

writeBytes()不会添加额外的字节

您编写的代码无效,因为您没有编写换行符。因此,它不工作,并且在readLine()中永远阻塞


在尝试调试时,您似乎以其他方式读取了字节,可能是使用read();忽略了read返回的返回值,并得出结论,read()填充了您提供的缓冲区,而它没有填充,将三个字节保留在初始状态,即零。

什么版本的Java?在Java5、6和7中,readLine()方法已被弃用。为什么您认为在使用
writeBytes
之后可以使用
readLine
?您是否编写了
“listener.jardesc\n”
?你如何得出结论,结尾有三个零字节,你如何检查你的值。不,只是“listener.jardesc”。我通过将其转换为char[]并将相应的数字值打印到控制台来检查它。它不应该给您这些零字节,我倾向于认为您没有发布的某些代码以某种方式导致了问题。但是我有一个尝试的建议:不要使用
writeBytes
readLine
,而是使用
writeUTF
readUTF
。这些方法正确地处理了字符编码,但更重要的是,它们在字符串前面加上写入字符串所需的字节数,读取器使用这些字节只读取写入的字节数。将什么转换为字符?一个字符串已经是chars。您从何处获取此转换的字节?