這是我的第一份工作,所以不知道我的問題的說明如何恰當的..拆分的.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);
}
}
你究竟在做什麼?你是否想要讀取一個壓縮文件,然後讀出它的內容並嘗試創建一個獨立的zip文件(它看起來像這樣),或者你想將一個zip文件拆分爲多個,然後再將它們加入到一個文件中? (在這種情況下,你不必閱讀任何壓縮文件的內容,但只是拆分原始文件) – 2012-03-13 07:17:27
我想要做後來的Prajeesh ..我試圖簡單地分裂.gz文件,然後將它合併..麻煩是重新組合的文件是以某種不可讀的編碼格式。因此,我嘗試讀取原始文件,將其解壓,然後重新組裝,這也失敗了。 – manil 2012-03-13 09:04:44
如果仔細觀察,您的內部while循環將執行兩次讀取,在while循環結束時丟棄第一次讀取,然後在while循環條件下再次讀取,從而丟失一個字節的一個字節。 'while((count = fis.read())!= -1')應改爲'while(count!= -1'),並檢查你的原始郵編而不是閱讀內容 – 2012-03-13 09:41:49