Cyh的博客

          Email:kissyan4916@163.com
          posts - 26, comments - 19, trackbacks - 0, articles - 220

          文件的分割與合并

          Posted on 2009-05-24 21:31 啥都寫點 閱讀(231) 評論(0)  編輯  收藏 所屬分類: J2SE
          關(guān)鍵技術(shù):
          • 分割文件時,指定小文件的長度(字節(jié)數(shù)),根據(jù)File的length方法獲得大文件的長度,以確定目標小文件的數(shù)目。用文件輸入流順序地讀取大文件的數(shù)據(jù),將數(shù)據(jù)分流到每個小文件的輸出流中。
          • 合并文件時,讀取每個小文件的輸入流,將所有的內(nèi)容按順序?qū)懭氲侥繕舜笪募妮敵隽髦小?/li>

          package book.io;

          import java.io.File;
          import java.io.FileInputStream;
          import java.io.FileOutputStream;

          /**
           * 文件分割合并器,將大文件分割成若干小文件;將多個小文件合并到一個大文件。
           
          */
          public class FileDivisionUniter {
              
          //分割后的文件名后綴
              public static final String SUFFIX = ".pp";

              
          /**
               * 分割文件
               * 
          @param fileName    待分割的文件名
               * 
          @param size    小文件的大小,單位字節(jié)
               * 
          @return        分割成的小文件的文件名
               * 
          @throws Exception
               
          */
              
          public static String[] divide(String fileName, long size) throws Exception {

                  File inFile 
          = new File(fileName);
                  
          if (!inFile.exists() || (!inFile.isFile())) {
                      
          throw new Exception("指定文件不存在!");
                  }
                  
          //獲得被分割文件父文件,將來被分割成的小文件便存在這個目錄下
                  File parentFile = inFile.getParentFile();
                  
                  
          //    取得文件的大小
                  long fileLength = inFile.length(); 
                  
          if (size <=0){
                      size 
          = fileLength / 2;
                  }
                  
          // 取得被分割后的小文件的數(shù)目
                  int num = (fileLength % size != 0? (int)(fileLength / size + 1)
                          : (
          int)(fileLength / size); 
                  
          // 存放被分割后的小文件名
                  String[] outFileNames = new String[num];
                  
          // 輸入文件流,即被分割的文件
                  FileInputStream in = new FileInputStream(inFile);
                  
                  
          // 讀輸入文件流的開始和結(jié)束下標
                  long inEndIndex = 0;
                  
          int inBeginIndex = 0;
                  
                  
          //根據(jù)要分割的數(shù)目輸出文件
                  for (int outFileIndex = 0; outFileIndex < num; outFileIndex++) {
                      
          //對于前num - 1個小文件,大小都為指定的size
                      File outFile = new File(parentFile, inFile.getName()
                              
          + outFileIndex + SUFFIX);
                      
          // 構(gòu)建小文件的輸出流
                      FileOutputStream out = new FileOutputStream(outFile);
                      
          //將結(jié)束下標后移size
                      inEndIndex += size;
                      inEndIndex 
          = (inEndIndex > fileLength) ? fileLength : inEndIndex;
                      
          // 從輸入流中讀取字節(jié)存儲到輸出流中
                      for (; inBeginIndex < inEndIndex; inBeginIndex++) {
                          out.write(in.read());
                      }
                      out.close();
                      outFileNames[outFileIndex] 
          = outFile.getAbsolutePath();
                  }
                  in.close();
                  
          return outFileNames;
              }

              
          /**
               * 合并文件
               * 
          @param fileNames        待合并的文件名,是一個數(shù)組
               * 
          @param TargetFileName    目標文件名
               * 
          @return        目標文件的全路徑
               * 
          @throws Exception
               
          */
              
          public static String unite(String[] fileNames, String TargetFileName)
                      
          throws Exception {
                  File inFile 
          = null
                  
          //構(gòu)建文件輸出流
                  File outFile = new File(TargetFileName);
                  FileOutputStream out 
          = new FileOutputStream(outFile);

                  
          for (int i = 0; i < fileNames.length; i++) {
                      
          // 打開文件輸入流
                      inFile = new File(fileNames[i]);
                      FileInputStream in 
          = new FileInputStream(inFile);
                      
          // 從輸入流中讀取數(shù)據(jù),并寫入到文件數(shù)出流中
                      int c;
                      
          while ((c = in.read()) != -1) {
                          out.write(c);
                      }
                      in.close();
                  }
                  out.close();
                  
                  
          return outFile.getAbsolutePath();
              }

              
          public static void main(final String[] args) throws Exception {
                  
          //分割文件
                  String fileName = "C:/temp/temp.xls";
                  
          long size = 1000;
                  String[] fileNames 
          = FileDivisionUniter.divide(fileName, size);
                  System.out.println(
          "分割文件" + fileName + "結(jié)果:");
                  
          for (int i=0; i<fileNames.length; i++){
                      System.out.println(fileNames[i]);    
                  }
                  
          //合并文件
                  String newFileName = "C:/temp/newTemp.xls";
                  System.out.println(
          "合并文件結(jié)果:" + 
                          FileDivisionUniter.unite(fileNames, newFileName));
              }
          }



                                                                                                                 --    學(xué)海無涯
                  

          主站蜘蛛池模板: 吕梁市| 清河县| 朝阳县| 会同县| 石渠县| 汝阳县| 蒙城县| 通海县| 阿合奇县| 色达县| 福清市| 紫金县| 南郑县| 亳州市| 耒阳市| 刚察县| 涿鹿县| 台安县| 牡丹江市| 诸暨市| 中阳县| 英超| 泰来县| 龙游县| 克拉玛依市| 蕲春县| 崇州市| 弋阳县| 杨浦区| 乌兰县| 儋州市| 郑州市| 沁水县| 喀喇| 芜湖县| 宜君县| 凉城县| 贵州省| 冀州市| 安溪县| 新安县|