java - 在Java中将.gz文件分割成指定的文件大小

标签 java split gzip

这是我的第一篇文章,所以不确定我对问题的描述是否恰当..

下面是我编写的一个程序,用于根据用户想要的每个文件的大小将 .gz 文件拆分为多个文件。父 .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);  

    }  
}  

最佳答案

Andreas 的回答涵盖了您的主要问题,但该代码中存在很多问题。最重要的是,您会为每个“分割”丢弃一个字节(外部 while 调用 fis.read() 并忽略该值)。

如果您仍然一次读取一个字节,为什么要将 gzip 输入流包装在 DataInputStream 和 BufferedReader 中?

编辑

啊,你还扔掉了每个分割的最后字节(除了最后一个)。

关于java - 在Java中将.gz文件分割成指定的文件大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9679629/

相关文章:

java - 在这种特殊情况下,我们应该使用 Java 代码来选择数据还是使用存储过程?

html - 以 SEO 友好的方式分割 html 文本

pandas - 将大数据帧拆分为较小的相等数据帧

sql - 分割字符串并向下移动其余部分

javascript - 在 Angularjs+Typescript 中将 GZip Json 字符串解压缩为普通 Json 字符串

javascript - 我如何估计我的 gzip 脚本的大小?

ruby-on-rails - 如何在 Rails 4.2 中启用 gzip 文件创建?

java - 将偶数设置为 0,将奇数设置为 1

java - scope = ScopeType.PAGE 的新注释是什么?

java - OnCretae() 不算数