ObjectInputStream.readObject跳过文本文件的最后一行

时间:2016-06-03 22:02:54

标签: java file sockets stream

相当简单的问题,我有一个带有一些文件的服务器,我们称之为serverFile.txt,我希望将它逐行发送给某个客户端。为实现这一点,我在服务器端编写了这个简单的代码

BufferedReader br = new BufferedReader(new FileReader(fileName));
String line = br.readLine();
while(line != null)
{
    line = line + System.lineSeparator();
    MMULogFileController.getOos().writeObject(line);
    line = br.readLine();
    System.out.println(line);
}
br.close();

其中MMULogFileController.getOos是接受套接字的输出流。

它确实打印了文件serverFile.txt

的所有行

我的问题出在客户端。这是相关的代码 -

ObjectInputStream in = new ObjectInputStream(socket.getInputStream());
String line = (String)in.readObject();
File newLogFile = new File("newLog.txt");
PrintWriter ptofile = new PrintWriter(newLogFile.getName());
while(line != null)
{
    ptofile.write(line);
    try
    {
        line = (String) in.readObject();
    }
    catch(java.io.EOFException e)
    {
        line = null;
    }
}
ptofile.close();

并将所有行正确打印到客户端的新文件中,最后一行除外。我知道它是从服务器发送的,因为它是打印的,但在客户端它收到null因为它到达EOF。有什么方法可以解决这个问题吗?

1 个答案:

答案 0 :(得分:2)

我自己,我会使用PrintStream发送文本,然后使用BufferedReader或Scanner读取它。但话说回来,如果你坚持使用ObjectOutputStream,你应该在发送文件的文本时刷新或关闭它,当你完成使用它时肯定要关闭它。

另外,请避免使用此类代码:

catch(java.io.EOFException e)
{
    line = null;
}

因为这意味着您完全无视您的例外情况。至少查看堆栈跟踪。