首页 > 代码库 > 工具类-解压zip包和压缩照片
工具类-解压zip包和压缩照片
由于目前系统在服务器上的资料占用空间太大。查了原因之后发现时因为照片没有经过压缩。但是所有照片都在zip包里,比较犯愁。于是写了如下的工具类。主要实现的功能是:扫描一个文件夹下的所有zip包,然后把zip包进行解压。拿到所有的照片。如果照片大于300KB就进行等比例压缩。压缩之后重新打包成zip包。替换掉原来的zip包。 并且可以可有选择是否等比压缩,压缩比例等。代码如下: filetest类: package daoimpl; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.Enumeration; import java.util.List; import org.apache.tools.zip.ZipEntry; import org.apache.tools.zip.ZipFile; import org.apache.tools.zip.ZipOutputStream; public class filetest { private ZipFile zipFile; private ZipOutputStream zipOut; // 压缩Zip private ZipEntry zipEntry; private static int bufSize; // size of bytes private int readedBytes; List<String> fileslist = new ArrayList<String>(); public static void main(String[] args) { String file = "E:\\ziptest";//需要处理的文件夹 filetest filetest = new filetest(); filetest.getFiles(file);//列出文件夹下的所有zip文件 //对每个zip包进行解压。 for (int i = 0; i < filetest.fileslist.size(); i++) { System.out.println(filetest.fileslist.get(i)); filetest.unzip(filetest.fileslist.get(i));//挨个解压所有文件 } } // 得到所有zip文件的路径 public void getFiles(String file) { File rootFile = new File(file); File[] files = rootFile.listFiles(); for (File f : files) { if (f.isDirectory()) { // 如果path表示的是一个目录 getFiles(f.getAbsolutePath());// 迭代传入绝对路径 } else { if (f.getAbsolutePath().endsWith(".zip")) { fileslist.add(f.getAbsolutePath()); } } } } public void unzip(String path) { int index = -1; boolean flag = false; String savepath = path.substring(0, path.lastIndexOf(".")) + File.separator + "temppath" + File.separator; String temppath = path.substring(0, path.lastIndexOf(".")) + File.separator + "temppath"; String zipoutname = path; File f = new File(temppath); if (f.exists()) { File[] files = f.listFiles(); if (f.isDirectory()) { for (int i = 0; i < files.length; i++) { files[i].delete(); } f.delete(); } } f.mkdirs(); try { ZipFile zipFile = new ZipFile(path); Enumeration<?> entries = zipFile.getEntries();// 拿到zip包里的所有元素 while (entries.hasMoreElements()) { int i; ZipEntry entry = (ZipEntry) entries.nextElement(); // byte buf[] = new byte[entry.getSize()]; String filename = entry.getName(); BufferedInputStream bis = new BufferedInputStream( zipFile.getInputStream(entry)); byte[] bytes = new byte[bis.available()]; BufferedOutputStream bos = new BufferedOutputStream( new FileOutputStream(new File(savepath + filename))); while ((bis.read(bytes) != -1)) { bos.write(bytes); } if (isPics(filename)) {// 如果是照片,就去压缩 CompressPicDemo CompressPicDemo = new CompressPicDemo(); CompressPicDemo.compressPic(savepath, savepath, filename, "temp" + filename, 800, 600, true, 300); } // 把zip包里的所有元素通过输出流,放到temppath文件中 bos.flush(); bis.close(); bos.close(); File tempout = new File(savepath + "temp" + filename); File tempint = new File(savepath + filename); if (tempout.exists() && tempint.exists()) { tempint.delete(); tempout.renameTo(tempint); } // System.out.println(filename); } doZip(temppath, zipoutname); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public static boolean isPics(String filename) { boolean flag = false; if (filename.endsWith(".jpg") || filename.endsWith(".gif") || filename.endsWith(".bmp") || filename.endsWith(".png")) flag = true; return flag; } // 压缩文件夹 public void doZip(String zipDirectory, String zipoutname) {// zipDirectoryPath:需要压缩的文件夹名 // zipoutpath//压缩后生成的zip文件名 File file; File zipDir; zipDir = new File(zipDirectory); String zipFileName = zipoutname; // zipoutname :压缩后生成的zip文件名 文件路径 /* * File azipDir = new File(zipDirectory+zipoutname); if * (azipDir.exists()) { azipDir.delete(); } */ try { this.zipOut = new ZipOutputStream(new BufferedOutputStream( new FileOutputStream(zipFileName))); handleDir(zipDir, this.zipOut); this.zipOut.close(); } catch (IOException ioe) { ioe.printStackTrace(); } File f = new File(zipDirectory); if (f.exists()) { File[] files = f.listFiles(); if (f.isDirectory()) { for (int i = 0; i < files.length; i++) { files[i].delete(); } f.delete(); } } } // 由doZip调用,递归完成目录文件读取 public void handleDir(File dir, ZipOutputStream zipOut) throws IOException { FileInputStream fileIn; File[] files; files = dir.listFiles(); if (files.length == 0) {// 如果目录为空,则单独创建之. // ZipEntry的isDirectory()方法中,目录以"/"结尾. this.zipOut.putNextEntry(new ZipEntry(dir.toString() + "/")); this.zipOut.closeEntry(); } else {// 如果目录不为空,则分别处理目录和文件. for (File fileName : files) { System.out.println(fileName); if (fileName.isDirectory()) { handleDir(fileName, this.zipOut); } else { fileIn = new FileInputStream(fileName); this.zipOut.putNextEntry(new ZipEntry(fileName.getName())); byte[] buf = new byte[fileIn.available()]; while ((this.readedBytes = fileIn.read(buf)) > 0) { this.zipOut.write(buf, 0, this.readedBytes); } this.zipOut.closeEntry(); } } } } }
CompressPicDemo类
package daoimpl; /** * 缩略图实现,将图片(jpg、bmp、png、gif等等)真实的变成想要的大小 */ import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import javax.imageio.ImageIO; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; /******************************************************************************* * 缩略图类(通用) 本java类能将jpg、bmp、png、gif图片文件,进行等比或非等比的大小转换。 具体使用方法 * compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true)) */ public class CompressPicDemo { private File file = null; // 文件对象 private String inputDir; // 输入图路径 private String outputDir; // 输出图路径 private String inputFileName; // 输入图文件名 private String outputFileName; // 输出图文件名 private int outputWidth = 600; // 默认输出图片宽 private int outputHeight = 800; // 默认输出图片高 private int size ;//默认最小的压缩大小。如果小于该大小就不压缩kb private boolean proportion = true; // 是否等比缩放标记(默认为等比缩放) public CompressPicDemo() { // 初始化变量 inputDir = ""; outputDir = ""; inputFileName = ""; outputFileName = ""; outputWidth = 600; outputHeight = 800; size = 300; } public int getSize() { return size; } public void setSize(int size) { this.size = size; } public void setInputDir(String inputDir) { this.inputDir = inputDir; } public void setOutputDir(String outputDir) { this.outputDir = outputDir; } public void setInputFileName(String inputFileName) { this.inputFileName = inputFileName; } public void setOutputFileName(String outputFileName) { this.outputFileName = outputFileName; } public void setOutputWidth(int outputWidth) { this.outputWidth = outputWidth; } public void setOutputHeight(int outputHeight) { this.outputHeight = outputHeight; } public void setWidthAndHeight(int width, int height) { this.outputWidth = width; this.outputHeight = height; } /* * 获得图片大小 * 传入参数 String path :图片路径 */ public long getPicSize(String path) { file = new File(path); return file.length(); } // 图片处理 public String compressPic() { try { //获得源文件 file = new File(inputDir + inputFileName); if (!file.exists()) { return ""; } if ((file.length()/1024)<size){ return ""; } Image img = ImageIO.read(file); // 判断图片格式是否正确 if (img.getWidth(null) == -1) { System.out.println(" can‘t read,retry!" + "<BR>"); return "no"; } else { int newWidth; int newHeight; // 判断是否是等比缩放 if (this.proportion == true) { // 为等比缩放计算输出的图片宽度及高度 double rate1 = ((double) img.getWidth(null)) / (double) outputWidth + 0.1; double rate2 = ((double) img.getHeight(null)) / (double) outputHeight + 0.1; // 根据缩放比率大的进行缩放控制 double rate = rate1 > rate2 ? rate1 : rate2; newWidth = (int) (((double) img.getWidth(null)) / rate); newHeight = (int) (((double) img.getHeight(null)) / rate); } else { newWidth = outputWidth; // 输出的图片宽度 newHeight = outputHeight; // 输出的图片高度 } BufferedImage tag = new BufferedImage((int) newWidth, (int) newHeight, BufferedImage.TYPE_INT_RGB); /* * Image.SCALE_SMOOTH 的缩略算法 生成缩略图片的平滑度的 * 优先级比速度高 生成的图片质量比较好 但速度慢 */ tag.getGraphics().drawImage(img.getScaledInstance(newWidth, newHeight, Image.SCALE_SMOOTH), 0, 0, null); FileOutputStream out = new FileOutputStream(outputDir + outputFileName); // JPEGImageEncoder可适用于其他图片类型的转换 JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out); encoder.encode(tag); out.flush(); out.close(); img.flush(); } } catch (IOException ex) { ex.printStackTrace(); } return "ok"; } public String compressPic (String inputDir, String outputDir, String inputFileName, String outputFileName,int size) { // 输入图路径 this.inputDir = inputDir; // 输出图路径 this.outputDir = outputDir; // 输入图文件名 this.inputFileName = inputFileName; // 输出图文件名 this.outputFileName = outputFileName; //限制的压缩大小 this.size = size; return compressPic(); } public String compressPic(String inputDir, String outputDir, String inputFileName, String outputFileName, int width, int height, boolean gp,int size) { // 输入图路径 this.inputDir = inputDir; // 输出图路径 this.outputDir = outputDir; // 输入图文件名 this.inputFileName = inputFileName; // 输出图文件名 this.outputFileName = outputFileName; // 设置图片长宽 setWidthAndHeight(width, height); //限制的压缩大小 this.size = size; // 是否是等比缩放 标记 this.proportion = gp; return compressPic(); } // main测试 // compressPic(大图片路径,生成小图片路径,大图片文件名,生成小图片文名,生成小图片宽度,生成小图片高度,是否等比缩放(默认为true)) public static void main(String[] arg) { CompressPicDemo mypic = new CompressPicDemo(); System.out.println("输入的图片大小:" + mypic.getPicSize("e:\\BOOK.jpg")/1024 + "KB"); int count = 0; // 记录全部图片压缩所用时间 for (int i = 0; i < 2; i++) { int start = (int) System.currentTimeMillis(); // 开始时间 mypic.compressPic("e:\\", "e:\\", "BOOK.jpg", "r1"+i+".jpg", 800, 600, false,300); int end = (int) System.currentTimeMillis(); // 结束时间 int re = end-start; // 但图片生成处理时间 count += re; System.out.println("第" + (i+1) + "张图片压缩处理使用了: " + re + "毫秒"); System.out.println("输出的图片大小:" + mypic.getPicSize("e:\\r1"+i+".jpg")/1024 + "KB"); } System.out.println("总共用了:" + count + "毫秒"); } }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。