如何在oracle里实现zip压缩

| No Comments

有同事问我如何在oracle里实现zip压缩?他说utl_compress不支持zip格式的文件。

 

其实在oracle里用java存储过程就可以实现zip压缩了,我们来看一个例子,在这个例子里函数F_SYS_FILE_TO_ZIP用于将一个指定文件压缩为一个zip文件,函数F_SYS_FILES_TO_ZIP用于将一个文件夹内的所有文件都压缩为一个zip文件:

 

SQL> create or replace and compile java source named zip as

  2  import java.io.File;

  3  import java.io.FileInputStream;

  4  import java.io.FileOutputStream;

  5  import java.io.IOException;

  6  import java.util.ArrayList;

  7  import java.util.List;

  8  import java.util.zip.ZipEntry;

  9  import java.util.zip.ZipOutputStream;

 10 

 11  public class ZipFile

 12  {

 13    //将一个指定文件压缩为一个zip文件

 14    public static String FileToZip(String FileName, String zipFileName, String isDelete)

 15    {

 16      ArrayList fileNames = new ArrayList(); // 存放文件名,并非含有路径的名字

 17      ArrayList files = new ArrayList(); // 存放文件对象

 18      try

 19      {

 20        FileOutputStream fileOut = new FileOutputStream(zipFileName);

 21        ZipOutputStream outputStream = new ZipOutputStream(fileOut);

 22 

 23        File dirFile = new File(FileName);

 24        listFile(dirFile, fileNames, files);

 25        for (int loop=0; loop<files.size(); loop++)

 26        {

 27          FileInputStream fileIn = new FileInputStream((File)files.get(loop));

 28          outputStream.putNextEntry(new ZipEntry((String)fileNames.get(loop)));

 29          byte[] buffer = new byte[1024];

 30          int len = fileIn.read(buffer);

 31          while (len != -1)

 32          {

 33            outputStream.write(buffer,0,len);

 34            len = fileIn.read(buffer);

 35          }

 36 

 37          outputStream.closeEntry();

 38          fileIn.close();

 39        }

 40        outputStream.close();

 41 

 42        //删除该源文件

 43        if ( isDelete.equalsIgnoreCase("true") == true )

 44        {

 45          dirFile.delete();

 46        }

 47 

 48        return "OK";

 49      }

 50      catch (IOException ioe)

 51      {

 52        ioe.printStackTrace();

 53        return "Error Occur: " + ioe ;

 54      }

 55    }

 56 

 57    //将一个文件夹内的所有文件都压缩为一个zip文件

 58    public static String FilesToZip(String dir, String zipFileName, String isDelete)

 59    {

 60      ArrayList fileNames = new ArrayList(); // 存放文件名,并非含有路径的名字

 61      ArrayList files = new ArrayList(); // 存放文件对象

 62      try

 63      {

 64        FileOutputStream fileOut = new FileOutputStream(zipFileName);

 65        ZipOutputStream outputStream = new ZipOutputStream(fileOut);

 66 

 67        File dirFile = new File(dir);

 68        listFile(dirFile, fileNames, files);

 69        for (int loop=0; loop<files.size(); loop++)

 70        {

 71          FileInputStream fileIn = new FileInputStream((File)files.get(loop));

 72          outputStream.putNextEntry(new ZipEntry((String)fileNames.get(loop)));

 73          byte[] buffer = new byte[1024];

 74          int len = fileIn.read(buffer);

 75          while (len != -1)

 76          {

 77            outputStream.write(buffer,0,len);

 78            len = fileIn.read(buffer);

 79          }

 80 

 81          outputStream.closeEntry();

 82          fileIn.close();

 83        }

 84        outputStream.close();

 85 

 86        //删除该目录内被压缩的源文件

 87        if ( isDelete.equalsIgnoreCase("true") == true )

 88        {

 89          for (int loop=0; loop<files.size(); loop++)

 90          {

 91            ((File)files.get(loop)).delete();

 92          }

 93        }

 94 

 95        return "OK";

 96      }

 97      catch (IOException ioe)

 98      {

 99        ioe.printStackTrace();

100        return "Error Occur: " + ioe ;

101      }

102    }

103 

104    static void  listFile(File parentFile, List nameList, List fileList)

105    {

106      if (parentFile.isDirectory())

107      {

108        File[] files = parentFile.listFiles();

109        for (int loop=0; loop<files.length; loop++)

110        {

111          listFile(files[loop], nameList, fileList);

112        }

113      }

114      else

115      {

116        fileList.add(parentFile);

117        nameList.add(parentFile.getName());

118      }

119    }

120  }

