java io大文件_JavaIO流对大文件进行分割与合并

对于大文件传输不方便时候可以试一下分割之后再操作:

package com.lym;

import java.io.BufferedInputStream;

import java.io.BufferedOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

import java.io.IOException;

import java.io.InputStream;

import java.io.OutputStream;

/**

* 1、实现一个文件分割器,把一个大文件分割成若干个小文件(可根据情况自行设计),

* 分割后的文件扩展名为dat,文件名为:原文件名+原扩展名+编号+.dat

* 2、把分割后的文件再合并(文件还原)成完整文件,与源文件一致。

* @author lym

*

*/

public class Homework2 {

/**

* 文件分割

* @param src 源文件路径

* @param fileSize 分割后每个文件的大小,单位是MB

* @param dest 目标文件路径

*/

public static void split(String src,int fileSize,String dest){

if("".equals(src)||src==null||fileSize==0||"".equals(dest)||dest==null){

System.out.println("分割失败");

}

File srcFile = new File(src);//源文件

long srcSize = srcFile.length();//源文件的大小

long destSize = 1024*1024*fileSize;//目标文件的大小(分割后每个文件的大小)

int number = (int)(srcSize/destSize);

number = srcSize%destSize==0?number:number+1;//分割后文件的数目

String fileName = src.substring(src.lastIndexOf("\\"));//源文件名

InputStream in = null;//输入字节流

BufferedInputStream bis = null;//输入缓冲流

byte[] bytes = new byte[1024*1024];//每次读取文件的大小为1MB

int len = -1;//每次读取的长度值

try {

in = new FileInputStream(srcFile);

bis = new BufferedInputStream(in);

for(int i=0;i

String destName = dest+File.separator+fileName+"-"+i+".dat";

OutputStream out = new FileOutputStream(destName);

BufferedOutputStream bos = new BufferedOutputStream(out);

int count = 0;

while((len = bis.read(bytes))!=-1){

bos.write(bytes, 0, len);//把字节数据写入目标文件中

count+=len;

if(count>=destSize){

break;

}

}

bos.flush();//刷新

bos.close();

out.close();

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

//关闭流

try {

if(bis!=null)bis.close();

if(in!=null)in.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 文件合并

* 注意:在拼接文件路劲时,一定不要忘记文件的跟路径,否则复制不成功

* @param destPath 目标目录

* @param srcPaths 源文件目录

*/

public static void merge(String destPath,String ... srcPaths){

if(destPath==null||"".equals(destPath)||srcPaths==null){

System.out.println("合并失败");

}

for (String string : srcPaths) {

if("".equals(string)||string==null)

System.out.println("合并失败");

}

//合并后的文件名

String name = srcPaths[0].substring(srcPaths[0].lastIndexOf("\\"));

String destName = name.substring(0, name.lastIndexOf("-"));

destPath = destPath+destName;//合并后的文件路径

File destFile = new File(destPath);//合并后的文件

OutputStream out = null;

BufferedOutputStream bos = null;

try {

out = new FileOutputStream(destFile);

bos = new BufferedOutputStream(out);

for (String src : srcPaths) {

File srcFile = new File(src);

InputStream in = new FileInputStream(srcFile);

BufferedInputStream bis = new BufferedInputStream(in);

byte[] bytes = new byte[1024*1024];

int len = -1;

while((len = bis.read(bytes))!=-1){

bos.write(bytes, 0, len);

}

bis.close();

in.close();

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

//关闭流

try {

if(bos!=null)bos.close();

if(out!=null)out.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

/**

* 分割测试

*/

// String src = "E:\\API\\JDK_API_1_6_zh_CN.CHM";//要分割的大文件

// int fileSize = 10;

// String dest = "D:\\";//文件分割后保存的路径

// System.out.println("分割开始。。。");

// split(src, fileSize, dest);

// System.out.println("分割完成");

/**

* 合并测试

*/

//合并后文件的保存路径

String destPath = "D:\\upan";

//要合并的文件路径

String[] srcPaths = {

"D:\\JDK_API_1_6_zh_CN.CHM-0.dat",

"D:\\JDK_API_1_6_zh_CN.CHM-1.dat",

"D:\\JDK_API_1_6_zh_CN.CHM-2.dat",

"D:\\JDK_API_1_6_zh_CN.CHM-3.dat"};

System.out.println("开始合并。。。");

merge(destPath, srcPaths);

System.out.println("合并结束");

}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值