A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 xiaoHei 于 2013-5-6 21:08 编辑
  1. import java.io.*;
  2. import java.util.*;
  3. import java.util.concurrent.locks.*;
  4. class Test
  5. {
  6.         static int id ;
  7.         static int del;
  8.         static Lock lock = new ReentrantLock();
  9.         static Condition condition = lock.newCondition();
  10.         public static void main(String[] args)
  11.         {
  12.                 System.out.println("请输入要分解的文件");
  13.                 Scanner input = new Scanner(System.in);
  14.                 String path = input.nextLine();
  15.                 split(path);
  16.                 System.out.println("请输入要合并的文件夹");
  17.                 path = input.nextLine();
  18.                 try {
  19.                         sequenceInputStream(path);
  20.                 } catch (IOException e) {
  21.                         e.printStackTrace();
  22.                 }
  23.         }
  24.         /*
  25.          * 分解文件
  26.          * RandomAccessFile+使用多线程实现
  27.          * */
  28.         public static void split(String path){
  29.                 final File src = new File(path);                                                   //要分解的文件                                       
  30.                 final File dest = new File(src.getParent(),"."+src.getName());   //临时文件夹
  31.                 dest.mkdirs();                                                                          //创建临时文件夹
  32.                 final long len = src.length()/5+1;                                             //算出每个分解出来文件时多大
  33.                 for( int i=0;i<5;i++){                                                  //循环5次,创建5个线程,每个线程输出 分解出来的每个文件中的内容
  34.                         new Thread(){                                                                //创建线程,输出分解出来的内容
  35.                                 public void run(
  36.                                         lock.lock();
  37.                                         try(
  38.                                                 RandomAccessFile ra = new RandomAccessFile(src,"rw");
  39.                                                 FileOutputStream fos = new FileOutputStream(new File(dest,(id+1)+""));
  40.                                         ){
  41.                                                 long lo = id++*len;
  42.                                                 ra.seek(lo);
  43.                                                 lock.unlock();
  44.                                                 int index=1;
  45.                                                 int l;
  46.                                                 byte[] b = new byte[1024*1024];
  47.                                                 while((l=ra.read(b,0,(int)(b.length*index++<len?b.length:len%b.length)))!=-1){
  48.                                                         fos.write(b,0,l);
  49.                                                         if(l==len%b.length) break;
  50.                                                 }
  51.                                         }catch(Exception e){
  52.                                                 e.printStackTrace();
  53.                                         }
  54.                                         del++;
  55.                                 }
  56.                         }.start();       //开启线程
  57.                 }
  58. ---------------------------------------------------------------------------------------------------------------------------------------
  59.              while(del==5){     //如果5个线程都执行完毕,就用临时文件夹,替换源文件
  60.                         /*
  61.                          * 以下代码
  62.                          * 不设断点,就执行不到,求原因
  63.                          * */
  64.                         System.out.println(src.delete());
  65.                         System.out.println(dest.renameTo(src));
  66.                         break;
  67.                 }
  68. ----------------------------------------------------------------------------------------------------------------------------------------
  69.         }
  70.         /*
  71.          * 下面是将分解出来的5个文件合并成一个文件,没有问题....
  72.          * */
  73.         public static void sequenceInputStream(String path) throws IOException{
  74.                 SequenceInputStream sis=null;
  75.                 BufferedOutputStream bos=null;
  76.                 File src=new File(path);
  77.                 File dest = new File(src.getParent(),"."+src.getName());
  78.                 try{
  79.                         ArrayList<BufferedInputStream> al = new ArrayList();
  80.                
  81.                         for(File file : src.listFiles()){
  82.                                 al.add(new BufferedInputStream(new FileInputStream(file)));
  83.                         }
  84.                         sis = new SequenceInputStream(Collections.enumeration(al));
  85.                         bos = new BufferedOutputStream(new FileOutputStream(dest));
  86.                         int i;
  87.                         while((i=sis.read())!=-1){
  88.                                 bos.write(i);
  89.                         }
  90.                 }finally{
  91.                         try{
  92.                                 sis.close();
  93.                         }finally{
  94.                                 bos.close();
  95.                         }
  96.                 }
  97.                 del(src);
  98.                 src.delete();
  99.                 System.out.println(dest.renameTo(src));
  100.         }
  101.         /*
  102.          * 删除文件夹
  103.          * */
  104.         public static void del(File file){
  105.                 if(!file.isDirectory()){
  106.                         file.delete();
  107.                 }else{
  108.                         File[] fs = file.listFiles();
  109.                         for(File f:fs){
  110.                                 del(f);
  111.                         }
  112.                 }
  113.         }
  114. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
曹睿翔 + 1 神马都是浮云

查看全部评分

2 个回复

倒序浏览
谁来看下,帮忙解决,我审贴审的太多了!
回复 使用道具 举报
曹睿翔 发表于 2013-5-4 23:26
谁来看下,帮忙解决,我审贴审的太多了!

谢谢斑竹啊,今天找了老师,老师说了一下,发现自己犯2了,- -...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马