在做一个项目的时候遇到这样一个问题:
在网络上保存word文档的时候估计是出现了网络异常(一份不大的word文档
,保存的时候等了很久),然后再打开那份文件的时候就提示说“文件格式错误”。
检查源代码,摘录保存文件的部分代码如下:
public synchronized static int saveFileContent(HashMap hmp) throws Exception
{
    byte[] body=(byte[])hmp.get("filebody");     
    FileOutputStream fos = null;
    try 
    {

         fos = new FileOutputStream(filePath + filename);
fos.write(body);
    }
    catch (IOException eIOe)
    {
         log.error("", eIOe);
    } 
    finally 
   {
         if (fos != null) 
         {
    fos.flush();
    fos.close();
    fos = null;
}
   }
}开始以为是fos.flush()的问题,以为把fos.flush();
从finally中调到try块中的fos.write(body)后可以解决
问题。但自己写了个小程序测试,结果并非如此,如下:     String source = "D:\\project.doc";
     String dest = "E:\\destination.doc";
     File fIn = new File(source);
     File fOut = new File(dest);
     input = new FileInputStream(fIn);
     output = new FileOutputStream(fOut);
     byte[] buffer = new byte[1024];
     int len = -1;
     int loop = 0;
     while((len=input.read(buffer))!=-1)
     {
if(loop==12)
    break;
output.write(buffer,0,len);
//loop++;
     }
     //output.flush();发现即使把 output.flush();注释掉,
文件一样写成功了。这里想请教一下:flush方法有什么用?如果我在写文件的过程中
出现错误,改如何恢复原来的文件?(相当于事务的回滚,撤销提交)。

解决方案 »

  1.   

    我们写入读入一个文件是,数据流先被存到一个内存空间里,一定大小后(写满后,记住这个)再写入文件里。flush的作用是当内存没有写满时,强制将数据写入或输出。
    类似一下清除内存的概念
      

  2.   

    to:ike_Adriano(亚热带空气) 照这样说,在我的第一个方法 saveFileContent 里面,
    byte[] body,body就是这个内存空间咯?这样看来,是不是说如果出现我说的那个word文档
    被破坏的情况,并不是写文件的时候出错,而是在
    byte[] body=(byte[])hmp.get("filebody");   的时候,
    body取得的数据流就已经不对了?(因为那个项目是BS结构的),
    偶想应该是网络造成数据丢失的可能性大些