import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
public class JZip {
public static int iCompressLevel;//壓縮比 取值范圍為0~
public static boolean bOverWrite;//是否覆蓋同名文件 取值范圍為True和False
@SuppressWarnings("unchecked")
private static ArrayList AllFiles = new ArrayList();
public static String sErrorMessage;
private String zipFilePath;
public List<File> srcMap;
public JZip () {
iCompressLevel = 9;
// bOverWrite=true;
}
public JZip(String zipFilePath) throws FileNotFoundException, IOException {
this.zipFilePath = zipFilePath;
}
@SuppressWarnings("unchecked")
public static ArrayList extract (String sZipPathFile , String sDestPath) {
ArrayList AllFileName = new ArrayList();
try {
//先指定壓縮檔的位置和檔名,建立FileInputStream對象
FileInputStream fins = new FileInputStream(sZipPathFile);
//將fins傳入ZipInputStream中
ZipInputStream zins = new ZipInputStream(fins);
ZipEntry ze = null;
byte ch[] = new byte[256];
while ((ze = zins.getNextEntry()) != null) {
File zfile = new File(sDestPath + ze.getName());
File fpath = new File(zfile.getParentFile().getPath());
if (ze.isDirectory()) {
if (!zfile.exists())
zfile.mkdirs();
zins.closeEntry();
} else {
if (!fpath.exists())
fpath.mkdirs();
FileOutputStream fouts = new FileOutputStream(zfile);
int i;
AllFileName.add(zfile.getAbsolutePath());
while ((i = zins.read(ch)) != -1)
fouts.write(ch, 0, i);
zins.closeEntry();
fouts.close();
}
}
fins.close();
zins.close();
sErrorMessage = "OK";
} catch (Exception e) {
System.err.println("Extract error:" + e.getMessage());
sErrorMessage = e.getMessage();
}
AllFiles.clear();
return AllFileName;
}
@SuppressWarnings({ "unchecked", "static-access" })
public static void compress (String sPathFile , boolean bIsPath , String sZipPathFile) {
try {
String sPath;
//先指定壓縮檔的位置及檔名,建立一個FileOutputStream
FileOutputStream fos = new FileOutputStream(sZipPathFile);
//建立ZipOutputStream並將fos傳入
ZipOutputStream zos = new ZipOutputStream(fos);
//設置壓縮比
zos.setLevel(iCompressLevel);
if (bIsPath == true) {
searchFiles(sPathFile);
sPath = sPathFile;
} else {
File myfile = new File(sPathFile);
sPath = sPathFile.substring(0, sPathFile.lastIndexOf(myfile.separator) + 1);
AllFiles.add(myfile);
}
Object[] myobject = AllFiles.toArray();
ZipEntry ze = null;
//每個檔案要壓縮,都要透過ZipEntry來處理
FileInputStream fis = null;
BufferedReader in = null;
//byte[] ch = new byte[256];
for (int i = 0 ; i < myobject.length ; i++) {
File myfile = (File) myobject[i];
if (myfile.isFile()) {
in = new BufferedReader(new InputStreamReader(new FileInputStream(myfile.getPath()),"iso8859-1"));
//以檔案的名字當Entry,也可以自己再加上額外的路徑
//例如ze=new ZipEntry("test\\"+myfiles[i].getName());
//如此壓縮檔內的每個檔案都會加test這個路徑
ze = new ZipEntry(myfile.getPath().substring((sPath).length()));
//將ZipEntry透過ZipOutputStream的putNextEntry的方式送進去處理
fis = new FileInputStream(myfile);
zos.putNextEntry(ze);
int len = 0;
//開始將原始檔案讀進ZipOutputStream
while ((len = in.read()) != -1) {
zos.write(len);
}
fis.close();
zos.closeEntry();
}
}
zos.close();
fos.close();
AllFiles.clear();
sErrorMessage = "OK";
} catch (Exception e) {
System.err.println("Compress error:" + e.getMessage());
sErrorMessage = e.getMessage();
}
}
/*
這是一個遞歸過程,功能是檢索出所有的文件名稱
dirstr:目錄名稱
*/
@SuppressWarnings("unchecked")
private static void searchFiles (String dirstr) {
File tempdir = new File(dirstr);
if (tempdir.exists()) {
if (tempdir.isDirectory()) {
File[] tempfiles = tempdir.listFiles();
for (int i = 0 ; i < tempfiles.length ; i++) {
if (tempfiles[i].isDirectory())
searchFiles(tempfiles[i].getPath());
else {
AllFiles.add(tempfiles[i]);
}
}
} else {
AllFiles.add(tempdir);
}
}
}
public String getZipFilePath() {
return zipFilePath;
}
public void setZipFilePath(String zipFilePath) {
this.zipFilePath = zipFilePath;
}
/**
* 解析zip文件得到文件名
* @return
* @throws FileNotFoundException
* @throws IOException
*/
public boolean parserZip() throws FileNotFoundException, IOException {
FileInputStream fis = new FileInputStream(zipFilePath);
ZipInputStream zis = new ZipInputStream(new BufferedInputStream(fis));
ZipEntry entry;
try {
srcMap = new ArrayList<File>();
while ((entry = zis.getNextEntry()) != null) {
File file = new File(zipFilePath + File.separator + entry.getName());
srcMap.add(file);
}
zis.close();
fis.close();
return true;
} catch (IOException e) {
return false;
}
}
/**
*
* @param zipFileName 待解壓縮的ZIP文件
* @param extPlace 解壓後的文件夾
*/
public static void extZipFileList(String zipFileName, String extPlace) {
try {
ZipInputStream in = new ZipInputStream(new FileInputStream(
zipFileName));
File files = new File(extPlace);
files.mkdirs();
ZipEntry entry = null;
while ((entry = in.getNextEntry()) != null) {
String entryName = entry.getName();
if (entry.isDirectory()) {
File file = new File(files + entryName);
file.mkdirs();
System.out.println("創建文件夾:" + entryName);
} else {
OutputStream os = new FileOutputStream(files+File.separator + entryName);
// Transfer bytes from the ZIP file to the output file
byte[] buf = new byte[1024];
int len;
while ((len = in.read(buf)) > 0) {
os.write(buf, 0, len);
}
os.close();
in.closeEntry();
System.out.println("解壓文件:" + entryName);
}
}
} catch (IOException e) {
}
}
@SuppressWarnings("static-access")
public static void main(String args[]){
}
}
B. java 如何實現 十六進制 轉為壓縮 BCD碼。
用和底層程序員,因為和二進制對鏈姿應著,比如匯編語言
二進制適合CPU使用,因為所有的數據纖喚租和代碼最終都是二進制的。
竅門沒有,常見的記住就行了毀兆。
8進制我很少見到
C. java讀取文件內容並生成壓縮BCD格式
您的排序與zip排序不一樣。
所以第一步應該得到所有名稱,然後再按照新的順序來讀猜亂螞
如果只是解壓到某處,穗埋新的順序一點用處陪消都沒有!
D. 搭建Java環境如何解壓縮
具體解壓縮方法如下:
Java壓縮解壓縮文件的方法有,第一中藉助javajdk自帶的ZipOutputStream和ZipInputStream。第二種,藉助第三方jar,例如ApacheCommonsCompress和Ant。
前提,需要將Ant的ant、jar和ant-launcher、jar添加到classpath中。先創建一個Expander類,該類繼承了Ant的org、apache、tools、ant、taskdefs、Expand類。
第二步:使用Expander類。
E. 什麼是壓縮BCD碼和非壓縮BCD碼
壓縮BCD碼是用四位二進制數表示一位BCD碼,用一個位元組表示的兩位BCD碼,即一個位元組存放兩個十進制數位,想到壓縮BCD碼更節省存儲空間。
非壓縮BCD碼:非壓縮型BCD碼一個位元組可存放一個一位十進制數,其中高4位逗跡的內容不做規定(也有部分書籍要求為0,二者均可),低4位二進製表示該位碰漏十進制數。
非壓縮BCD碼在匯編笑指爛中的調整指令為AAA(加法的ASCII碼調整)、AAS(減法的ASCII碼調整)、AAM(乘法的ASCII碼調整)、AAD(除法的ASCII碼調整)。
(5)java壓縮bcd擴展閱讀:
調試時使用的數據:
ORG 0000H
MOV 20H, #12H ;假設被加數NA是563412
MOV 21H, #34H
MOV 22H, #56H
MOV 30H, #77H ;假設加數NB是998877
MOV 31H, #88H
MOV 32H, #99H
LCALL ADD3B ;調用3位元組加法子程序
SJMP $ ;相加結束,暫停,此時可以觀察到和的數值:1562289
F. java字元串經過bcd壓縮後怎麼傳輸
解決方法:
據我所知,您目前的做法是:
>使用getBytes(「UTF-8」)將String轉換為位元組數組.
>壓縮位元組數組
>使用新的String(位元組,…,「UTF-8」)將壓縮位元組數組轉換為String.
>傳輸壓縮字元串
>接收壓縮字元串
>使用getBytes(「UTF-8」)將壓縮字元串轉換為位元組數組.
>解壓縮位元組數組
>使用新的String(bytes,…,「UTF-8」)將解壓縮的位元組數組轉換為String.
這種方法的問題在於步驟3.壓縮位元組數組時,您創建的位元組序列可能不再是有效的UTF-8.結果將是步驟3中的例外.
解決方案是使用像Base64這樣的「位元組到字元」編碼方案將壓縮位元組轉換為可傳輸的字元串.換句話說,用調用Base64編碼函數代替步驟3,用調用Base64解碼函數代替步驟6.
筆記:
>對於小弦,壓縮和
編碼很可能實際上
增加傳輸字元串的大小.
>如果要將壓縮的字元串合並到URL中,您可能希望為Base64選擇不同的編碼,以避免需要進行URL轉義的字元.
>根據您傳輸的數據的性質,您可能會發現特定於域的壓縮比通用壓縮更好.考慮在創建以逗號分隔的字元串之前壓縮數據.考慮以逗號分隔的字元串的替代方法.
G. JAVA 壓縮和序列化
壓縮和序列化主要用在數據的存儲和傳輸上,二者都是由IO流相關知識實現,這里統一介紹下。
全部章節傳送門:
Java I/O類支持讀寫壓縮格式的數據流,你可以用他們對其他的I/O流進行封裝,以提供壓縮功能。
GZIP介面比較簡單,適合對單個數據流進行壓縮,在Linux系統中使用較多。
ZIP格式可以壓縮多個文件,而且可以和壓縮工具進行協作,是經常使用的壓縮方法。
JAR(Java Archive,Java 歸檔文件)是與平台無關的文件格式,它允許將許多文件組合成一個壓縮文件。為 J2EE 應用程序創建的 JAR 文件是 EAR 文件(企業 JAR 文件)。
JAR 文件格式以流行的 ZIP 文件格式為基礎。與 ZIP 文件不同的是,JAR 文件不僅用於壓縮和發布,而且還用於部署和封裝庫、組件和插件程序,並可被像編譯器和 JVM 這樣的工具直接使用。在 JAR 中包含特殊的文件,如 manifests 和部署描述符,用來指示工具如何處理特定的 JAR。
如果一個Web應用程序的目錄和文件非常多,那麼將這個Web應用程序部署到另一台機器上,就不是很方便了,我們可以將Web應用程序打包成Web 歸檔(WAR)文件,這個過程和把Java類文件打包成JAR文件的過程類似。利用WAR文件,可以把Servlet類文件和相關的資源集中在一起進行發布。在這個過程中,Web應用程序就不是按照目錄層次結構來進行部署了,而是把WAR文件作為部署單元來使用。
一個WAR文件就是一個Web應用程序,建立WAR文件,就是把整個Web應用程序(不包括Web應用程序層次結構的根目錄)壓縮起來,指定一個.war擴展名。下面我們將第2章的Web應用程序打包成WAR文件,然後發布
要注意的是,雖然WAR文件和JAR文件的文件格式是一樣的,並且都是使用jar命令來創建,但就其應用來說,WAR文件和JAR文件是有根本區別的。JAR文件的目的是把類和相關的資源封裝到壓縮的歸檔文件中,而對於WAR文件來說,一個WAR文件代表了一個Web應用程序,它可以包含 Servlet、HTML頁面、Java類、圖像文件,以及組成Web應用程序的其他資源,而不僅僅是類的歸檔文件。
在命令行輸入jar即可查看jar命令的使用方法。
把對象轉換為位元組序列的過程稱為對象的序列化。把位元組序列恢復為對象的過程稱為對象的反序列化。
對象的序列化主要有兩種用途:
java.io.ObjectOutputStream代表對象輸出流,它的writeObject(Object obj)方法可對參數指定的obj對象進行序列化,把得到的位元組序列寫到一個目標輸出流中。
java.io.ObjectInputStream代表對象輸入流,它的readObject()方法從一個源輸入流中讀取位元組序列,再把它們反序列化為一個對象,並將其返回。
只有實現了Serializable的對象才能被序列化。對象序列化包括如下步驟:
對象反序列化的步驟如下:
創建一個可以可以序列化的對象。
然後進行序列化和反序列化測試。
serialVersionUID: 字面意思上是序列化的版本號,凡是實現Serializable介面的類都有一個表示序列化版本標識符的靜態變數。
JAVA序列化的機制是通過判斷類的serialVersionUID來驗證的版本一致的。在進行反序列化時,JVM會把傳來的位元組流中的serialVersionUID於本地相應實體類的serialVersionUID進行比較。如果相同說明是一致的,可以進行反序列化,否則會出現反序列化版本一致的異常,即是InvalidCastException。
為了提高serialVersionUID的獨立性和確定性,強烈建議在一個可序列化類中顯示的定義serialVersionUID,為它賦予明確的值。
控制序列化欄位還可以使用Externalizable介面替代Serializable借口。此時需要定義一個默認構造器,否則將為得到一個異常(java.io.InvalidClassException: Person; Person; no valid constructor);還需要定義兩個方法(writeExternal()和readExternal())來控制要序列化的欄位。
如下為將Person類修改為使用Externalizable介面。
transient修飾符僅適用於變數,不適用於方法和類。在序列化時,如果我們不想序列化特定變數以滿足安全約束,那麼我們應該將該變數聲明為transient。執行序列化時,JVM會忽略transient變數的原始值並將默認值(引用類型就是null,數字就是0)保存到文件中。因此,transient意味著不要序列化。
靜態變數不是對象狀態的一部分,因此它不參與序列化。所以將靜態變數聲明為transient變數是沒有用處的。
H. 編程時什麼是壓縮BCD碼 非壓縮BCD碼
BCD碼雹盯悄是一一對應的,如:
十進制的123 用BCD表示為:0001 0010 0011
因為:
十進制的 1 用二進製表示是 0001
十進制的 2 用二進製表示是 0010
十進制的 3 用二進製表示是 0011
與二進制的區別:
123的二進制應該用短除法求得1111011
由此可見,BCD碼只是機械地用二進製表示十進制的每一位。
壓縮與非壓縮:
由於1位元組有8bit(8個0或1)
如果用一位元組存儲4位BCD碼(其餘補0)就是非壓縮
如源渣 十進制的123:00000001 00000010 0011
如果用一位元組存儲8位BCD碼就是壓縮
如 十則州進制的123:0001 0010 0011
I. java怎樣壓縮文件夾
壓縮文件夾代碼:
import java.io.File;
import org.apache.tools.zip.ZipOutputStream; //這個包在ant.jar里,要到官方網下載
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipEntry;
public class CompressBook {
public CompressBook() {}
/*
* inputFileName 輸入一個文件夾
* zipFileName 輸出一個壓縮文件夾
*/
public void zip(String inputFileName) throws Exception {
String zipFileName = "c:\\test.zip"; //打包後文件名字
System.out.println(zipFileName);
zip(zipFileName, new File(inputFileName));
}
private void zip(String zipFileName, File inputFile) throws Exception {
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
zip(out, inputFile, "");
System.out.println("zip done");
out.close();
}
private void zip(ZipOutputStream out, File f, String base) throws Exception {
if (f.isDirectory()) {
File[] fl = f.listFiles();
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base + "/"));
base = base.length() == 0 ? "" : base + "/";
for (int i = 0; i < fl.length; i++) {
zip(out, fl[i], base + fl[i].getName());
}
}else {
out.putNextEntry(new org.apache.tools.zip.ZipEntry(base));
FileInputStream in = new FileInputStream(f);
int b;
System.out.println(base);
while ( (b = in.read()) != -1) {
out.write(b);
}
in.close();
}
}
public static void main(String [] temp){
CompressBook book = new CompressBook();
try {
book.zip("c:\\c");//你要壓縮的文件夾
}catch (Exception ex) {
ex.printStackTrace();
}
}
}
J. 什麼是壓縮BCD碼
壓縮BCD碼指二進制編碼的十進制
壓縮BCD碼指一個位元組8位存儲2位BCD碼。比如32用8421BCD碼表示如下:非壓縮BCD碼表示:00000011 00000010;壓縮BCD碼表示:0011 0010;使用BCD碼表示10進位制數字比較好理解,且佔用空間較小,在用數字表示的數據方面得到廣泛應用。如果聽到「原長度10個位元組,用壓縮BCD碼表示為5個位元組」也就好理解了。比如「1234567890",即可以說用壓縮腔或碼BCD碼表示為5個位元組。
(10)java壓縮bcd擴展閱讀:
壓縮BCD碼的應用:BCD計數器也稱為十進位計數器或模10計數器,它廣泛地運用於各種電子設備中。特別是在測試儀表以及另外那些具有十進制輸入與/或輸出的設備中.運用得更普遍。數字計數器.萬用表以及其它數字儀表,就是一類例子;數字電子表是另外一類例子。這與一個標准四位二進制計數器的前十個狀團春態相同。不過,當計數器伍哪計9時,它循環回到0,然後它又重新開始遞增計數。