标签:java 使用 os io 文件 for art ar
由于目前系统在服务器上的资料占用空间太大。查了原因之后发现时因为照片没有经过压缩。但是所有照片都在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 + "毫秒");
}
}
工具类-解压zip包和压缩照片,布布扣,bubuko.com
标签:java 使用 os io 文件 for art ar
原文地址:http://my.oschina.net/u/567296/blog/296904