英文:
java.io.EOFException: at java.io.DataInputStream.readUTF(Unknown Source) - write file line by line
问题
I made a simple Server-Client application to read line by line file from Server and write line by line in a new file in the client side. The application writes corretcly the lines in the file , but when the file reaches the end, I catch this error:
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)
my code:
public class FileServer1 {
public static void main(String[] args) {
int port = 3000;
// open server socket
ServerSocket ss = null;
try {
ss = new ServerSocket(port);
Socket s = ss.accept();
DataOutputStream outToClient = new DataOutputStream(s.getOutputStream());
File testFile = new File("C:\\temp\\tmpbgoutcoge");
BufferedReader input = new BufferedReader(new FileReader(testFile));
String line;
while ((line = input.readLine()) != null) {
outToClient.writeUTF(line);
outToClient.writeUTF("-----------------------------");
outToClient.flush();
Thread.currentThread().sleep(1000);
}
input.close();
outToClient.close();
s.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
public class FileClient1 {
public static void main(String[] args) {
try (PrintWriter out = new PrintWriter(new FileWriter("C:\\temp\\tmpbgoutcoge1.txt", true));) {
Socket s = new Socket("localhost", 3000);
DataInputStream inFromServer = new DataInputStream(new BufferedInputStream(s.getInputStream()));
while (true) {
String line = inFromServer.readUTF();
System.out.println(line);
out.write(line);
out.println("\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
I have to find a While stop condition when I reach the end of file, but I've tryied with (line = inFromServer.readUTF()) != null
but it's not worked.
In the FileClient1 class, I can't close the socket and the DataInputStream. A message says: "Unreachable code".
英文:
I made a simple Server-Client application to read line by line file from Server and write line by line in a new file in the client side. The application writes corretcly the lines in the file , but when the file reaches the end, I catch this error:
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)
my code:
public class FileServer1 {
public static void main(String[] args) {
int port = 3000;
// open server socket
ServerSocket ss = null;
try {
ss = new ServerSocket(port);
Socket s = ss.accept();
DataOutputStream outToClient = new DataOutputStream(s.getOutputStream());
File testFile = new File("C:\\temp\\tmpbgoutcoge");
BufferedReader input = new BufferedReader(new FileReader(testFile));
String line;
while ((line = input.readLine()) != null) {
outToClient.writeUTF(line);
outToClient.writeUTF("-----------------------------");
outToClient.flush();
Thread.currentThread().sleep(1000);
}
input.close();
outToClient.close();
s.close();
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
public class FileClient1 {
public static void main(String[] args) {
try (PrintWriter out = new PrintWriter(new FileWriter("C:\\temp\\tmpbgoutcoge1.txt", true));) {
Socket s = new Socket("localhost", 3000);
DataInputStream inFromServer = new DataInputStream(new BufferedInputStream(s.getInputStream()));
while (true) {
String line = inFromServer.readUTF();
System.out.println(line);
out.write(line);
out.println("\n");
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
I have to find a While stop condition when I reach the end of file, but I've tryied with (line = inFromServer.readUTF())!= null but it's not worked.
In the FileClient1 class, I can't close the socket and the DataInputStream. A message says:"Unreachable code".
答案1
得分: 0
readUTF()永远不会返回null。在关闭之前,您需要发送一个“哨兵值” - 一个特殊的值,表示流的结束。
显然,您希望它是在正常使用情况下不太可能发送的内容。我建议使用"\uffff"
(一个长度为1的字符串),因为U+FFFF保证不是一个已定义的字符。
英文:
readUTF() will never return null. You need to send a “sentinel value” before closing—a special value that indicates the end of the stream.
Obviously you want it to be something that is very unlikely to be sent in a normal use case. I suggest "\uffff"
(a String with length 1), since U+FFFF is guaranteed not to be a defined character.
答案2
得分: -1
你可以使用以下代码替代原来的代码:
while (inFromServer.available() > 0) {
String line = inFromServer.readUTF();
System.out.println(line);
out.write(line);
out.println("\n");
}
英文:
You can use
while(inFromServer.available()>0) {
String line = inFromServer.readUTF();
System.out.println(line);
out.write(line);
out.println("\n");
}
instead of
while (true) {
String line = inFromServer.readUTF();
System.out.println(line);
out.write(line);
out.println("\n");
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论