package com.e2u.tree;
import java.io.*;
import com.e2u.bit.BitUtil;
public class FileDeflater
{
private CGFileHeader header = null;
private HuffmanTree hfTree = null;
private String inputFileName = null;
private String outputFileName = null;
private Deflater deflater = null;
public FileDeflater(String inFile, String outFile)
{
this.inputFileName = inFile;
this.outputFileName = outFile;
//Construct File Header construct
header = new CGFileHeader();
//Init file name filed
byte[] fileNameInBytes = inputFileName.getBytes();
if(fileNameInBytes.length > CGFileHeader.FILE_NAME_SIZE_BY_BYTE)
{
throw new IllegalArgumentException("The File name " + inputFileName + " is longer than " + CGFileHeader.FILE_NAME_SIZE_BY_BYTE);
}
for(int i = 0; i < fileNameInBytes.length; i++)
{
header.originalFileName[i] = fileNameInBytes[i];
}
//Init file length;
File file = new File(inputFileName);
header.originalLength = (int)file.length();
try
{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFileName));
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int bytesNumRead = 0;
while((bytesNumRead = bis.read(buffer)) != -1)
{
for(int i = 0; i < bytesNumRead; i++)
{
header.weightTable[BitUtil.unsigned(buffer[i])]++;
}
}
bis.close();
}
catch(Exception e)
{
e.printStackTrace();
}
hfTree = new HuffmanTree(header.weightTable);
deflater = new Deflater(hfTree.getEncodeTable());
}
public void compress()
{
try
{
BufferedInputStream bis = new BufferedInputStream(new FileInputStream(inputFileName));
int bufferSize = 4096;
byte[] buffer = new byte[bufferSize];
int bytesNumRead = 0;
while((bytesNumRead = bis.read(buffer)) != -1)
{
deflater.addCompressInputData(buffer, bytesNumRead);
}
bis.close();
}
catch(Exception e)
{
e.printStackTrace();
}
byte[] encodeData = deflater.finishCompress();
try
{
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(outputFileName));
bos.write(header.getBytes());
bos.write(encodeData);
bos.flush();
bos.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
String input = "input.txt";
String output = "output.cg";
if(args != null && args.length >= 2)
{
input = args[0];
output = args[1];
}
FileDeflater fdf = new FileDeflater(input, output);
fdf.compress();
}
}