121  /

 

Java created

 

SQL> CREATE OR REPLACE Function F_SYS_FILE_TO_ZIP(FileName varchar2, zipFileName varchar2, isDelete varchar2)

  2    return varchar2

  3      as language java

  4        name 'ZipFile.FileToZip(java.lang.String, java.lang.String, java.lang.String) return java.lang.String';

  5  /

 

Function created

 

SQL> CREATE OR REPLACE Function F_SYS_FILES_TO_ZIP(dir varchar2, zipFileName varchar2, isDelete varchar2)

  2    return varchar2

  3      as language java

  4        name 'ZipFile.FilesToZip(java.lang.String, java.lang.String, java.lang.String) return java.lang.String';

  5  /

 

Function created

 

sys@IPRA>grant JAVASYSPRIV to ipra;

 

Grant succeeded.

 

$ pwd

/u01/iprainterfacefile

 

$ ls -l |grep SAT.CA

-rw-r--r--   1 oracle   dba            4174 Sep 03 16:31 SAT.CA.20090903.00000030.IN

-rw-r--r--   1 oracle   dba          142056 Sep 18 09:07 SAT.CA.20090918.00000050.IN

 

$ cp SAT.CA.20090918.00000050.IN SAT.CA.20090918.00000050.bck

 

$ ls -l |grep SAT.CA

-rw-r--r--   1 oracle   dba            4174 Sep 03 16:31 SAT.CA.20090903.00000030.IN

-rw-r--r--   1 oracle   dba          142056 Sep 18 09:07 SAT.CA.20090918.00000050.IN

-rw-r--r--   1 oracle   dba          142056 Nov 06 18:08 SAT.CA.20090918.00000050.bck

 

现在我要将文件SAT.CA.20090918.00000050.IN压缩成SAT.CA.20090918.00000050.IN.zip,同时保留源文件:

SQL> var tempstr varchar2(200);

 

SQL> begin

  2  :tempstr := F_SYS_FILE_TO_ZIP('/u01/iprainterfacefile/SAT.CA.20090918.00000050.IN','/u01/iprainterfacefile/SAT.CA.20090918.

00000050.IN.zip','false');

  3  end;

  4  /

 

PL/SQL procedure successfully completed

tempstr

---------

OK

 

压缩完后我们去看一下效果:

$ ls -l |grep SAT.CA

-rw-r--r--   1 oracle   dba            4174 Sep 03 16:31 SAT.CA.20090903.00000030.IN

-rw-r--r--   1 oracle   dba          142056 Sep 18 09:07 SAT.CA.20090918.00000050.IN

-rw-r--r--   1 oracle   dba         14580 Nov 06 18:13 SAT.CA.20090918.00000050.IN.zip

-rw-r--r--   1 oracle   dba          142056 Nov 06 18:08 SAT.CA.20090918.00000050.bck

 

现在我再次将文件SAT.CA.20090918.00000050.IN压缩成SAT.CA.20090918.00000050.IN.zip同时不保留源文件:

SQL> begin

  2  :tempstr := F_SYS_FILE_TO_ZIP('/u01/iprainterfacefile/SAT.CA.20090918.00000050.IN','/u01/iprainterfacefile/SAT.CA.20090918.

00000050.IN.zip','true');

  3  end;

  4  /

 

PL/SQL procedure successfully completed

tempstr

---------

OK

 

压缩完后我们再去看一下效果:

$ ls -l |grep SAT.CA

-rw-r--r--   1 oracle   dba            4174 Sep 03 16:31 SAT.CA.20090903.00000030.IN

-rw-r--r--   1 oracle   dba         14580 Nov 06 18:18 SAT.CA.20090918.00000050.IN.zip

-rw-r--r--   1 oracle   dba          142056 Nov 06 18:08 SAT.CA.20090918.00000050.bck

 

$ cp SAT.CA.20090918.00000050.bck SAT.CA.20090918.00000050.IN

Leave a comment