Ⅰ 在線等回答,請速度,java中實現對文件夾的加密壓縮,就是說壓縮完後用解壓工具解壓時會提示輸入密碼。。
(1)網路傳輸狀況不好(如斷線過多,開的線程過多,伺服器人太多導致不能連接太多等)導致下載下來的文件損壞!
(2)站點提供的的RAR壓縮包本來就是損壞的(這個本站可以保證,所上傳的視頻及軟體等都經過好幾遍測試,絕對沒問題)。
(3)所使用的下載工具不夠完善,比如有的下載工具多開了幾個線程後,下載的收尾工作很慢,有些時候下載到99%時數據就不再傳輸了,一定要人工操作才能結束(先停止下載接著再開始)。筆者就碰到過好幾次這樣的情況。結果是文件下載下來以後解壓縮到快結束時CRC出錯。
解決方法:本站為防止這樣的事情發生,在每個壓縮包里又加了一個備份,防止因以上原因導致的下載後不能用,還得重新下載的問題,只要你下載下來的那個壓縮包里的備份是好的那就能把壓縮包里的文件恢復能用。
步驟一:雙擊打開需要解壓修復的壓縮包,選擇:工具——修復壓縮文件。
步驟二:出現下邊圖片的修復框,等待修復完成,關閉窗口及解壓縮窗口就可以了。
步驟三:這時你會發現你需要解壓的壓縮包旁邊多了一個壓縮包,名稱為:fixed.***(你下載的視頻名稱).rar ,這個壓縮包就是修復後的解壓縮包,如果修復成功,解壓這個名稱為:fixed.***(你下載的視頻名稱).rar 的壓縮包就可以了。
如果修復不成功,你再修復幾次看看,如果不行,只有再重新下載了
Ⅱ 用java小應用程序實現文件壓縮、解壓縮
40.ZIP壓縮文件
/*
import java.io.*;
import java.util.zip.*;
*/
//創建文件輸入流對象
FileInputStream fis=new FileInputStream(%%1);
//創建文件輸出流對象
FileOutputStream fos=new FileOutputStream(%%2);
//創建ZIP數據輸出流對象
ZipOutputStream zipOut=new ZipOutputStream(fos);
//創建指向壓縮原始文件的入口
ZipEntry entry=new ZipEntry(args[0]);
zipOut.putNextEntry(entry);
//向壓縮文件中輸出數據
int nNumber;
byte[] buffer=new byte[1024];
while((nNumber=fis.read(buffer))!=-1)
zipOut.write(buffer,0,nNumber);
//關閉創建的流對象
zipOut.close();
fos.close();
fis.close();
}
catch(IOException e)
{
System.out.println(e);
}
41.獲得應用程序完整路徑
String %%1=System.getProperty("user.dir");
42.ZIP解壓縮
/*
import java.io.*;
import java.util.zip.*;
*/
try{
//創建文件輸入流對象實例
FileInputStream fis=new FileInputStream(%%1);
//創建ZIP壓縮格式輸入流對象實例
ZipInputStream zipin=new ZipInputStream(fis);
//創建文件輸出流對象實例
FileOutputStream fos=new FileOutputStream(%%2);
//獲取Entry對象實例
ZipEntry entry=zipin.getNextEntry();
byte[] buffer=new byte[1024];
int nNumber;
while((nNumber=zipin.read(buffer,0,buffer.length))!=-1)
fos.write(buffer,0,nNumber);
//關閉文件流對象
zipin.close();
fos.close();
fis.close();
}
catch(IOException e) {
System.out.println(e);
}
43.遞歸刪除目錄中的文件
/*
import java.io.*;
import java.util.*;
*/
ArrayList<String> folderList = new ArrayList<String>();
folderList.add(%%1);
for (int j = 0; j < folderList.size(); j++) {
File file = new File(folderList.get(j));
File[] files = file.listFiles();
ArrayList<File> fileList = new ArrayList<File>();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
folderList.add(files[i].getPath());
} else {
fileList.add(files[i]);
}
}
for (File f : fileList) {
f.delete();
}
}
43.ZIP壓縮文件夾
/*
http://findjar.com/index.jsp
import java.io.*;
import org.apache.tools.zip.ZipOutputStream; //這個包在ant.jar里,要到官方網下載
//java.util.zip.ZipOutputStream
import java.util.zip.*;
*/
try {
String zipFileName = %%2; //打包後文件名字
File f=new File(%%1);
ZipOutputStream out = new ZipOutputStream(new FileOutputStream(zipFileName));
String base= "";
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;
while ( (b = in.read()) != -1) {
out.write(b);
}
in.close();
}
out.close();
}catch (Exception ex) {
ex.printStackTrace();
}
/*
切,我剛好寫了個壓縮的,但沒寫解壓的
1. 解壓的(參數兩個,第一個是你要解壓的zip文件全路徑,第二個是你解壓之後要存放的位置)
/*
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
*/
public class ZipFileList {
public static void main(String[] args) {
extZipFileList(args[0],args[1]);
}
private static void extZipFileList(String zipFileName, String extPlace) {
try {
ZipInputStream in = new ZipInputStream(new FileInputStream(
zipFileName));
ZipEntry entry = null;
while ((entry = in.getNextEntry()) != null) {
String entryName = entry.getName();
if (entry.isDirectory()) {
File file = new File(extPlace + entryName);
file.mkdirs();
System.out.println("創建文件夾:" + entryName);
} else {
FileOutputStream os = new FileOutputStream(extPlace
+ 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();
}
}
} catch (IOException e) {
}
System.out.println("解壓文件成功");
}
}
壓縮的(參數最少傳兩個,第一個是你壓縮之後的文件存放的位置以及名字,第二個是你要壓縮的文件或者文件夾所在位置,也可以傳多個文件或文件夾)
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
public class ZipFileOther {
public static String zipFileProcess(ArrayList outputZipFileNameList, String outputZipNameAndPath) {
ArrayList fileNames = new ArrayList();
ArrayList files = new ArrayList();
FileOutputStream fileOut = null;
ZipOutputStream outputStream = null;
FileInputStream fileIn = null;
StringBuffer sb = new StringBuffer(outputZipNameAndPath);
// FileInputStream fileIn =null;
try {
if (outputZipNameAndPath.indexOf(".zip") != -1) {
outputZipNameAndPath = outputZipNameAndPath;
} else {
sb.append(".zip");
outputZipNameAndPath = sb.toString();
}
fileOut = new FileOutputStream(outputZipNameAndPath);
outputStream = new ZipOutputStream(fileOut);
int outputZipFileNameListSize = 0;
if (outputZipFileNameList != null) {
outputZipFileNameListSize = outputZipFileNameList.size();
}
for (int i = 0; i < outputZipFileNameListSize; i++) {
File rootFile = new File(outputZipFileNameList.get(i).toString());
listFile(rootFile, fileNames, files, "");
}
for (int loop = 0; loop < files.size(); loop++) {
fileIn = new FileInputStream((File) files.get(loop));
outputStream.putNextEntry(new ZipEntry((String) fileNames.get(loop)));
byte[] buffer = new byte[1024];
while (fileIn.read(buffer) != -1) {
outputStream.write(buffer);
}
outputStream.closeEntry();
fileIn.close();
}
return outputZipNameAndPath;
} catch (IOException ioe) {
return null;
} finally {
if (outputStream != null) {
try {
outputStream.close();
} catch (IOException e) {
}
}
if (fileIn != null) {
try {
fileIn.close();
} catch (IOException e) {
}
}
}
}
public static void main(String[] args) {
ArrayList outputZipFileName=new ArrayList();
String savePath="";
int argSize = 0;
if (args != null) {
argSize = args.length;
}
if (argSize > 1) {
if(args[0]!=null)
savePath = args[0];
for(int i=1;i<argSize;i++){
if(args[i]!=null){
outputZipFileName.add(args[i]);
}
}
ZipFileOther instance=new ZipFileOther();
instance.zipFileProcess(outputZipFileName,savePath);
} else {
}
}
private static void listFile(File parentFile, List nameList, List fileList, String directoryName) {
if (parentFile.isDirectory()) {
File[] files = parentFile.listFiles();
for (int loop = 0; loop < files.length; loop++) {
listFile(files[loop], nameList, fileList, directoryName + parentFile.getName() + "/");
}
} else {
fileList.add(parentFile);
nameList.add(directoryName + parentFile.getName());
}
}
}
*/
Ⅲ 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變數是沒有用處的。
Ⅳ Java字元串的壓縮與解壓縮的兩種方法
在處理字元串時,尤其是當字元串長度過長時,我們需要考慮壓縮與解壓縮的方法以優化數據存儲和傳輸。文章將介紹兩種實現字元串壓縮與解壓的方法,適用於Java環境。
首先,可以使用Java8中的GZIP進行字元串的壓縮與解壓。這種方法基於Zlib壓縮演算法,適用於大多數情況。使用GZIP時,先將字元串轉換為位元組數組,然後使用GZIPOutputStream進行壓縮,最後將壓縮後的位元組數組存儲或傳輸。在解壓時,使用GZIPInputStream進行解壓縮,還原為原始字元串。
另一種方法是利用Apache Commons Codec庫中的Base64編碼。這種方法首先將字元串通過Base64編碼轉換為二進制格式,然後可以進行安全的存儲和傳輸。在接收端,使用Base64Decoder進行解碼,最後解碼後的結果通過Base64Decoder的nextBytes方法轉換回原始字元串。Base64編碼的額外一步可以提高數據傳輸的安全性和穩定性。
在應用這些方法時,需要特別注意一些細節。例如,在Web項目中,伺服器與前端通過HTTP進行數據交換時,可能會遇到Base64加密字元串在傳輸過程中被修改的問題。為了解決這個問題,可以將壓縮後的字元串通過Base64加密,然後再發送給前端。前端在接收到加密字元串後,使用Base64解密,解密後的字元串進行GZIP解壓,從而確保了數據的完整性和安全性。
綜上所述,通過使用GZIP壓縮和Base64編碼,可以在確保數據完整性的同時,有效地處理過長的字元串,節省存儲空間和優化數據傳輸效率。在實施這些方法時,務必遵循相應的編碼與解碼步驟,以避免數據丟失或解壓縮錯誤。
Ⅳ 用java讀取壓縮文件以byte數組形式傳送給C接收然後用c解壓 內存中出現大量空字元導致無法正確讀取zip,why
那你壓縮的時候出現問題,實際上你後期可以通過判斷是否為空字元來處理