樓主是說(shuō)解壓了的文件大小只有33.1MB,但是卻占了51.2MB的空間嗎?
專(zhuān)注于為中小企業(yè)提供做網(wǎng)站、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)龍勝免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長(zhǎng),幫助中小企業(yè)通過(guò)網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
如果是這個(gè)意思的話(huà),那我要告訴樓主,首先這個(gè)問(wèn)題和JAVA沒(méi)有關(guān)系,根據(jù)你的截圖,可以斷定你用的是FAT32文件系統(tǒng)。這只是文件存儲(chǔ)的形式,很正常。
簡(jiǎn)單的說(shuō),磁盤(pán)存儲(chǔ)數(shù)據(jù)的最小單位是簇,比方說(shuō)你的簇大小為128K,一個(gè)簇只能存放一個(gè)文件,然后你的一個(gè)文件只有16K,它占了這個(gè)簇,然后還有112K沒(méi)有用,是吧。但是那112K就不能再存放其它文件了。如果要存放其它文件,就要占另一個(gè)簇。
樓主,懂了吧,這跟簇的大小有關(guān),但是也不是簇越小越好,簇越小,讀寫(xiě)性能都有所下降。這是正常現(xiàn)象。如果你非覺(jué)得不舒服,那就用NTFS文件系統(tǒng)吧,把壓縮打開(kāi),就不會(huì)有這種情況了,希望對(duì)你有幫助
有三種方式實(shí)現(xiàn)java壓縮:
1、jdk自帶的包java.util.zip.ZipOutputStream,不足之處,文件(夾)名稱(chēng)帶中文時(shí),出現(xiàn)亂碼問(wèn)題,實(shí)現(xiàn)代碼如下:
/**
* 功能:把 sourceDir 目錄下的所有文件進(jìn)行 zip 格式的壓縮,保存為指定 zip 文件
* @param sourceDir 如果是目錄,eg:D:\\MyEclipse\\first\\testFile,則壓縮目錄下所有文件;
* 如果是文件,eg:D:\\MyEclipse\\first\\testFile\\aa.zip,則只壓縮本文件
* @param zipFile 最后壓縮的文件路徑和名稱(chēng),eg:D:\\MyEclipse\\first\\testFile\\aa.zip
*/
public File doZip(String sourceDir, String zipFilePath) throws IOException {
File file = new File(sourceDir);
File zipFile = new File(zipFilePath);
ZipOutputStream zos = null;
try {
// 創(chuàng)建寫(xiě)出流操作
OutputStream os = new FileOutputStream(zipFile);
BufferedOutputStream bos = new BufferedOutputStream(os);
zos = new ZipOutputStream(bos);
String basePath = null;
// 獲取目錄
if(file.isDirectory()) {
basePath = file.getPath();
}else {
basePath = file.getParent();
}
zipFile(file, basePath, zos);
}finally {
if(zos != null) {
zos.closeEntry();
zos.close();
}
}
return zipFile;
}
/**
* @param source 源文件
* @param basePath
* @param zos
*/
private void zipFile(File source, String basePath, ZipOutputStream zos)
throws IOException {
File[] files = null;
if (source.isDirectory()) {
files = source.listFiles();
} else {
files = new File[1];
files[0] = source;
}
InputStream is = null;
String pathName;
byte[] buf = new byte[1024];
int length = 0;
try{
for(File file : files) {
if(file.isDirectory()) {
pathName = file.getPath().substring(basePath.length() + 1) + "/";
zos.putNextEntry(new ZipEntry(pathName));
zipFile(file, basePath, zos);
}else {
pathName = file.getPath().substring(basePath.length() + 1);
is = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
zos.putNextEntry(new ZipEntry(pathName));
while ((length = bis.read(buf)) 0) {
zos.write(buf, 0, length);
}
}
}
}finally {
if(is != null) {
is.close();
}
}
}
2、使用org.apache.tools.zip.ZipOutputStream,代碼如下,
package net.szh.zip;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.util.zip.CRC32;
import java.util.zip.CheckedOutputStream;
import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;
public class ZipCompressor {
static final int BUFFER = 8192;
private File zipFile;
public ZipCompressor(String pathName) {
zipFile = new File(pathName);
}
public void compress(String srcPathName) {
File file = new File(srcPathName);
if (!file.exists())
throw new RuntimeException(srcPathName + "不存在!");
try {
FileOutputStream fileOutputStream = new FileOutputStream(zipFile);
CheckedOutputStream cos = new CheckedOutputStream(fileOutputStream,
new CRC32());
ZipOutputStream out = new ZipOutputStream(cos);
String basedir = "";
compress(file, out, basedir);
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private void compress(File file, ZipOutputStream out, String basedir) {
/* 判斷是目錄還是文件 */
if (file.isDirectory()) {
System.out.println("壓縮:" + basedir + file.getName());
this.compressDirectory(file, out, basedir);
} else {
System.out.println("壓縮:" + basedir + file.getName());
this.compressFile(file, out, basedir);
}
}
/** 壓縮一個(gè)目錄 */
private void compressDirectory(File dir, ZipOutputStream out, String basedir) {
if (!dir.exists())
return;
File[] files = dir.listFiles();
for (int i = 0; i files.length; i++) {
/* 遞歸 */
compress(files[i], out, basedir + dir.getName() + "/");
}
}
/** 壓縮一個(gè)文件 */
private void compressFile(File file, ZipOutputStream out, String basedir) {
if (!file.exists()) {
return;
}
try {
BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(file));
ZipEntry entry = new ZipEntry(basedir + file.getName());
out.putNextEntry(entry);
int count;
byte data[] = new byte[BUFFER];
while ((count = bis.read(data, 0, BUFFER)) != -1) {
out.write(data, 0, count);
}
bis.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
3、可以用ant中的org.apache.tools.ant.taskdefs.Zip來(lái)實(shí)現(xiàn),更加簡(jiǎn)單。
package net.szh.zip;
import java.io.File;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Zip;
import org.apache.tools.ant.types.FileSet;
public class ZipCompressorByAnt {
private File zipFile;
public ZipCompressorByAnt(String pathName) {
zipFile = new File(pathName);
}
public void compress(String srcPathName) {
File srcdir = new File(srcPathName);
if (!srcdir.exists())
throw new RuntimeException(srcPathName + "不存在!");
Project prj = new Project();
Zip zip = new Zip();
zip.setProject(prj);
zip.setDestFile(zipFile);
FileSet fileSet = new FileSet();
fileSet.setProject(prj);
fileSet.setDir(srcdir);
//fileSet.setIncludes("**/*.java"); 包括哪些文件或文件夾 eg:zip.setIncludes("*.java");
//fileSet.setExcludes(...); 排除哪些文件或文件夾
zip.addFileset(fileSet);
zip.execute();
}
}
測(cè)試一下
package net.szh.zip;
public class TestZip {
public static void main(String[] args) {
ZipCompressor zc = new ZipCompressor("E:\\szhzip.zip");
zc.compress("E:\\test");
ZipCompressorByAnt zca = new ZipCompressorByAnt("E:\\szhzipant.zip");
zca.compress("E:\\test");
}
}
在JDK中有一個(gè)zip工具類(lèi):
java.util.zip ? ?Provides classes for reading and writing the standard ZIP and
GZIP file formats.
使用此類(lèi)可以將文件夾或者多個(gè)文件進(jìn)行打包壓縮操作。
在使用之前先了解關(guān)鍵方法:
ZipEntry(String name) ????????Creates a new zip entry with the specified name.
使用ZipEntry的構(gòu)造方法可以創(chuàng)建一個(gè)zip壓縮文件包的實(shí)例,然后通過(guò)ZipOutputStream將待壓縮的文件以流的形式寫(xiě)進(jìn)該壓縮包中。具體實(shí)現(xiàn)代碼如下:
import?java.io.BufferedInputStream;??
import?java.io.BufferedOutputStream;??
import?java.io.File;??
import?java.io.FileInputStream;??
import?java.io.FileNotFoundException;??
import?java.io.FileOutputStream;??
import?java.io.IOException;??
import?java.util.zip.ZipEntry;??
import?java.util.zip.ZipOutputStream;??
/**?
*?將文件夾下面的文件?
*?打包成zip壓縮文件?
*??
*?@author?admin?
*?
*/??
public?final?class?FileToZip?{??
private?FileToZip(){}??
/**?
*?將存放在sourceFilePath目錄下的源文件,打包成fileName名稱(chēng)的zip文件,并存放到zipFilePath路徑下?
*?@param?sourceFilePath?:待壓縮的文件路徑?
*?@param?zipFilePath?:壓縮后存放路徑?
*?@param?fileName?:壓縮后文件的名稱(chēng)?
*?@return?
*/??
public?static?boolean?fileToZip(String?sourceFilePath,String?zipFilePath,String?fileName){??
boolean?flag?=?false;??
File?sourceFile?=?new?File(sourceFilePath);??
FileInputStream?fis?=?null;??
BufferedInputStream?bis?=?null;??
FileOutputStream?fos?=?null;??
ZipOutputStream?zos?=?null;??
if(sourceFile.exists()?==?false){??
System.out.println("待壓縮的文件目錄:"+sourceFilePath+"不存在.");??
}else{??
try?{??
File?zipFile?=?new?File(zipFilePath?+?"/"?+?fileName?+".zip");??
if(zipFile.exists()){??
System.out.println(zipFilePath?+?"目錄下存在名字為:"?+?fileName?+".zip"?+"打包文件.");??
}else{??
File[]?sourceFiles?=?sourceFile.listFiles();??
if(null?==?sourceFiles?||?sourceFiles.length1){??
System.out.println("待壓縮的文件目錄:"?+?sourceFilePath?+?"里面不存在文件,無(wú)需壓縮.");??
}else{??
fos?=?new?FileOutputStream(zipFile);??
zos?=?new?ZipOutputStream(new?BufferedOutputStream(fos));??
byte[]?bufs?=?new?byte[1024*10];??
for(int?i=0;isourceFiles.length;i++){??
//創(chuàng)建ZIP實(shí)體,并添加進(jìn)壓縮包??
ZipEntry?zipEntry?=?new?ZipEntry(sourceFiles[i].getName());??
zos.putNextEntry(zipEntry);??
//讀取待壓縮的文件并寫(xiě)進(jìn)壓縮包里??
fis?=?new?FileInputStream(sourceFiles[i]);??
bis?=?new?BufferedInputStream(fis,?1024*10);??
int?read?=?0;??
while((read=bis.read(bufs,?0,?1024*10))?!=?-1){??
zos.write(bufs,0,read);??
}??
}??
flag?=?true;??
}??
}??
}?catch?(FileNotFoundException?e)?{??
e.printStackTrace();??
throw?new?RuntimeException(e);??
}?catch?(IOException?e)?{??
e.printStackTrace();??
throw?new?RuntimeException(e);??
}?finally{??
//關(guān)閉流??
try?{??
if(null?!=?bis)?bis.close();??
if(null?!=?zos)?zos.close();??
}?catch?(IOException?e)?{??
e.printStackTrace();??
throw?new?RuntimeException(e);??
}??
}??
}??
return?flag;??
}??
public?static?void?main(String[]?args){??
String?sourceFilePath?=?"D:\\TestFile";??
String?zipFilePath?=?"D:\\tmp";??
String?fileName?=?"12700153file";??
boolean?flag?=?FileToZip.fileToZip(sourceFilePath,?zipFilePath,?fileName);??
if(flag){??
System.out.println("文件打包成功!");??
}else{??
System.out.println("文件打包失敗!");??
}??
}??
}
具體解壓縮方法如下:
Java壓縮解壓縮文件的方法有,第一中借助javajdk自帶的ZipOutputStream和ZipInputStream。第二種,借助第三方j(luò)ar,例如ApacheCommonsCompress和Ant。
前提,需要將Ant的ant、jar和ant-launcher、jar添加到classpath中。先創(chuàng)建一個(gè)Expander類(lèi),該類(lèi)繼承了Ant的org、apache、tools、ant、taskdefs、Expand類(lèi)。
第二步:使用Expander類(lèi)。
分類(lèi): 電腦/網(wǎng)絡(luò) 程序設(shè)計(jì) 其他編程語(yǔ)言
問(wèn)題描述:
JAVA 程序中如何實(shí)現(xiàn)對(duì)RAR壓縮包文件中文件格式的判斷?
解析:
JAVA中使用java.util.zip.ZipOutputStream在對(duì)文件進(jìn)行壓縮時(shí),將把每一個(gè)文件實(shí)體封裝為java.util.zip.ZipEntry,反之,在使用java.util.zip.ZipInputStream在對(duì)文件進(jìn)行解壓縮時(shí),每個(gè)文件的訪(fǎng)問(wèn)也是通過(guò)訪(fǎng)問(wèn)ZipEntry對(duì)象來(lái)操作的,可以通過(guò)ZipEntry對(duì)象的getName()來(lái)得到當(dāng)初壓縮時(shí)對(duì)該文件的命名(通常為該文件相對(duì)路徑),當(dāng)然得到了該文件命名自然就可以對(duì)文件格式進(jìn)行判斷了!