我写了个文件分割的小程序 以下是分割部分的代码/*文件分割方法
参数file表示要分割的源文件
dir表示分割完成后要保存的路径
size表示要分割的大小*/
private void cutFile(File file,File dir,long size) {
   // TODO Auto-generated method stub
   FileInputStream fis=null;                //创建文件输入和输出流
   FileOutputStream fos=null;
   long fileSize=file.length();             //取得源文件大小
   String fileName=file.getName();          //取得原文件名字
   long fileNum=0;                          //附加在分割好后文件名后面的文件编号
   try {
    fis=new FileInputStream(file);
    fileNum=0;
    if(fileSize<=1024){
     JOptionPane.showMessageDialog(null,"文件不需要分割");
     return;
    }
    int readByte=0;
    byte[]date=new byte[1024];          //缓存数组
    int singleFileSize=0;               //分割文件大小临时变量
    File nextFile=null;
    //读取源文件直到文件末尾
    while((readByte=fis.read(date))!=-1){
     if(nextFile==null)
      nextFile=new File(dir,fileName+"."+"cut"+fileNum); //创建分割后的单个文件
     if(fos==null){
      fos=new FileOutputStream(nextFile);                //创建分割后单个文件的输出流
     }
     
        /*
     if(singleFile<size){
      fos.write(date,0,readByte);
         singleFileSize+=readByte;
        }
     else{
      info.append(nextFile.getName()+"\n");
      fos.close();
      singleFileSize=0;
      fileNum++;
      nextFile=new File(dir,fileName+"."+"cut"+fileNum);
      fos=new FileOutputStream(nextFile);
        }
     */
     if(singleFileSize>=size){                              //如果分割的文件大小等于或大于指定的分割大小重新创建一个文件
      info.append(nextFile.getName()+"\n");              //在信息拦添加文件名
      fos.close();
      singleFileSize=0;
      fileNum++;
      nextFile=new File(dir,fileName+"."+"cut"+fileNum);
      fos=new FileOutputStream(nextFile);
     }
     fos.write(date,0,readByte);
     singleFileSize+=readByte;
     
    }
    
    if(fos!=null){
     
     fos.close();
    }
    if(fis!=null){
     fis.close();
    }
    info.append(nextFile.getName()+"\n"); 
   } catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
   }
  }以上代码不考虑中间那段加粗的注释部分 分割出来的文件是正常的但如果我把注释部分代码替换掉以下代码 分割出来的文件总数大小比原文件小了30多KB这是为什么按理来说2种if语句完成的功能能应该是一样的 if(singleFileSize>=size){                              //如果分割的文件大小等于或大于指定的分割大小重新创建一个文件
      info.append(nextFile.getName()+"\n");              //在信息拦添加文件名
      fos.close();
      singleFileSize=0;
      fileNum++;
      nextFile=new File(dir,fileName+"."+"cut"+fileNum);
      fos=new FileOutputStream(nextFile);
     }
     fos.write(date,0,readByte);
     singleFileSize+=readByte;

解决方案 »

  1.   

    当然不一样了
    if(singleFile<size){
    fos.write(date,0,readByte); //这里的代码是有条件执行的,满足else的时候就不会执行这里
    singleFileSize+=readByte;
    }
    else{
    info.append(nextFile.getName()+"\n");
    fos.close();
    singleFileSize=0;
    fileNum++;
    nextFile=new File(dir,fileName+"."+"cut"+fileNum);
    fos=new FileOutputStream(nextFile);
    }而
    if(singleFileSize>=size){ //如果分割的文件大小等于或大于指定的分割大小重新创建一个文件
      info.append(nextFile.getName()+"\n"); //在信息拦添加文件名
      fos.close();
      singleFileSize=0;
      fileNum++;
      nextFile=new File(dir,fileName+"."+"cut"+fileNum);
      fos=new FileOutputStream(nextFile);
      }
      fos.write(date,0,readByte); //这里的代码是无条件执行的,不管满足不满足上面的if,都会执行
      singleFileSize+=readByte;所以,第一种方法,当满足else时,就不会执fos.write(date,0,readByte); 而丢失信息
    而第二种是,即使满足了if,也还是会执行fos.write(date,0,readByte); 不会丢失信息
      

  2.   

    顶2楼
    注释掉的那部分有数据丢失吧,若是"singleFile>=size"时,数据丢失了。