2012-03-13 5 views
1

で指定したファイルのサイズに.gzというファイルを分割..は、問題の私の記述があるかのaptのでわからない、これが私の最初の投稿ですジャワ

以下

私は.gzをファイルを分割するために書かれているプログラムです。各ファイルのサイズに基づいてファイルに変換します。親.gzファイルは分割されていますが、コードに指定されているサイズには分割されません。 例えば、メインでは、親ファイルをサイズ1MBのファイルに分割したいと言っています。しかし、コードを実行すると、それは異なるサイズの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ファイルを作成しようとしていますか?または、1つのzipファイルを複数に分割し、後でそれらを1つに結合したいですか? (その場合は、zipファイルの内容を読み取る必要はありませんが、元のファイルを分割するだけです) –

+0

私は後でPrajeeshをやりたいのですが、.gzファイルを分割して、再アセンブルされたファイルは、すべてが読み込めないエンコードされた形式であることを確認してください。だから元のファイルを読み込み、それを元に戻して再構築しようとしました。 – manil

+0

慎重に見れば、whileループは2回読み込みを行い、whileループの最後に最初の読み込みを破棄してからwhileループ状態で再び読み込み、1バイト分の1バイトが失われます。 'while(count = fis.read())!= -1'は' while(count!= -1')に変更し、内容を読むのではなく元のzipの読みを確認してください。 –

答えて

0

難解ですが、圧縮されていないバイト数をカウントしているように見えます。圧縮されたチャンク(結果のファイル)は小さくなります。

+0

分割(ファイル、文字列)関数を使用して.gzファイルを分割すると、親ファイルのテキストが分割された後に歪んでしまいます。小さなファイルが作成されていますが、データが混乱してしまいます。なぜこれが起こっているのか分かりませんか? – manil

0

gzipでデータを圧縮すると、出力ファイルのサイズはデータの複雑さによって異なります。ここでは、同じサイズのブロックを圧縮していますが、圧縮されたサイズは異なります。ロスレス圧縮アルゴリズムは、入力のサイズを一定の係数で減少させません。

同じサイズの破片が必要な場合は、最初に解凍するのではなく、圧縮されたデータを分割する必要があります。しかし、そのことはもちろん、破片が順番に解凍されなければならないことを意味し、前のものを読まずに解凍することはできません。

+0

フィードバックをいただきありがとうございます:)私は主に分割しなければならない分割(ファイル、文字列)関数に集中しています親ファイルはサイズが1MBのファイルに分割されますが、親ファイルは分割されていますが、1MBよりもはるかに小さいサイズのファイルに分割されています。 – manil

1

Andreasの回答があなたの主な質問をカバーしていますが、そのコードには多くの問題があります。最も重要なのは、それぞれの分割に対して1バイトを投げ捨てていることです(外側のwhileはfis.read()を呼び出して値を無視します)。

DataInputStreamでgzip入力ストリームをラップする理由は、一度にバイトを読み取っている場合は、 BufferedReaderです。

編集

ああ、あなたはあまりにも(非常に最後のものを除いて)、各分割の最後バイトを投げています。

関連する問題