我有以下代码,我试图创建两种不同类型的输出流。这似乎不起作用。创建两个输出流的正确方法是什么?具体来说,一个dataoutputstream和一个objectoutputstream?
connect();
try (DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream())) {
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
outputStream.writeUTF("saveFile");
outputStream.writeUTF(serverName);
File fileToSave = new File(localName);
byte[] fileContent = Files.readAllBytes(fileToSave.toPath());
objectOutputStream.writeObject(fileContent);
return true;
}
} catch (IOException e) {
return false;
} finally {
disconnect();
}
在进行一些调试之后,看起来就像输出流没有工作一样。如果我只有两个中的一个,那么两个" writeUTF"语句将执行。
如果我保留两个输出流,则消息永远不会到达服务器。
答案 0 :(得分:0)
解决方案是将两个“writeUTF”语句移到第二个try块之上。
connect();
try (DataOutputStream outputStream = new DataOutputStream(socket.getOutputStream())) {
outputStream.writeUTF("saveFile");
outputStream.writeUTF(serverName);
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream)) {
File fileToSave = new File(localName);
byte[] fileContent = Files.readAllBytes(fileToSave.toPath());
objectOutputStream.writeObject(fileContent);
return true;
}
} catch (IOException e) {
return false;
} finally {
disconnect();
}
现在代码正确执行。
答案 1 :(得分:0)
您的代码存在的问题是new ObjectOutputStream(...)
会向流中写入标题,显然您的阅读代码与此代码并不对称,即它在构建之前执行readUTF()
步骤ObjectInputStream
,因此标题尚未消费,因此readUTF()
步骤会看到它,然后是barf。
解决方案是你根本不需要这样做。 DataOutputStream
在这里毫无意义。 ObjectOutputStream
具有DatataOutputStream
等所有方法,以及输入流的类似方法。
一般来说,当一个或多个流被缓冲时,这种事情是不可能的,因为ObjectInputStream
是。