(.)\\1+ 在java中的多态正则含义是什么

“:p”是什么字符,表示笑脸吗?经常在聊天中看到,是什么意思啊?
[问题点数:22分,结帖人SCAUSCNU]
本版专家分:559
结帖率 98.9%
CSDN今日推荐
本版专家分:55078
本版专家分:304
本版专家分:398208
2014年 荣获名人称号2013年 荣获名人称号2012年 荣获名人称号
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第四
本版专家分:549
本版专家分:559
本版专家分:317
2012年1月 荣获微软MVP称号2011年1月 荣获微软MVP称号
2007年9月 VB大版内专家分月排行榜第二
2008年3月 VB大版内专家分月排行榜第三2007年8月 VB大版内专家分月排行榜第三
本版专家分:398208
2014年 荣获名人称号2013年 荣获名人称号2012年 荣获名人称号
2013年 总版技术专家分年内排行榜第一
2014年 总版技术专家分年内排行榜第三
2012年 总版技术专家分年内排行榜第四
本版专家分:9117
本版专家分:0
本版专家分:559
本版专家分:559
本版专家分:443
本版专家分:13
本版专家分:52
本版专家分:23
本版专家分:4776
匿名用户不能发表回复!|
其他相关推荐sortName=生日快乐 什么意思?
[问题点数:20分,结帖人yanzi0]
本版专家分:34
结帖率 100%
CSDN今日推荐
本版专家分:16876
2008年5月 Java大版内专家分月排行榜第二
本版专家分:16876
2008年5月 Java大版内专家分月排行榜第二
本版专家分:6530
本版专家分:34
本版专家分:51103
2013年3月 Java大版内专家分月排行榜第三2013年2月 Java大版内专家分月排行榜第三2012年11月 Java大版内专家分月排行榜第三2008年3月 Java大版内专家分月排行榜第三
本版专家分:2050
本版专家分:34
本版专家分:34
匿名用户不能发表回复!|
其他相关推荐前段时间,因为各种原因,自己动手写了一个小的备份工具,用了一个星期,想想把它的设计思路放上来,当是笔记吧。
需求场景:这个工具起初的目的是为了解决朋友公司对其网络的限制(不可以用任何同步软件,git,外网SVN,U盘只读)。本来只是想做一个自动打包和发送邮件的工具,后来就发展成了这个。
软件功能:这个软件最终实现的功能包括1、读取配置文件,对配置文件中指定目录的文件进行日期检测,获取对应修改过的文件。2、将读出的文件进行压缩;3、将压缩文件发送到指定邮箱;4、对压缩文件进行历史版本的保留
根据最后的功能需求,工具最后选择采用的API包如下:
1、& 使用commons-config实现配置文件的读写
2、& 使用commons-io实现文件的检测和读写
3、& 使用zip4j实现对文件的压缩
4、& 使用javamail实现邮件的发送
系统最后的流程图如下:
主要的工具类如下:
1 //用于发送邮件的Bean
2 package com.sean.
4 import java.io.F
5 import java.io.IOE
6 import java.io.InputStreamR
7 import java.io.UnsupportedEncodingE
8 import java.util.P
10 import javax.activation.DataH
11 import javax.activation.FileDataS
12 import javax.mail.A
13 import javax.mail.BodyP
14 import javax.mail.M
15 import javax.mail.Message.RecipientT
16 import javax.mail.MessagingE
17 import javax.mail.NoSuchProviderE
18 import javax.mail.S
19 import javax.mail.T
20 import javax.mail.internet.AddressE
21 import javax.mail.internet.InternetA
22 import javax.mail.internet.MimeBodyP
23 import javax.mail.internet.MimeM
24 import javax.mail.internet.MimeM
* @author Sean
* @blog http://www.cnblogs.com/Seanit/
32 public class EmailBean {
private MimeM
private MimeM
* 默认构造函数
public EmailBean(){
public EmailBean(Properties properties){
this.properties=
createMail(properties);
public EmailBean(String src){
this.properties=new Properties();
properties.load(new InputStreamReader(ClassLoader.getSystemResourceAsStream(src),"utf-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
createMail(properties);
* 创建连接
* @author Sean
* @param properties 邮箱相关配置
void createMail(Properties properties) {
this.properties=
session=Session.getDefaultInstance(properties,null);
message=new MimeMessage(session);
body=new MimeMultipart();
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException("邮件初始化失败");
* 设置发件人
* @author Sean
* @param from
发件人地址
成功返回true,失败防护false
public boolean setFrom(String from){
message.setFrom(new InternetAddress(from));
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
* 设置收件人
* @author Sean
* @param toSend
收件人邮箱地址
成功返回true,失败防护false
public boolean setTOSend(String toSend){
message.setRecipients(RecipientType.TO, toSend);
return true;
} catch (MessagingException e) {
e.printStackTrace();
return false;
* 设置抄送人
* @author Sean
* @param copyTo
抄送人地址
成功返回true,失败防护false
public boolean setCopyTO(String copyTo){
message.setRecipients(RecipientType.CC, (Address[])InternetAddress.parse(copyTo));
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
* 设置主题
* @author Sean
* @param subject
成功返回true,失败防护false
public boolean setSubject(String subject){
message.setSubject(subject);
return true;
} catch (MessagingException e) {
e.printStackTrace();
return false;
* 设置邮件正文
* @author Sean
* @param content
成功返回true,失败防护false
public boolean setContent(String content){
BodyPart bodyPart=new MimeBodyPart();
bodyPart.setContent(""+content, "text/charset=GBK");
body.addBodyPart(bodyPart);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
* 添加附件
* @author Sean
* @param src
public boolean addFiles(String src){
BodyPart bodyPart=new MimeBodyPart();
FileDataSource file =new FileDataSource(src);
bodyPart.setDataHandler(new DataHandler(file));
bodyPart.setFileName(file.getName());
body.addBodyPart(bodyPart);
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
* 发送邮件
* @author Sean
public boolean send(){
Transport transport=null;
message.setContent(body);
message.saveChanges();
transport=session.getTransport();
transport.connect(properties.getProperty("mail.smtp.host"), properties.getProperty("username"), properties.getProperty("password"));
transport.sendMessage(message, message.getRecipients(Message.RecipientType.TO));
if(message.getRecipients(Message.RecipientType.CC)!=null){
transport.sendMessage(message, message.getRecipients(Message.RecipientType.CC));
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
transport.close();
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
1 //用于操作配置文件的bean
2 package com.sean.
4 import org.apache.commons.configuration.ConfigurationE
5 import org.apache.commons.configuration.PropertiesC
* 配置文件操作类
* 实现功能:对properties 文件进行读写操作
* @author Sean
12 public class PropertiesBean {
private String src="";
private PropertiesConfiguration pc=null;
* 默认构造函数
public PropertiesBean() {}
public PropertiesBean(String src) {
* 初始化函数
* @author Sean
public void init(){
if(src.trim().equals("")){
throw new RuntimeException("The path is null");
pc=new PropertiesConfiguration(src);
} catch (ConfigurationException e) {
e.printStackTrace();
* 取值函数,根据对应的关键字获取对应的值
* @author Sean
* @param key
返回关键字对应的值,若无该关键字,抛出异常
public String getValue(String key){
if(!pc.containsKey(key)){
throw new RuntimeException("not such a key");
return pc.getString(key);
* 设置对应的值,传入键值对,根据关键字修改对应的值
* @author Sean
* @param key
* @param value
public void setValue(String key,String value){
if(!pc.containsKey(key)){
throw new RuntimeException("not such a key");
pc.setProperty(key, value);
pc.save();
} catch (ConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
* 设置配置文件的地址
* @author Sean
* @param src
配置文件的路径
public void setSrc(String src) {
this.src =
//用于进行IO操作的Bean
package com.sean.
import java.io.F
import java.util.ArrayL
import java.util.D
import java.util.L
import org.apache.commons.io.FileU
* 文件操作工具类
* @author Sean
* @blog http://www.cnblogs.com/Seanit/
public class FilesBean {
private List&File& list=null;
public FilesBean(){}
* 获取文件夹目录下的列表,目录为空返回空列表
* @param dir 传入对应文件夹目录
* @param ifFirst 控制递归时候的循环表示
返回list&File&文件列表
List&File& listFiles(String dir,boolean ifFirst){
* 递归判断,仅在第一次调用函数的时候新建列表,为防止重复存入列表
if(ifFirst){
list=new ArrayList&File&();
if (dir==null||dir=="") {
return null;
for (File f : FileUtils.getFile(dir + "\\").listFiles()) {
if (f.isDirectory()) {
listFiles(f.getAbsolutePath(),false);
list.add(f);
* 根据过滤条件获取列表
* @param dir
* @param filter
* @param ifFirst
返回文件列表
List&File& listFiles(String dir,String filter,boolean ifFirst){
* 递归判断,仅在第一次调用函数的时候新建列表,为防止重复存入列表
if(ifFirst){
list=new ArrayList&File&();
if (dir==null||dir=="") {
return null;
for (File f : FileUtils.getFile(dir + "\\").listFiles()) {
if (f.isDirectory()) {
listFiles(f.getAbsolutePath(),filter,false);
if(!f.getName().endsWith(filter)){
list.add(f);
* 获取指定目录下,指定日期修改后的文件
* @param dir
传入指定检测目录
* @param date
传入指定修改日期
* @param ifFirst 控制递归时候的循环表示
返回获取的文件列表,若目录或日期为空,则返回null
List&File& getModifiedFiles(String dir,Date date,boolean ifFirst){
* 递归判断,仅在第一次调用函数的时候新建列表,为防止重复存入列表
if(ifFirst){
list=new ArrayList&File&();
if (dir==null||dir==""||date==null) {
return null;
for (File f : FileUtils.getFile(dir + "\\").listFiles()) {
if (f.isDirectory()) {
getModifiedFiles(f.getAbsolutePath(),date,false);
if (FileUtils.isFileNewer(f, date.getTime())) {
list.add(f);
* 获取某一日期之前创建的文件
* @author Sean
* @param dir
* @param ifFirst 控制递归时候的循环表示
* @param date
List&File& getOlderFiles(String dir,Date date,boolean ifFirst){
* 递归判断,仅在第一次调用函数的时候新建列表,为防止重复存入列表
if(ifFirst){
list=new ArrayList&File&();
if (dir==null||dir==""||date==null) {
return null;
for (File f : FileUtils.getFile(dir + "\\").listFiles()) {
if (f.isDirectory()) {
getOlderFiles(f.getAbsolutePath(),date,false);
if (FileUtils.isFileOlder(f, date)) {
list.add(f);
* 获取除过滤条件外的修改文件列表
* @param dir
* @param date
* @param filter
* @param ifFirst
List&File& getModifiedFiles(String dir,Date date,String filter,boolean ifFirst){
* 递归判断,仅在第一次调用函数的时候新建列表,为防止重复存入列表
if(ifFirst){
list=new ArrayList&File&();
if (dir==null||dir==""||date==null) {
return null;
for (File f : FileUtils.getFile(dir + "\\").listFiles()) {
if (f.isDirectory()) {
getModifiedFiles(f.getAbsolutePath(),date,filter,false);
if (FileUtils.isFileNewer(f, date.getTime())) {
if(!f.getName().endsWith(filter)){
list.add(f);
//用于压缩文件的工具类
package com.sean.
import java.io.F
import java.util.ArrayL
import net.lingala.zip4j.core.ZipF
import net.lingala.zip4j.exception.ZipE
import net.lingala.zip4j.model.ZipP
import net.lingala.zip4j.util.Zip4jC
public class ZipUtil {
* 压缩文件列表,无目录结构
* @author Sean
* @param zipSrc zip文件地址
* @param list
若成功,返回文件地址,不成功返回null
public static String zipFiles(String zipSrc,ArrayList&File& list){
ZipParameters zipParameters=new ZipParameters();
zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_MAXIMUM);
ZipFile zipFile=null;
zipFile=new ZipFile(zipSrc);
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
zipFile.addFiles(list, zipParameters);
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
return zipS
* 压缩文件夹
* @author Sean
* @param src
文件夹地址
* @param zipSrc 压缩文件存放地址
若成功,返回文件夹地址,若不成功,返回null
public static String zipFolder(String src,String zipSrc){
ZipParameters zipParameters=new ZipParameters();
zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_MAXIMUM);
ZipFile zipFile=null;
zipFile=new ZipFile(zipSrc);
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
zipFile.addFolder(src, zipParameters);
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return null;
return zipS
* 往zip文件中添加文件列表
* @author Sean
* @param zipSrc
zip文件路径
* @param list
要添加的文件列表
* @param src
要添加到zip文件中的哪个路径
public static void addFileToZip(String zipSrc,ArrayList&File& list,String src){
ZipFile zipFile=null;
zipFile=new ZipFile(zipSrc);
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ZipParameters zipParameters=new ZipParameters();
zipParameters.setCompressionMethod(Zip4jConstants.COMP_DEFLATE);
zipParameters.setCompressionLevel(Zip4jConstants.DEFLATE_LEVEL_NORMAL);
zipParameters.setRootFolderInZip(src);
zipFile.addFiles(list, zipParameters);
} catch (ZipException e) {
// TODO Auto-generated catch block
e.printStackTrace();
* 添加文件列表到zip根目录下
* @author Sean
* @param zipSrc
zip文件地址
* @param list
添加的文件列表
public static void addFileToZip(String zipSrc,ArrayList&File& list){
addFileToZip(zipSrc,list,"");
package com.sean.
import java.io.F
import java.io.IOE
import java.net.URISyntaxE
import java.text.ParseE
import java.text.SimpleDateF
import java.util.ArrayL
import java.util.D
import java.util.L
import org.apache.commons.io.FileU
import org.apache.commons.lang.StringU
import com.sean.bean.EmailB
import com.sean.bean.FilesB
import com.sean.bean.PropertiesB
import com.sean.utils.ZipU
* change2Mail 主程序
* 检测文件修改情况并发送给指定邮箱
* @version 1.0
* @author sean
public class Change2Mail {
* @param args
* @throws ParseException
public static void main(String[] args) throws ParseException{
//获取properties操作类
PropertiesBean propertiesBean = new PropertiesBean("cfg.properties");
FilesBean filesBean=new FilesBean();
//邮件对象
EmailBean email=new EmailBean("cfg.properties");
String first = propertiesBean.getValue("first");
//当前日期
String today=new SimpleDateFormat("yyyyMMdd").format(new Date());
//邮件正文
String content="";
//首次使用判断
if (first.trim().equals("true")) {
System.out.println("首次运行");
content+="欢迎首次使用change2Mail,&br/&以下是你的更改文件备份目录&br/&";
//获取检查文件目录
String cheakDir = propertiesBean.getValue("cheakDir");
if(!StringUtils.isEmpty(cheakDir)){
System.out.println("正在进行更改文件目录备份。。。。。。");
//目录分割
String[] dirs = cheakDir.split(";");
for (int i = 0; i & dirs. i++) {
File tmp=new File(dirs[i]);
List&File& list=filesBean.listFiles(dirs[i],true);
//创建对应文件存储目录列表
File file=new File(ClassLoader.getSystemResource("").getPath()+tmp.getName());
if(!file.exists()){
file.createNewFile();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("创建目录列表记录文件失败。。。。。");
//将列表写入文件
logFiles(file,list);
//压缩文件并加入邮件
ZipUtil.zipFolder(dirs[i], "tmp\\"+tmp.getName()+today+".zip");
content+=tmp.getName()+"&br/&";
email.addFiles("tmp\\"+tmp.getName()+today+".zip");
} catch (Exception e) {
e.printStackTrace();
System.out.println("压缩出错");
content+="以下是你的固定备份目录&br/&";
String zipDir = propertiesBean.getValue("zipDir");
if(!StringUtils.isEmpty(zipDir)){
System.out.println("正在进行固定备份目录备份。。。。。。");
String[] zipDirs = zipDir.split(";");
for (int i = 0; i & zipDirs. i++) {
File tmp=new File(zipDirs[i]);
ZipUtil.zipFolder(zipDirs[i], "tmp\\"+tmp.getName()+today+"bak.zip");
content+=tmp.getName()+"&br/&";
email.addFiles("tmp\\"+tmp.getName()+today+"bak.zip");
} catch (Exception e) {
e.printStackTrace();
System.out.println("压缩出错");
System.out.println("更新配置文件。。。。。");
propertiesBean.setValue("first", "false");
propertiesBean.setValue("lastData", today);
System.out.println("发送文件。。。。。");
email.setFrom(propertiesBean.getValue("username"));
email.setTOSend(propertiesBean.getValue("toSend"));
email.setContent(content);
email.setSubject("change2Mail备份文件"+today);
if(email.send()){
System.out.println("发送成功");
System.out.println("发送失败");
System.out.println("备份开始。。。。。");
String data=propertiesBean.getValue("lastData");
String filter=propertiesBean.getValue("filter");
String cheakDir = propertiesBean.getValue("cheakDir");
content+="你好,自"+data+"起的文件变动如下:&br/&";
if(!StringUtils.isEmpty(cheakDir)){
System.out.println("正在进行更改文件目录备份。。。。。。");
String[] dirs = cheakDir.split(";");
for (int i = 0; i & dirs. i++) {
File tmp=new File(dirs[i]);
File file=new File(ClassLoader.getSystemResource("").getPath()+tmp.getName());
if(!file.exists()){
file.createNewFile();
} catch (IOException e) {
System.out.println("创建文档失败");
e.printStackTrace();
content+="文件夹"+tmp.getName()+":&br/&";
List&File& list=filesBean.getModifiedFiles(dirs[i],new SimpleDateFormat("yyyyMMdd").parse(data),filter,true);
List&File& now =filesBean.listFiles(dirs[i],filter,true);
List&File& news=new ArrayList&File&();
List&File& del=new ArrayList&File&();
List&File& modefy=new ArrayList&File&();
List&String& lines=null;
lines=FileUtils.readLines(file);
} catch (IOException e) {
e.printStackTrace();
System.out.println("检查新建和修改的文件。。。。。。");
for(File f:list){
if(!lines.contains(f.getAbsolutePath())){
news.add(f);
modefy.add(f);
System.out.println("检查删除的文件。。。。。。");
for(String f:lines){
File old=new File(f);
if(!now.contains(old)){
del.add(old);
logFiles(file,now);
content+="删除文件:&br/&";
for(File f:del){
content+="	"+f.getName()+"&br/&";
content+="新增文件:&br/&";
for(File f:news){
content+="	"+f.getName()+"&br/&";
content+="修改文件:&br/&";
for(File f:modefy){
content+="	"+f.getName()+"&br/&";
if(list.size()!=0){
list.add(file);
ZipUtil.zipFiles("tmp\\"+tmp.getName()+today+".zip", (ArrayList&File&)list);
email.addFiles("tmp\\"+tmp.getName()+today+".zip");
} catch (Exception e) {
e.printStackTrace();
System.out.println("压缩失败");
String zipDir = propertiesBean.getValue("zipDir");
if(!StringUtils.isEmpty(zipDir)){
System.out.println("正在进行固定备份目录备份。。。。。。");
String[] zipDirs = zipDir.split(";");
for (int i = 0; i & zipDirs. i++) {
File tmp=new File(zipDirs[i]);
ZipUtil.zipFolder(zipDirs[i], "tmp\\"+tmp.getName()+today+"bak.zip");
email.addFiles("tmp\\"+tmp.getName()+today+"bak.zip");
} catch (Exception e) {
e.printStackTrace();
System.out.println("压缩出错");
System.out.println("更改配置文件。。。。。");
propertiesBean.setValue("lastData", today);
System.out.println("发送文件。。。。。");
email.setFrom(propertiesBean.getValue("username"));
email.setTOSend(propertiesBean.getValue("toSend"));
email.setContent(content);
email.setSubject("change2Mail备份文件"+today);
if(email.send()){
System.out.println("发送成功");
System.out.println("发送失败");
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");
long to = df.parse(today).getTime();
long todel=Integer.parseInt(propertiesBean.getValue("time"))*(1000 * 60 * 60 * 24);
Date lastBak=new Date(to-todel) ;
System.out.println("删除"+df.format(lastBak)+"之前保存的历史文件。。。。。");
List&File& fileToDel=filesBean.getOlderFiles("tmp\\", lastBak,true);
for(File f:fileToDel){
FileUtils.deleteQuietly(f);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
System.out.println("删除"+f.getName()+"文件失败");
System.out.println(new Date());
* 将文件列表的绝对地址输出到一个文件中
* @param file
* @param list
成功返回true,失败返回false
public static boolean logFiles(File file, List&File& list) {
List&String& lines=new ArrayList&String&();
for (File f : list) {
lines.add(f.getAbsolutePath());
FileUtils.writeLines(file, lines,false);
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
配置文件:
#autho:sean
#email:hxy9104@126.com
#mail config
javamail的配置
mail.debug = true
mail.smtp.auth = true
mail.smtp.host = smtp.126.com
mail.transport.protocol = smtp
#mail info 邮箱设置
username = .com
password = 121212
toSend = 121212@qq.com
#soft config 软件设置
#if the fisrt time to run
是否第一次运行
first = true
#the path to check 检测的目录
cheakDir = F:\\myfolder\\BaseC
#the path allways to zip
完全备份的目录
zipDir = F:\\myfolder\\myProject\\Change2M
#the data lastcheck 最后备份时间
lastData =
#storage life of the bak zip 保留文件
#filter string
filter = .class
工具github地址:
为了便于使用,工具最后导出为jar包,并编写了一个bat进行执行,加入了jre文件夹,可以再无jdk环境下使用。最后压缩包地址:
本工具只是个人闲时开发,纯属娱乐,大神勿喷
阅读(...) 评论()}

我要回帖

更多关于 java中的接口 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信