有同事问我如何在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
Recent Comments