昨天发了一帖,无人响应,甚至不知道有没有人仔细研读过那些源代码,伤心中。
描述:由于项目发布的新版本中支持图片缩略图,加快了浏览速度,客户反映不错,要求在其已有的特定的文件夹下的图片也生成对应的缩略图(项目运行一年有余,至今在用缩略图策略,汗...),好像没有找到能递归处理所有图片文件的软件,所以自己写了一个能递归的函数处理(也是一种懒惰的手法)。
如果没有设置JVM参数,大概只处理1MB左右的图片文件,但是设置了JVM参数在比较理想的情况下,能处理大约10MB的文件,而且持续处理上千个文件不内存不回又太大的损耗,只是CPU稍有影响
附:Bat文件内容。
说明:版权所有,转载请声明命。
/**
* Copyright 2008 pantosoft. All rights reserved.
*/
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import com.sun.image.codec.jpeg.JPEGCodec;
import com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
* 针对特定文件夹下的所有子目录图片文件缩略图
* 要求: 1.安装好jdk,并且配置好运行环境;
* 2.文件小于1mb;
* 3.文件后缀为:“jpg,jpeg,gif,bmp”中的一种或几种;
* 使用方法:1.widows平台下,安装JDK后,直接运行ImageResizer.bat即可。
* 注意:支持递归生成策略。
*
* @author Cheng 2008-9-22 上午11:26:46
* @version 1.0.0
*/
public class ImageResizer {
private static final String PIC_TEMPORARY = "_temporary.db";
private static final String LOG_FILE_NAME = "operate.log";
private static int successed = 0;
private static int allFiles = 0;
private String dir = null;
private StringBuilder failedFiles = new StringBuilder();
private StringBuilder infomation = new StringBuilder();
/**
* 构造函数,初始化目标文件夹
* @param dir
*/
public ImageResizer(String dir) {
this.dir = dir;
}
public void operate(String _path) {
if (_path == null)
throw new NullPointerException("您还没有初始化需要操作的文件路径。");
File file = new File(_path);
if (!file.exists()) {
return;
}
File[] files = file.listFiles();
if (files.length >= 10000) {
write(_path + "目录下文件大于10000个,请分批处理!");
return;
} else {
for (int i = 0; i < files.length; i++) {
allFiles++;
if (files[i].isDirectory()) {
write("处理目录:" + files[i].getAbsolutePath());
this.operate(files[i].getAbsolutePath());
} else {
write("\t处理文件:" + files[i].getName());
if (files[i].length() > 1000000) {
write("\t超大:" + files[i].getAbsoluteFile() + "["
+ files[i].length() + "]字节。");
failedFiles.append("\t超大:" + files[i].getAbsoluteFile()
+ "[" + files[i].length() / 1000 + "]字节。\n");
continue;
}
if (files[i].getName().indexOf(".") != -1) {
//已经是缩略图文件了
if (files[i].getName().indexOf(PIC_TEMPORARY) != -1)
continue;
String ext = files[i].getName().substring(
files[i].getName().lastIndexOf("."),
files[i].getName().length()).toLowerCase();
if (ext.equals(".jpg") || ext.equals(".gif")
|| ext.equals(".bmp")) {
write("\t压缩:" + files[i].getName() + "...");
resize(files[i]);
write("\t完成:" + files[i].getName() + "");
}
} else {
write("文件类型未知!");
}
}
}
}
}
/**
* 输出,方便拓展成log4j,或者其它形式。
* @param str
*/
public void write(String str) {
infomation.append("\n").append(str);
}
private void flush() {
if (this.dir == null || this.dir.equals(""))
throw new NullPointerException(
"destinate folder is null or its value is empty.");
File file = null;
if (file == null || file.exists()) {
file = new File(this.dir + "/" + LOG_FILE_NAME);
}
try {
OutputStream stream = new FileOutputStream(file, false);
stream.write((this.infomation.toString()).getBytes());
if (this.failedFiles.toString().length() != 0) {
stream.write("\n\n\n--失败文件列表--\n".getBytes());
stream.write((this.failedFiles.toString()).getBytes());
stream.write("\n--------------".getBytes());
}
stream.flush();
stream.close();
} catch (FileNotFoundException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
} catch (IOException ex) {
// TODO Auto-generated catch block
ex.printStackTrace();
}
}
public void resize(File _file) {
if (_file == null || _file.length() == 0) {
throw new NullPointerException("目标文件错误!");
}
ImageUtils imageUtils = null;
try {
imageUtils = new ImageUtils(_file);
imageUtils.resize(160, 140);
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* 获取出如流,并转换成String
* @return
*/
private static String inputString() {
BufferedReader bufferedreader = new BufferedReader(
new InputStreamReader(System.in));
String s = null;
try {
s = bufferedreader.readLine();
} catch (IOException ioexception) {
ioexception.printStackTrace();
}
return s;
}
/**
*
* @author Cheng 2008-9-27 上午10:32:18
* @version 1.0.0
*/
private static class ImageUtils {
private Image srcImage = null;
/**
* 源图片文件
*/
private File srcFile = null;
/**
* 目标文件
*/
private File destFile = null;
private String fileSuffix = null;
/**
* 构造函数
* @param fileName
* @throws IOException
*/
public ImageUtils(String fileName) throws IOException {
this(new File(fileName));
}
/**
*
* @param fileName
* @throws IOException
*/
public ImageUtils(File fileName) throws IOException {
File _file = fileName;
_file.setReadOnly();
this.srcFile = _file;
this.fileSuffix = _file.getName().substring(
(_file.getName().indexOf(".") + 1),
(_file.getName().length()));
this.destFile = new File(this.srcFile.getPath().substring(0,
(this.srcFile.getPath().lastIndexOf(".")))
+ PIC_TEMPORARY + "." + this.fileSuffix);
srcImage = javax.imageio.ImageIO.read(_file);
}
/**
* 强制压缩/放大图片到固定的大小
* @param w int 新宽度
* @param h int 新高度
* @throws IOException
*/
public void resize(int w, int h) throws IOException {
//构建图片对象
BufferedImage _image = new BufferedImage(w, h,
BufferedImage.TYPE_INT_RGB);
//绘制缩小后的图
_image.getGraphics().drawImage(srcImage, 0, 0, w, h, null);
//输出到文件流
FileOutputStream out = new FileOutputStream(destFile);
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);
encoder.encode(_image);
out.flush();
out.close();
successed++;
}
}
/**
* 测试Main
* @param args
*/
public static void main(String[] args) {
System.out.print("请输入目标文件夹:");
String s = inputString();
long currentTime = System.currentTimeMillis();
ImageResizer resizer = new ImageResizer(s);
resizer.operate(s);
long finishTime = System.currentTimeMillis();
long waste = finishTime - currentTime;
resizer.write(s + "下共有" + allFiles + "个文件\n" + "\t成功:" + successed
+ "\n\t失败:" + (allFiles - successed));
resizer.write("耗时:" + waste / 1000 + "s");
resizer.flush();
System.out.println("处理完成,请看目标文件夹下日志文件。");
}
}
可能大家有更好的生成已有的缩略图的方法,欢迎介绍。
分享到:
相关推荐
C# 用递归的方式查找指定文件夹下的所有子目录,C#代码 采用递归的方法來查找指定文件夹及它的所有子文件夹裏的内容。
本代码使用c语言,可执行递归删除指定文件夹下所有的文件(包含文件以及文件夹)的操作,注释详细,易于使用或修改
递归删除指定文件夹下的指定文件夹及文件,如删除文件夹中的所有.svn的文件夹及文件
批量处理文件,显示代码行数,总行数,微信小程序特别好用 支持递归文件夹及文件夹下所有子文件夹的*.js,*.json,*.css,*.wxss,*.wxs文件的批量处理
c语言递归遍历指定文件夹下所有文件算法
C# FTP递归下载文件(子目录和子目录中的文件 服务器使用的Serv-u软件 Visual Studio 2008专业版编译 Winfrom 实例,修改FTP连接信息即可编译使用
C#删除FTP文件夹(有子文件夹和子文件)的方法C#删除FTP文件夹(有子文件夹和子文件)的方法C#删除FTP文件夹(有子文件夹和子文件)的方法C#删除FTP文件夹(有子文件夹和子文件)的方法
当递归删除文件夹时,会把自己文件夹也删除掉,比如要删除E:/testTemp/qftp 这个文件夹下多有文件,但会把qftp这个文件夹删除,本程序改进后将不删除qftp文件夹,但qftp文件夹下的所有文件都会删除
Excel VBA工具 可以指定条件, 列出某个文件夹下所有子文件夹和文件
递归文件夹下含子文件夹所有图片缩小宽度到1000以缩小文件大小(替换方式不保留原图)
PHP递归寻找指定文件夹的所有文件,并且按照扩展分好目录
C#,用递归方法实现读取文件夹下所有文件信息!
递归地删除指定目录下的文件或子目录,跳过属性为只读的文件或目录。开发语言:VC6.0。
采用c语言编程,递归遍历一个文件夹中的所有文件,包括子文件夹
使用方法:双击软件弹出文件夹拾取框执行程序
bat可执行文件执行jar包,遍历文件夹下所有文件指定内容并且替换为目标文件。不需要idea和eclipse等工具打开,开发语言是JAVA。
使用c语言开发的读取指定文件夹下的所有文件和子文件夹内容的代码,并读文件内容进行提取,具体提取代码需要修改,我的只是适合我自己的文档格式。
递归遍历FTP文件夹,并从文件夹下载所有文件 希望对你有所帮助
递归实现遍历目录下子所有目录内所有文件
java 递归读取文件夹 读取文件 写文件java 递归读取文件夹 读取文件 写文件java 递归读取文件夹 读取文件 写文件java 递归读取文件夹 读取文件 写文件java 递归读取文件夹 读取文件 写文件java 递归读取文件夹 读取...