java.io.EOFEException:at java.io.DataInputStream.readUTF(未知源)-逐行写入文件

java.io.EOFEException:at java.io.DataInputStream.readUTF(未知源)-逐行写入文件,java,Java,我制作了一个简单的服务器-客户端应用程序,从服务器中逐行读取文件,并在客户端的新文件中逐行写入。应用程序正确地写入文件中的行,但当文件到达末尾时,我发现以下错误: java.io.EOFException at java.io.DataInputStream.readUnsignedShort(Unknown Source) at java.io.DataInputStream.readUTF(Unknown Source) at java.io.DataInputStr

我制作了一个简单的服务器-客户端应用程序,从服务器中逐行读取文件,并在客户端的新文件中逐行写入。应用程序正确地写入文件中的行,但当文件到达末尾时,我发现以下错误:

java.io.EOFException
    at java.io.DataInputStream.readUnsignedShort(Unknown Source)
    at java.io.DataInputStream.readUTF(Unknown Source)
    at java.io.DataInputStream.readUTF(Unknown Source)
    at it.sendfile.socket.FileClient1.main(FileClient1.java:19)
我的代码:

公共类文件服务器1{ 公共静态无效字符串[]args{ int端口=3000; //开放服务器套接字 ServerSocket ss=null; 试一试{ ss=新的ServerSocketport; 插座s=ss.accept; DataOutputStream outToClient=新建DataOutputStreams.getOutputStream; 文件testFile=newfilec:\\temp\\tmpbgoutge; BufferedReader输入=新的BufferedReaderNewFileReaderTestFile; 弦线; 而line=input.readLine!=null{ outToClient.writeUTFline; outToClient.writeUTF-------------; outToClient.flush; Thread.currentThread.sleep1000; } 输入。关闭; outToClient.close; s、 接近; }捕获异常e{ System.out.printlne.getMessage; } } } 公共类FileClient1{ 公共静态无效字符串[]args{ 尝试PrintWriter out=new PrintWriternew filewriter:\\temp\\tmpbgoutcoge1.txt,true{ 插座s=新插座本地主机,3000; DataInputStream INFOROMSERVER=新DataInputStreamnew BufferedInputStreams.getInputStream; 虽然是真的{ 字符串行=informserver.readUTF; System.out.printlnline; out.writeline; out.println\n; } }捕捉异常{ //TODO自动生成的捕捉块 e、 打印跟踪; } } } 当我到达文件末尾时,我必须找到一个While stop条件,但我尝试使用line=informserver.readUTF!=空,但它不工作。 在FileClient1类中,我无法关闭套接字和DataInputStream。一条消息说:无法访问的代码。

您可以使用

 while(inFromServer.available()>0) {  
      String line = inFromServer.readUTF();
      System.out.println(line);
      out.write(line);
      out.println("\n");
 }  
而不是

        while (true) {
            String line = inFromServer.readUTF();
            System.out.println(line);
            out.write(line);
            out.println("\n");
        }

readUTF永远不会返回null。您需要在关闭之前发送一个“sentinel值”——一个指示流结束的特殊值


显然,您希望它是在正常用例中不太可能发送的东西。我建议\uffff使用长度为1的字符串,因为U+FFFF保证不是定义的字符。

我尝试过该解决方案,但我收到另一个错误消息服务器端:对等方重置连接:套接字写入错误从不使用InputStream.available。显然,available并不表示EOF,它只表示您是否可以无阻塞地读取。非常感谢…它工作正常,这样我就可以关闭Datainputstream和套接字。