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();
}
}
}
//得到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);
//经过下一步图片就会变小。
tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight,Image.SCALE_SMOOTH), 0, 0, null);
return tag;
}
//根据图像包装流生成文件
public boolean getImgFile(BufferedImage buffimg, String outpath) {
try {
FileOutputStream out;
out = new FileOutputStream(outpath);
// JPEGImageEncoder可适用于其他图片类型的转换
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(buffimg);
out.close();
return true;
} catch (Exception e) {
System.out.println("根据图像包装流生成文件发生异常");
return false;
}
}