java中的输入输出文件,关于java中文件输入输出流有关问题

关于java中文件输入输出流问题

我写了个文件分割的小程序 以下是分割部分的代码

/*文件分割方法

参数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

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;

------解决方案--------------------

Java code当然不一样了

if(singleFile

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); 不会丢失信息

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值