关于java.io.EOFException问题,希望大家看看

baibinghere 2009-07-13 04:12:09
  一个通过Socket实现的文件传输。
  发送端大概的实现是:
try
{
out.writeUTF("??Receive File??"); //通知接收端现在要接收文件
}
catch(Exception e)
{
}
try
{
out.writeUTF(f.getFile()); // f.getFile()是一个文件的字符串
FileInputStream fos = new FileInputStream(F); //F是File类型的,联接f
OutputStream netOut = socket.getOutputStream();
OutputStream doc = new DataOutputStream(new BufferedOutputStream(netOut));
//创建文件读取缓冲区
byte[] buf = new byte[2048];
int num = fos.read(buf);
while(num != -1){ //是否读完文件
doc.write(buf, 0, num); // 把文件数据写出网络缓冲区
doc.flush(); // 刷新缓冲区把数据写往客户端
num = fos.read(buf); // 继续从文件中读取数据
}
fos.close();
doc.close();
}
catch(Exception e)
{
JOptionPane.showMessageDialog(null, "文件读取或发送错误" , "注意", JOptionPane.ERROR_MESSAGE);
}
接收端大概是:
while(true)
{
try{
filename = in.readUTF(); // 此处接收上面那个"??Receive File??"
}
catch(Exception e){
System.out.println(filename);
System.out.println(e);
break;
}

if(filename.compareTo("??Receive File??") == 0)
{
try
{
filename = in.readUTF();
System.out.println(filename);
}
catch(Exception e){
System.out.println(e);
}
receiveFile(filename, disk);
}
}


public static void receiveFile(String filename, String filedirectory)
{
File file=new File(filedirectory + filename);
try
{

file.createNewFile();
RandomAccessFile raf = new RandomAccessFile(file,"rw");
InputStream netIn = you.getInputStream();
InputStream In = new DataInputStream(new BufferedInputStream(netIn));
//创建缓冲区缓冲网络数据
byte[] buf=new byte[2048];
int num=In.read(buf);
while(num!=(-1)){ //是否读完所有数据
raf.write(buf,0,num);//将数据写往文件
raf.skipBytes(num); //顺序写文件字节
num=In.read(buf); // 继续从网络中读取文件
}
In.close();
raf.close();
}
catch(Exception e){
System.out.println(e);
}
System.out.println(filename + "接收完毕");
}
}

这个程序可以接收一次文件,但循环到第二次的时候,在
try{
filename = in.readUTF(); // 此处接收上面那个"??Receive File??"
}
以下这个位置就会出错。抛出一个EOFException异常。可以告诉我怎么解决吗?
...全文
1905 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
Ant 2009-07-15
  • 打赏
  • 举报
回复
EOFException与其说是一个异常,不如说它是一个标识结束的正常标志,你需要多次读文件就一定要在逻辑上控制你对流的读和写,而并不是简单的去流里面读到没有为止,如果你希望读到没有为止,那么最后一个标志就一定会是EOF,也一定会抛出EOFException随之流被关闭。

简单来说,你一定要控制你读的byte数,不能让读到流最后那个EOF,因为一读到这流就认为不会再有数据结束而马上关闭。
最常见的做法是每次先发送File的length过去,对方读到length,再发File的话接收端就能严格知道应该读多少length的byte,一直不会多读也就不会碰触到EOF
Chuyun130 2009-07-15
  • 打赏
  • 举报
回复
while(num != -1){ //是否读完文件

因为读完一个文件,你的fos就关掉了 fos.close();
baibinghere 2009-07-13
  • 打赏
  • 举报
回复
   真的很不好意思,我没有把情况说明得很清楚。
我的意思就是说,当我读取完文件以后,如果再用
in.readUTF();就会抛出EOFException的异常,不知道为什么。 希望有回帖,不然就太郁闷了!
   楼上的好心人,谢谢你,不过我说得很清楚了,
try{
filename = in.readUTF(); // 此处接收上面那个"??Receive File??"
}

这个位置会出错,出错的提示信息是EOFException
wangjiancy 2009-07-13
  • 打赏
  • 举报
回复
当输入过程中意外到达文件或流的末尾时,抛出此异常。
你单步调试一下,看看哪行出的问题,或者把整个错误都贴出来,让大家看看。
这样才好帮助你。

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