2012-03-13 74 views
1

這是我的第一份工作,所以不知道我的問題的說明如何恰當的..拆分的.gz文件到指定的文件的大小在Java中

下面是我寫拆分。廣州文件的程序基於每個文件的大小,用戶想要的文件。父.gz文件正在拆分,但不是代碼中指定的大小。 例如,在主要我說我想父文件被分割成大小爲1 MB的文件。但是在執行代碼時,它會被分割成n個不同大小的文件。有人能幫我指出我要出錯的地方嗎?任何幫助將是偉大的,因爲我已經用完了想法..

package com.bitsighttech.collection.packaging; 


import java.io.BufferedReader; 
import java.io.DataInputStream; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileOutputStream; 
import java.io.InputStreamReader; 
import java.util.ArrayList; 
import java.util.List; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 
import java.util.zip.GZIPInputStream; 
import java.util.zip.GZIPOutputStream; 

import org.apache.log4j.Logger; 

public class FileSplitter 
{ 
    private static Logger logger = Logger.getLogger(FileSplitter.class); 
    private static final long KB = 1024; 
    private static final long MB = KB * KB;   

    public List<File> split(File inputFile, String splitSize)  
    {  
     int expectedNoOfFiles =0;   
     List<File> splitFileList = new ArrayList<File>(); 
     try  
     {  
      double parentFileSizeInB = inputFile.length(); 
      Pattern p = Pattern.compile("(\\d+)\\s([MmGgKk][Bb])"); 
      Matcher m = p.matcher(splitSize); 
      m.matches(); 
      String FileSizeString = m.group(1); 
      System.out.println("FileSizeString----------------------"+FileSizeString); 
      String unit = m.group(2); 
      double fileSizeInMB = 0; 

      try { 
       if (unit.toLowerCase().equals("kb")) 
        fileSizeInMB = Double.parseDouble(FileSizeString)/KB;   
       else if (unit.toLowerCase().equals("mb")) 
        fileSizeInMB = Double.parseDouble(FileSizeString);     
       else if (unit.toLowerCase().equals("gb")) 
        fileSizeInMB = Double.parseDouble(FileSizeString) * KB;   
      } 
      catch (NumberFormatException e) { 
       logger.error("invalid number [" + fileSizeInMB + "] for expected file size"); 
      }    
      System.out.println("fileSizeInMB----------------------"+fileSizeInMB); 
      double fileSize = fileSizeInMB * MB; 
      long fileSizeInByte = (long) Math.ceil(fileSize); 
      double noOFFiles = parentFileSizeInB/fileSizeInByte; 
      expectedNoOfFiles = (int) Math.ceil(noOFFiles); 
      System.out.println("0000000000000000000000000"+expectedNoOfFiles); 
      GZIPInputStream in = new GZIPInputStream(new FileInputStream(inputFile));    
      DataInputStream datain = new DataInputStream(in); 
      BufferedReader fis = new BufferedReader(new InputStreamReader(datain)); 
      int count= 0 ; 
      int splinterCount = 1; 
      GZIPOutputStream outputFileWriter = null; 
      while ((count = fis.read()) != -1) 
      { 
       System.out.println("count----------------------1 "+count); 
       int outputFileLength = 0;  
       outputFileWriter = new GZIPOutputStream(new FileOutputStream("F:\\ff\\" + "_part_" + splinterCount + "_of_" + expectedNoOfFiles + ".gz")); 
       while ( (count = fis.read()) != -1 
         && outputFileLength < fileSizeInByte 
       ) {  

        outputFileWriter.write(count);  
        outputFileLength ++;  
        count = fis.read(); 

       } 
       System.out.println("count----------------------2 "+count); 
       //outputFileWriter.finish(); 
       outputFileWriter.close(); 
       splinterCount ++;  
      } 
      fis.close(); 
      datain.close(); 
      in.close(); 
      outputFileWriter.close(); 
      System.out.println("Finished"); 

     }catch(Exception e)  
     {  
      logger.error("Unable to split the file " + inputFile.getName() + " in to " + expectedNoOfFiles); 
      return null; 
     }  
     logger.debug("Successfully split the file [" + inputFile.getName() + "] in to " + expectedNoOfFiles + " files"); 
     return splitFileList; 
    }  

    public static void main(String args[]) 
    { 
     String filePath1 = "F:\\filename.gz"; 
     File file = new File(filePath1); 

     FileSplitter fileSplitter = new FileSplitter(); 
     String splitlen = "1 MB"; 
     int noOfFilesSplit = 3; 

     fileSplitter.split(file, splitlen); 

    } 
} 
+0

你究竟在做什麼?你是否想要讀取一個壓縮文件,然後讀出它的內容並嘗試創建一個獨立的zip文件(它看起來像這樣),或者你想將一個zip文件拆分爲多個,然後再將它們加入到一個文件中? (在這種情況下,你不必閱讀任何壓縮文件的內容,但只是拆分原始文件) – 2012-03-13 07:17:27

+0

我想要做後來的Prajeesh ..我試圖簡單地分裂.gz文件,然後將它合併..麻煩是重新組合的文件是以某種不可讀的編碼格式。因此,我嘗試讀取原始文件,將其解壓,然後重新組裝,這也失敗了。 – manil 2012-03-13 09:04:44

+0

如果仔細觀察,您的內部while循環將執行兩次讀取,在while循環結束時丟棄第一次讀取,然後在while循環條件下再次讀取,從而丟失一個字節的一個字節。 'while((count = fis.read())!= -1')應改爲'while(count!= -1'),並檢查你的原始郵編而不是閱讀內容 – 2012-03-13 09:41:49

回答

0

很難說,但它在我看來像你計算未壓縮的字節。壓縮塊(生成的文件)將更小。

+0

是真的,但事情是,父文件的文本也得到了分裂後扭曲..另外,父文件是15 MB,成爲3 MB壓縮時。 在使用分割(文件,字符串)函數來分割。廣州文件,更小的文件被創建,但數據混亂起來..你知道爲什麼這可能嗎? – manil 2012-03-13 08:43:29

0

如果壓縮用gzip數據輸出文件的大小取決於數據的複雜性。這裏你壓縮的是相同大小的塊,但是它們的壓縮大小是不同的。沒有無損壓縮算法通過一個常數因子來減小輸入的大小。

如果你想同等大小的碎片,你應該分裂,而不是首先解壓縮的壓縮數據。但是,這當然意味着碎片必須按順序解壓縮,並且不能在沒有讀取之前解壓縮碎片。

+0

謝謝你的反饋.. :)我主要集中在拆分(文件,字符串)功能,必須拆分將父文件放入大小爲1 MB的文件中,父文件正在分割,但是分成許多大小小於1 MB的文件,我不知道這是爲什麼或如何發生。 – manil 2012-03-13 08:39:27

1

Andreas的回答涵蓋了你的主要問題,但也有很多的代碼問題。最重要的是,你爲每個'分割'丟棄一個字節(外部調用fis.read()並忽略該值)。

如果你仍然一次讀取一個字節,你爲什麼要將你的gzip輸入流包裝在一個DataInputStream中 BufferedReader?

編輯

啊,而且你也扔了每個拆分的最後字節,太(除了最後一個)。