日期:2014-05-20  浏览次数:20795 次

java如何实现遍历文件夹并压缩的功能?
今天在整理电脑的时候,发现了很多图片。
这么图片删掉把觉得可惜,放在那里有特别占用空间。。。大约有10G左右的图片。。。
所以想把这些图片打包成压缩文件然后存起来,可以打包成压缩文件之后还是比较大,(主要文件夹比较分散)。
我打包的是文件夹。打包了一小部分,原来100M的压缩后还有80多M。太大。
上传图片空间吧,免费的空间恐怕存不了这么多,而且上传了会失真。。
作为程序员,我觉得又必须要写一个程序来完成这件事,
遍历-》压缩-》打包。
遍历我能写出来,
可是图片用java可以压缩么?会失真么?
以及怎样把这么多的不同文件夹下的文件打包?

------解决方案--------------------
什么叫压缩?是打成压缩包还是压缩图片本身?如果压缩图片本身肯定是会失真的。最好的办法就是买个移到硬盘存起来吧。现在250G的200块,便宜的。

如果是打压缩包,来一段参考代码:

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.tools.zip.ZipEntry;
import org.apache.tools.zip.ZipOutputStream;

/** 
 * @project: Test 
 * @Description: 文件压缩工具类
 *    将指定文件/文件夹压缩成zip、rar压缩文件
 */
public class CompressedFileUtil {
/**
 * 默认构造函数
 */
public CompressedFileUtil(){

}

/**
 * @desc 将源文件/文件夹生成指定格式的压缩文件,格式zip
 * @param resourePath 源文件/文件夹
 * @param targetPath  目的压缩文件保存路径
 * @return void
 * @throws Exception 
 */
public void compressedFile(String resourcesPath,String targetPath) throws Exception{
File resourcesFile = new File(resourcesPath);     //源文件
File targetFile = new File(targetPath);           //目的
//如果目的路径不存在,则新建
if(!targetFile.exists()){     
targetFile.mkdirs();  
}

String targetName = resourcesFile.getName()+".zip";   //目的压缩文件名
FileOutputStream outputStream = new FileOutputStream(targetPath+"\\"+targetName);
ZipOutputStream out = new ZipOutputStream(new BufferedOutputStream(outputStream));

createCompressedFile(out, resourcesFile, "");

out.close();  
}

/**
 * @desc 生成压缩文件。
 *               如果是文件夹,则使用递归,进行文件遍历、压缩
 *       如果是文件,直接压缩
 * @param out  输出流
 * @param file  目标文件
 * @return void
 * @throws Exception 
 */
public void createCompressedFile(ZipOutputStream out,File file,String dir) throws Exception{
//如果当前的是文件夹,则进行进一步处理
if(file.isDirectory()){
//得到文件列表信息
File[] files = file.listFiles();
//将文件夹添加到下一级打包目录
out.putNextEntry(new ZipEntry(dir+"/"));

dir = dir.length() == 0 ? "" : dir +"/";

//循环将文件夹中的文件打包
for(int i = 0 ; i < files.length ; i++){
createCompressedFile(out, files[i], dir + files[i].getName());         //递归处理
}
}
else{   //当前的是文件,打包处理
//文件输入流
FileInputStream fis = new FileInputStream(file);

out.putNextEntry(new ZipEntry(dir));
//进行写操作
int j =  0;
byte[] buffer = new byte[1024];
while((j = fis.read(buffer)) > 0){
out.write(buffer,0,j);
}
//关闭输入流
fis.close();
}
}

public static void main(String[] args){
CompressedFileUtil compressedFileUtil = new CompressedFileUtil();

try {
compressedFileUtil.compressedFile("G:\\zip", "F:\\zip");
System.out.println("压缩文件已经生成...");
} catch (Exception e) {
System.out.println("压缩文件生成失败...");
e.printStackTrace();
}
}
}

------解决方案--------------------
直接用工具压缩打包吧。10个G压完了一个u盘就搞定了。
------解决方案--------------------
有的jpg的图片是可以无损压缩的。。
你这样,随便挑一张图片,右键编辑,然后直接保存,看看图片大小变了没。。
如果变了变小了那就是可以压缩的。。而是是无损压缩。
至于原因,我说不上来,应该是图片空间里面存储了一些无用的或者其它的信息吧。。
给你提供几个压缩的类吧。。
本来打算自己写一个图片压缩exe的,最终也没写成。。

//得到image类对象
public Image getImage(String filepath){
File file=new File(filepath);
if(file.exists()){
try {
return ImageIO.read(file);
} catch (IOException e) {
return null;
}
}
return null;
}

//原子性,输入Image,尺寸大小,返回BufferedImage流
//输入想得到的尺寸,原图片的地址,名称,新图片的地址,名称,原图片是否删除
public BufferedImage getSuitImgOut(Image img,int sizeweight,int sizeheight){
int newWidth = sizeweight;
int newHeight = sizeheight;
BufferedImage tag = new BufferedImage(newWidth,newHeight, BufferedImage.TYPE_INT_RGB);