请选择 进入手机版 | 继续访问电脑版
设为首页 收藏本站
开启辅助访问 切换到宽版

新浪微博登陆

只需一步, 快速开始

QQ登录

只需一步,快速开始

切换风格 立即注册 找回密码

Java教程网

新浪微博达人勋

3418

积分

976

帖子

793

贡献

Rank: 8Rank: 8

积分
3418

社区QQ达人

发表于 2016-12-17 15:05:22 | 显示全部楼层 |阅读模式
思路:首先,我们拿到一个文件要分割的成几份时候,我们先将文件的length得到,之后用 length 除以份数 ,这样我们就能够知道每一份的长度是多少,这里会有一个问题,如果我们的长度没有被这个份数整除的时候,余下的那部分又太小了我们会怎么处理呢?肯定会将这一个最小的一部分放入到最后一份,再将每一份加上一个标识,告诉我们这一份在文件中是第几个,这样将文件合并的时候就可以按照我们的标识把分割完成的小文件再一个一个的重新写入到一个文件里,拼接在一起。


具体代码如下
  1. import java.io.File;
  2. import java.io.RandomAccessFile;

  3. import org.junit.Test;
  4. public class SplitImageUtil {


  5.         /**
  6.          *
  7. 拆分文件

  8.          * @param file 源文件
  9.          * @param count 拆分的文件个数
  10.          * @throws Exception
  11.          */
  12.         public static void split(String file ,int count) throws Exception
  13.         {               
  14.                
  15.                 RandomAccessFile raf = new RandomAccessFile(new File(file),"r");
  16.                 long length = raf.length();
  17.                
  18.                 long theadMaxSize =  length / count; //每份的大小 1024 * 1000L;
  19.                 raf.close();

  20.                 long offset = 0L;
  21.                 for(int i=0;i< count-1;i++) //这里不去处理最后一份
  22.                 {
  23.                         long fbegin = offset;
  24.                         long fend = (i+1) * theadMaxSize;
  25.                         offset =write(file,i,fbegin,fend);
  26.                 }

  27.                 if(length- offset>0) //将剩余的都写入最后一份
  28.                         write(file,count-1,offset,length);
  29.         }
  30.         /**
  31.          *
  32. 指定每份文件的范围写入不同文件

  33.          * @param file 源文件
  34.          * @param index 文件顺序标识
  35.          * @param begin 开始指针位置
  36.          * @param end 结束指针位置
  37.          * @return
  38.          * @throws Exception
  39.          */
  40.         private static long write(String file,int index,long begin,long end) throws Exception
  41.         {
  42.                 RandomAccessFile in = new RandomAccessFile(new File(file),"r");
  43.                 RandomAccessFile out = new RandomAccessFile(new File(file+"_"+index+".tmp"),"rw");
  44.                 byte[] b = new byte[1024];
  45.                 int n=0;
  46.                 in.seek(begin);//从指定位置读取

  47.                 while(in.getFilePointer() <= end && (n= in.read(b))!=-1)
  48.                 {
  49.                         out.write(b, 0, n);
  50.                 }
  51.                 long endPointer =in.getFilePointer();
  52.                 in.close();
  53.                 out.close();
  54.                 return endPointer;
  55.         }
  56.         /**
  57.          *
  58. 合并文件

  59.          * @param file 指定合并后的文件
  60.          * @param tempFiles 分割前的文件名
  61.          * @param tempCount 文件个数
  62.          * @throws Exception
  63.          */
  64.         public static void merge(String file,String tempFiles,int tempCount) throws Exception
  65.         {
  66.                 RandomAccessFile ok = new RandomAccessFile(new File(file),"rw");
  67. }
复制代码



来自群组: java开发组

新浪微博达人勋

6800

积分

1700

帖子

1700

贡献

Rank: 8Rank: 8

积分
6800
发表于 2016-12-17 15:05:52 | 显示全部楼层
啊啊啊啊啊啊啊啊啊啊啊

新浪微博达人勋

6531

积分

1632

帖子

1633

贡献

Rank: 8Rank: 8

积分
6531

社区QQ达人

发表于 2016-12-24 01:40:49 | 显示全部楼层
这么强,支持楼主,佩服

新浪微博达人勋

2789

积分

697

帖子

697

贡献

Rank: 6Rank: 6

积分
2789
发表于 2016-12-27 17:04:57 | 显示全部楼层
好,很好,非常好!

新浪微博达人勋

6711

积分

1677

帖子

1678

贡献

Rank: 8Rank: 8

积分
6711
发表于 2017-1-2 15:57:31 | 显示全部楼层
顶顶更健康

新浪微博达人勋

6519

积分

1629

帖子

1630

贡献

Rank: 8Rank: 8

积分
6519

社区QQ达人活跃会员

发表于 2017-1-2 23:39:19 | 显示全部楼层
回个帖子,下班咯~

新浪微博达人勋

6308

积分

1591

帖子

1571

贡献

Rank: 8Rank: 8

积分
6308
发表于 2017-1-14 21:22:28 | 显示全部楼层
我只是路过,不发表意见

新浪微博达人勋

3066

积分

768

帖子

766

贡献

Rank: 8Rank: 8

积分
3066

社区QQ达人

发表于 2017-1-17 13:41:08 | 显示全部楼层
广告位,,坐下看看

新浪微博达人勋

3010

积分

753

帖子

752

贡献

Rank: 8Rank: 8

积分
3010
发表于 2017-1-17 13:49:40 | 显示全部楼层
不错 支持一个了

新浪微博达人勋

6773

积分

1716

帖子

1670

贡献

Rank: 8Rank: 8

积分
6773

社区QQ达人最佳新人活跃会员热心会员

发表于 2017-1-18 02:06:22 | 显示全部楼层
呵呵。。。
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

关闭

站长推荐 上一条 /1 下一条

小黑屋|手机版|Archiver|Java教程网    

GMT+8, 2019-5-27 19:16 , Processed in 0.343750 second(s), 46 queries .

Powered by Discuz X3.2

© 2001-2013 JAVA教程网

快速回复 返回顶部 返回列表