Thứ Hai, 6 tháng 3, 2006

ZipService version 1.6

- Support large data
- Install NIO -> compress more quickly

2 nhận xét:

  1. import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileFilter;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.nio.ByteBuffer;
    import java.nio.channels.FileChannel;
    import java.util.ArrayList;
    import java.util.List;
    import java.util.zip.ZipEntry;
    import java.util.zip.ZipInputStream;
    import java.util.zip.ZipOutputStream;

    /**
     * Author : Nhu Dinh Thuan
     * nhudinhthuan@yahoo.com
     * March 06, 2006
     * Version 1.6
     */
    public class ZipService {
      
      private final int BUFFER = 2048;
      
      private byte data[] = new byte[BUFFER]; 
      
      public void addToArchive(File input, File output, boolean containParent) throws Exception {  
        output = createFile(output, false);
        FileOutputStream fileOutput = new FileOutputStream(output);
        addToArchive(input, fileOutput, containParent); 
        fileOutput.close();
      }
      
      public ByteArrayOutputStream addToArchive(File input, boolean containParent)throws Exception {
        ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
        addToArchive(input, byteOutput, containParent).close();
        return byteOutput;
      }
      
      public ZipOutputStream addToArchive(File input, OutputStream output, boolean containParent)throws Exception{ 
        String path = input.getAbsolutePath();
        ZipOutputStream zipOutput = new ZipOutputStream(output);    
        
        List<File> list = listFile(input);    
        if(input.isDirectory()) list.remove(input);
        if( list == null || list.size() < 1) return zipOutput;
        for (File f : list) {      
          String filePath = f.getAbsolutePath();
          if (filePath.startsWith(path)){
            if(containParent && input.isDirectory())
              filePath = input.getName() + File.separator + filePath.substring(path.length()+1);          
            else if(input.isDirectory())
              filePath = filePath.substring(path.length()+1);
            else
              filePath = input.getName();
          }
          if(f.isFile()){
            addToArchive(zipOutput, new FileInputStream(f), filePath);
          }else {
            filePath += "/";
            addToArchive(zipOutput, (BufferedInputStream)null, filePath);
          }
            
        }    
        return zipOutput;
      }  
      
      public ByteArrayOutputStream addToArchive(InputStream input, String entryName)throws Exception{    
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        ZipOutputStream zipOutput = new ZipOutputStream(output);
        addToArchive(zipOutput, input, entryName);
        zipOutput.close();
        return output;
      }
      
      public ZipOutputStream addToArchive(ZipOutputStream zipOutput, InputStream input, String entryName)throws Exception{
        ZipEntry entry = new ZipEntry(entryName);    
        zipOutput.putNextEntry(entry);    
        if(input != null){    
          int count;
          while ((count = input.read(data, 0, BUFFER)) != -1) zipOutput.write(data, 0, count);  
        }    
        zipOutput.closeEntry();    
        return zipOutput;
      }
      
      public ZipOutputStream addToArchive(ZipOutputStream zipOutput, FileInputStream input, String entryName)throws Exception{
        ZipEntry entry = new ZipEntry(entryName);    
        System.out.println(entryName);
        zipOutput.putNextEntry(entry); 
        if(input == null){
          zipOutput.closeEntry();    
          return zipOutput;
        }    
        FileChannel fchan = input.getChannel();
        long fsize = fchan.size();
        int position = 0; 
        
        ByteBuffer buff = ByteBuffer.allocate(Math.min(data.length, (int)(fsize - position))); 
        while(position < fsize){
          fchan.read(buff);
          buff.rewind();      
          data = buff.array();  
          if(data != null && data.length > 0) zipOutput.write(data);    
          buff.clear(); 
          position += data.length;
        }
        fchan.close();        
        input.close(); 
        zipOutput.closeEntry();    
        return zipOutput;
      }
      
      public ZipOutputStream addToArchive(ZipOutputStream zipOutput, byte[] d, String entryName)throws Exception{    
        ZipEntry entry = new ZipEntry(entryName);    
        zipOutput.putNextEntry(entry);    
        if(d != null && d.length > 0) zipOutput.write(d);     
        zipOutput.closeEntry();    
        return zipOutput;
      }
      
      public void extractFromArchive(File input, String output) throws Exception {
        BufferedOutputStream dest = null;
        FileInputStream fileInput = new FileInputStream(input);
        ZipInputStream zipInput = new ZipInputStream(new BufferedInputStream(fileInput));
        ZipEntry entry;
        int count;    
        FileOutputStream fileOuput = null;
        while((entry = zipInput.getNextEntry()) != null) {
          if(entry.isDirectory())
            createFile(new File(output+entry.getName()),true);
          else{
            if(output != null)
              fileOuput = new FileOutputStream(createFile(new File(output+entry.getName()), false));
            else
              fileOuput = new FileOutputStream(createFile(new File(entry.getName()), false));
            dest = new BufferedOutputStream(fileOuput, BUFFER);
            while ((count = zipInput.read(data, 0, BUFFER)) != -1) dest.write(data, 0, count);
            dest.close();
          }
        }
        zipInput.close();
      }
      
      private File createFile(File file, boolean folder) throws Exception {
        if( file.getParentFile() != null) createFile( file.getParentFile(), true);
        if( file.exists()) return file;
        if( file.isDirectory() || folder) file.mkdir();
        else file.createNewFile();
        return file;
      }
      
      private List<File> listFile(File dir) {
        final List <File> list = new ArrayList<File>();    
        if(dir.isFile()) {
          list.add(dir);
          return list;
        }
        dir.listFiles(new FileFilter() {
          public boolean accept(File f) {
            if (f.isDirectory()) list.addAll(listFile(f));
            list.add(f);
            return true;
          }
        });
        return list;
      }
    }

    Trả lờiXóa
  2. import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileOutputStream;

    public class TestZipService {
      
      public static void main(String[] args) {   
        ZipService z = new ZipService();
        try{
          String taco = "toi dang thu ne";
          ByteArrayInputStream input = new ByteArrayInputStream(taco.getBytes());
          ByteArrayOutputStream out = z.addToArchive(input, "thuan.xml");
          input.close();
          out.writeTo(new FileOutputStream(new File("E:\\temp\\b.zip")));
          out.close();
          
          z.addToArchive(new File("E:\\temp"), new File("E:\\temp\\b.zip"), true);
          z.extractFromArchive(new File("E:\\temp\\b.zip"), "E:\\temp\\hahaah\\");
        }catch(Exception exp){
          exp.printStackTrace();
        }
      }

    }

    Trả lờiXóa

nhudinhthuan@gmail.com