【问题标题】:ObjectInputStream.readObject skips last line of text fileObjectInputStream.readObject 跳过文本文件的最后一行
【发布时间】:2016-10-04 02:15:08
【问题描述】:

相当简单的问题,我有一个带有一些文件的服务器,我们称之为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。有什么办法可以解决吗?

【问题讨论】:

  • 您是否在完成发送文件文本后刷新或关闭 ObjectOutputStream?为什么要使用 OOS 而不是更简单的 PrintStream?

标签: java file sockets stream


【解决方案1】:

我自己,我会使用 PrintStream 将文本发送出去,然后使用 BufferedReader 或 Scanner 将其读入。但话虽如此,如果您坚持使用 ObjectOutputStream,您应该在发送完文件文本后刷新或关闭它,并在完成使用后关闭它。

另外,避免这种类型的代码:

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

因为这意味着您完全忽略了您的异常。至少查看堆栈跟踪。

【讨论】:

  • 冲洗成功,谢谢!还 - 介意解释为什么我的捕获不好?我不介意它到达文件末尾。这仅仅意味着我需要终止我的循环。这不是一个例外,因为它表明我已经阅读了所有信息。
  • 在这种特定情况下,不打印堆栈跟踪是可以接受的,尽管我会使用break 并将循环重组为while (true)。但是我根本不会为此使用对象流。
猜你喜欢
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2013-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多