apache文件壓縮
ZipOutputStream zos = new ZipOutputStream(new FileOutputStream("d:\\test.zip"));
String test1="test1";
String test2="test2";
byte[] bytes1 = test1.getBytes("UTF-8");
byte[] bytes2 = test2.getBytes("UTF-8");
ZipEntry z1 = new ZipEntry("test1.txt");
zos.putNextEntry(z1);
zos.write(bytes1);
ZipEntry z2 = new ZipEntry("text2.txt");
zos.putNextEntry(z2);
zos.write(bytes2);
zos.closeEntry();
zos.close();
//流可以自己獲取
//java默認的包不支持中文(亂碼)
//使用apache的ZipOutputStream進行zip壓縮
㈡ java用apache的ZipEntry壓縮文件名為中文的word文件時,文件名亂碼
apache自帶的zip方法有缺陷,沒有做中文的判斷的,這個是它的一個已知bug。
解決辦法:用jdk的rt.jar裡面的方法實現就可以了。
可以參考下以下工具類:
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
/**
*
* @author gdb
*/
public class ZipUtilAll {
public static final int DEFAULT_BUFSIZE = 1024 * 16;
/**
* 解壓Zip文件
*
* @param srcZipFile
* @param destDir
* @throws IOException
*/
public static void unZip(File srcZipFile, String destDir) throws IOException
{
ZipFile zipFile = new ZipFile(srcZipFile);
unZip(zipFile, destDir);
}
/**
* 解壓Zip文件
*
* @param srcZipFile
* @param destDir
* @throws IOException
*/
public static void unZip(String srcZipFile, String destDir) throws IOException
{
ZipFile zipFile = new ZipFile(srcZipFile);
unZip(zipFile, destDir);
}
/**
* 解壓Zip文件
*
* @param zipFile
* @param destDir
* @throws IOException
*/
public static void unZip(ZipFile zipFile, String destDir) throws IOException
{
Enumeration<? extends ZipEntry> entryEnum = zipFile.entries();
ZipEntry entry = null;
while (entryEnum.hasMoreElements()) {
entry = entryEnum.nextElement();
File destFile = new File(destDir + entry.getName());
if (entry.isDirectory()) {
destFile.mkdirs();
}
else {
destFile.getParentFile().mkdirs();
InputStream eis = zipFile.getInputStream(entry);
System.out.println(eis.read());
write(eis, destFile);
}
}
}
/**
* 將輸入流中的數據寫到指定文件
*
* @param inputStream
* @param destFile
*/
public static void write(InputStream inputStream, File destFile) throws IOException
{
BufferedInputStream bufIs = null;
BufferedOutputStream bufOs = null;
try {
bufIs = new BufferedInputStream(inputStream);
bufOs = new BufferedOutputStream(new FileOutputStream(destFile));
byte[] buf = new byte[DEFAULT_BUFSIZE];
int len = 0;
while ((len = bufIs.read(buf, 0, buf.length)) > 0) {
bufOs.write(buf, 0, len);
}
} catch (IOException ex) {
throw ex;
} finally {
close(bufOs, bufIs);
}
}
/**
* 安全關閉多個流
*
* @param streams
*/
public static void close(Closeable... streams)
{
try {
for (Closeable s : streams) {
if (s != null)
s.close();
}
} catch (IOException ioe) {
ioe.printStackTrace(System.err);
}
}
/**
* @param args
* @throws java.lang.Exception
*/
public static void main(String[] args) throws Exception
{
// unZip(new File(ZipDemo.class.getResource("D:/123/HKRT-B2B.zip").toURI()), "D:/123/");
unZip("D:/123/123.zip", "D:/123/");
// new File();
}
}
㈢ 如何在 apache 中開啟 gzip 壓縮服務
伺服器設置 gzip 壓縮是 web 開發里很普遍的做法。假設你要請求一個 100k 的文件,網路傳輸速度為 50k/s,需要 2s 才能得到數據,但是如果在伺服器設置了 gzip 壓縮,將服務端的文件壓縮到了 50k(實際上的壓縮率往往小於 50%),這時候只需 1s 就能得到數據,然後在客戶端解壓即可。
可以對比下同一個文件在開啟 gzip 前後的大小。
gzip 壓縮前:
那麼如何在服務端開啟 gzip 服務呢?這里以 apache 為例簡單介紹下。
打開 apache 的 "httpd.conf" 文件,比如我的是在 "C:wampinapacheApache2.2.21conf" 目錄下。找到以下這一行,將它前面的注釋(#)去掉:
很多參考文件都提到同時要對 LoadMole headers_mole moles/mod_headers.so 去掉注釋,說 "如果不開啟這個,那網站就不能正常顯示了" ,不過我在測試過程中沒有去掉也沒有問題。
接著再添上以下代碼:
這樣就能對所有文件進行 gzip 壓縮了。壓縮等級是個 1-9 之間的整數,取值范圍在 1(最低) 到 9(最高)之間,不建議設置太高,雖然有很高的壓縮率,但是佔用更多的CPU資源。(本地測試了下 1 和 9 壓縮率差不了多少...)
實際開發中我們並不需要對所有文件進行壓縮,比如我們無需對圖片文件進行 gzip 壓縮,因為圖片文件(一般為 jpg、png等格式)本身已經壓縮過了,再進行 gzip 壓縮可能會適得其反(詳見 圖片要啟用gzip壓縮嗎?絕對不要!,背景圖片千萬不要gzip壓縮,尤其是PNG),類似的還有 PDF 以及音樂文件。所以我們可以設置過濾指定文件或者對指定文件進行壓縮。
比如我們要對圖片等特殊文件不進行 gzip 壓縮處理:
或者指定文件格式進行壓縮:
修改好後,保存 httpd.conf 文件,記得重啟 apache,再刷新瀏覽器看請求,應該已經生效了!