package Utility;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.zip.GZIPOutputStream;

public class FileUtility {

    
    //utility
	  public static void gzipFile(String source_filepath, String destinaton_zip_filepath) {
	  	byte[] buffer = new byte[1024];
	
			try {
				
				FileOutputStream fileOutputStream =new FileOutputStream(destinaton_zip_filepath);
	
				GZIPOutputStream gzipOuputStream = new GZIPOutputStream(fileOutputStream);
	
				FileInputStream fileInput = new FileInputStream(source_filepath);
	
				int bytes_read;
				
				while ((bytes_read = fileInput.read(buffer)) > 0) {
					gzipOuputStream.write(buffer, 0, bytes_read);
				}
	
				fileInput.close();
	
				gzipOuputStream.finish();
				gzipOuputStream.close();
	
				System.out.println("The file was compressed successfully!");
	
			} catch (IOException ex) {
				ex.printStackTrace();
			}
	  }
	  
	  
	  public static void gzipFiles(String folder, String splittedFilesExtension){
	  	try{
		    	File f = new File(folder);
		    	File[] listOfFiles = f.listFiles();
		    	
		        
		        for (File file : listOfFiles) {
		        	if(file.getName().endsWith(splittedFilesExtension)){
		        		gzipFile(file.getAbsolutePath(),folder+file.getName()+".gz");
		        		file.delete();
		        	}
		        }
		        
	  	}catch(Exception e){
	  		System.out.println(e.getMessage());
	  	}
	  }
	  
	  public static void mergeFiles(String folder, String output_filename, String splittedFilesExtension){
	  	try{
		    	OutputStream out = new FileOutputStream(output_filename);
		    	File f = new File(folder);
		    	File[] listOfFiles = f.listFiles();
		    	
		        byte[] buf = new byte[1 << 20];
		        for (File file : listOfFiles) {
		        	if(file.getName().endsWith(splittedFilesExtension)){
			            InputStream in = new FileInputStream(file);
			            int b = 0;
			            while ( (b = in.read(buf)) >= 0) {
			                out.write(buf, 0, b);
			                out.flush();
			            }
			            in.close();
			            file.delete();
		        	}
		        }
		        out.close();
		        
	  	}catch(Exception e){
	  		System.out.println(e.getMessage());
	  	}
	  }

}
