代码重构~

QQ785468931 2012-06-01 11:27:47
package com.eetrust.cpm.IPparse;





public class Directory2 {



//private static File[] strPath2;




public static String convertingStr(String lineStr) {
String retVal = "";
return retVal;
}




public static void recursion(String root, Vector<String> vecFile) {
File file = new File(root);
File[] subFile = file.listFiles();


if (subFile.length == 0) {
System.out.println(file.getAbsolutePath() + " is null");
}else{

for (int i = 0; i < subFile.length; i++) {
if (subFile[i].isDirectory()) {




recursion(subFile[i].getAbsolutePath(), vecFile);


} else {

String filename = subFile[i].getName();

vecFile.add(subFile[i].getAbsolutePath());
}
}
}

}




public String GetNowDate(){
String temp_str="";
Date dt = new Date();
//最后的aa表示“上午”或“下午” HH表示24小时制 如果换成hh表示12小时制
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss aa");
temp_str=sdf.format(dt);
return temp_str;
}



/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {





Map <String,Integer> map = new HashMap<String,Integer>();

IPtest ipTest = new IPtest();
String path = ipTest.getClass().getProtectionDomain().getCodeSource().getLocation().getPath();

//System.out.println(path);
// if (path.indexOf("WEB-INF") > 0) {
// path = path.substring(1, path.indexOf("/WEB-INF/"));
// }
path+="/qqwry";
// 指定纯真数据库的文件名,所在文件夹
IPSeeker ip = new IPSeeker("QQWry.Dat", path);
// 测试IP 58.20.43.13
System.out.println(path);



Vector<String> vecFile = new Vector<String>();
recursion("/opt/haproxy_temp_log", vecFile);

for (String fileName : vecFile) {
System.out.println(fileName);
Pattern pattern = Pattern.compile("\\S*\\d+\\.\\d+\\.\\d+\\.\\d+$");
Matcher m2 = pattern.matcher(fileName);
if(m2.matches()!=false){

System.out.println("不需要处理!@");

}else if(fileName.indexOf("cache.rightgo.net")!=-1){

System.out.println("不需要分析!");
}else {




BufferedReader br = new BufferedReader(new FileReader(fileName));

//System.out.println(i);

String line = null;

while ((line = br.readLine()) != null){

Pattern p = Pattern.compile(":\\s([^:]*):");//这个匹配还是有点取巧了。
//可以这样":\\s*(\\d+\\.\\d+\\.\\d+\\.\\d+)\\s*:"安全一点

Matcher m = null;

if(!"".equals(line)){
m = p.matcher(line);
while(m.find()){

String key1 = ip.getIPLocation(m.group(1).trim()).getCountry();



//北京市、上海市、天津市、重庆市。

// System.out.println(key);

if(key1.indexOf("黑龙江")!=-1){
key1=key1.substring(0, 3);
}else if(key1.indexOf("省")!=-1^key1.indexOf("市")!=-1){


key1=key1.substring(0, 2);




}else if(key1.indexOf("香港")!=-1){
key1=key1.substring(0, 2);
}else if(key1.indexOf("澳门")!=-1){
key1=key1.substring(0, 2);
}


else{
key1="其它";

}





String key2 = ip.getIPLocation(m.group(1).trim()).getArea();


if(key2.indexOf("电信")!=-1){


key2="电信";

}else if(key2.indexOf("移动")!=-1){
key2="移动";

}else if(key2.indexOf("网通")!=-1^key2.indexOf("联通")!=-1){
key2="联通";

}else if(key2.indexOf("学")!=-1^key2.indexOf("教")!=-1){
key2="教育网";
}else{
key2="其它";

}



String fileName2;



if(fileName.indexOf(":80")!=-1){


fileName2 = fileName.substring(fileName.lastIndexOf(File.separator)+1,fileName.lastIndexOf(":80"));

}else{


fileName2 = fileName.substring(fileName.lastIndexOf(File.separator)+1,fileName.length());


}

//System.out.println(fileName2);


String key = key1+key2+fileName2;



//String key = key1+key2+fileName;


// System.out.println(key);

// System.out.println(files[i].getName());



if (map.containsKey(key)) {
Integer temp2 = map.get(key);
map.put(key, ++temp2);
} else {
map.put(key, new Integer(1));
}





}// end of while;



}// end of if;



}//end of while;




br.close();
}

}




try {
Class.forName("com.mysql.jdbc.Driver");
//定义所要用到的三个数据库应用对象
// Connection con=null; //连接对象
// Statement sql=null; //Statement对象(SQL语句)
// ResultSet rs=null; //结果集对象
//进行数据源的连接

Connection con;
try{
con = DriverManager.getConnection ("jdbc:mysql://localhost/cdn_web_user_stats?user=root&password=rjkj@rjkj&useUnicode=true&characterEncoding=utf8");

List<Map.Entry<String, Integer>> list2 = new LinkedList<Map.Entry<String, Integer>>();
list2.addAll(map.entrySet());
for(Iterator<Map.Entry<String, Integer>> ite = list2.iterator(); ite.hasNext();) {

Map.Entry<String, Integer> map2 = ite.next();


System.out.println(map2.getKey());


String n;


if(map2.getKey().indexOf("黑")!=-1 ){

System.out.println(map2.getKey());
n=map2.getKey().substring(5,map2.getKey().length());




if(map2.getKey().indexOf("教")!=-1){
n=map2.getKey().substring(6,map2.getKey().length());

}
}else if(map2.getKey().indexOf("教")!=-1){
n=map2.getKey().substring(5,map2.getKey().length());

}
else{
n = map2.getKey().substring(4,map2.getKey().length());

}





System.out.println(n);






Statement stmt = con.createStatement();





String sql2 = "CREATE TABLE IF NOT EXISTS `cdn_web_user_stats`.`"+n+"` ("
+" `id` int(11) NOT NULL AUTO_INCREMENT,"
+" `date` date NOT NULL,"
+"`zone` char(50) NOT NULL,"
+"`nettype` varchar(50) NOT NULL,"
+"`cnt` int(32) unsigned NOT NULL,"
+"PRIMARY KEY (`id`),"
+" UNIQUE KEY datezone (`date`,`zone`,`nettype`),"
+"KEY `cnt` (`cnt`)"
+" ) ENGINE=MyISAM DEFAULT CHARSET=utf8";
stmt.execute(sql2);



String zone1;

if(map2.getKey().indexOf("黑")!=-1){


zone1 = map2.getKey().substring(0, 3);

}else{

zone1 = map2.getKey().substring(0, 2);

}


String net;

if(map2.getKey().indexOf("黑")!=-1){

net = map2.getKey().substring(3, 5);


if(map2.getKey().indexOf("教")!=-1){
net = map2.getKey().substring(3, 6);
}

} else if(map2.getKey().indexOf("学")!=-1 ^ map2.getKey().indexOf("教")!=-1){
net = map2.getKey().substring(2, 5);

} else{

net = map2.getKey().substring(2, 4);
}


int value = map2.getValue();




String sql="insert into `cdn_web_user_stats`.`"+n+"`(date,zone,nettype,cnt) values(?,?,?,?)";



System.out.println(sql);
PreparedStatement pstmt = con.prepareStatement(sql);



Calendar calendar = Calendar.getInstance();
calendar.add(Calendar.DATE, -1); //得到前一天
Date date = calendar.getTime();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

String n1=df.format(date);


pstmt.setString(1, n1);
pstmt.setString(2,zone1);
pstmt.setString(3, net);
pstmt.setInt(4, value);

if(pstmt.executeUpdate()>0) //判断结果集是否为空,如果不为空则表示有记录
{
System.out.println("添加成功!");
}
else {
System.out.println("添加失败!");
}
}//end of for
// }//end of foe

}catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();

}
}
catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}



}


}


// end of main


...全文
322 32 打赏 收藏 转发到动态 举报
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
QQ785468931 2012-06-07
  • 打赏
  • 举报
回复
恩~找出错误了~原来是配置问题~~
张自强 2012-06-07
  • 打赏
  • 举报
回复
给楼主代码优化的建议:
1、把方法尽量写小。
2、逻辑单元拆分,别把2个或两个以上的逻辑封装在一个方法里面。
3、分类,类的职责明确化,数据调用,业务逻辑,客户端程序分开,别整个都放一个类里面。
4、重点遵循单一职责原则和开闭原则来优化,这样出来的代码,可读性,可维护性,可扩展性都会增强。

http://www.happyalaric.com
QQ785468931 2012-06-07
  • 打赏
  • 举报
回复
我是说不能运行,linux设置自动运行的时候没有设置环境变量~
古布 2012-06-07
  • 打赏
  • 举报
回复
LZ强人。
配置问题?不太明白
配置问题不至于OutOfMemoryError吧
古布 2012-06-05
  • 打赏
  • 举报
回复
LZ的代码我没细看,我只是推测。不好意思,实在是太长了。。。。。。。
不过,当Map存入的数据多了,肯定有内存溢出的问题。

LZ最好能缩小范围,这样方便查查。
QQ785468931 2012-06-05
  • 打赏
  • 举报
回复
Map文件只有那几个省,几个网络类型,100多个文件名,怎么可能溢出~
古布 2012-06-05
  • 打赏
  • 举报
回复
OutOfMemoryError是个Error. 错误堆栈打印出来的异常信息可能不是很准确.LZ不要被错误信息误导了.
古布 2012-06-05
  • 打赏
  • 举报
回复
很明显内存溢出。
代码没有细看。不过你的处理方法是把所有的文件的数据读入,放在Map容器中。然后再存到DB。
当文件过大时,Map容器放不下,肯定会内存溢出。

我在上面已经大致告诉你思路。我再细化一下.
1。从文件中读1000件存入Map
2.把Map存入DB
3.Clean Map
4.继续读下一个1000件.
QQ785468931 2012-06-05
  • 打赏
  • 举报
回复
报得错并不是说数据库的问题啊~
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.regex.Pattern$BitClass.<init>(Pattern.java:2910)
at java.util.regex.Pattern.clazz(Pattern.java:2190)
at java.util.regex.Pattern.sequence(Pattern.java:1818)
at java.util.regex.Pattern.expr(Pattern.java:1752)
at java.util.regex.Pattern.group0(Pattern.java:2530)
at java.util.regex.Pattern.sequence(Pattern.java:1806)
at java.util.regex.Pattern.expr(Pattern.java:1752)
at java.util.regex.Pattern.compile(Pattern.java:1460)
at java.util.regex.Pattern.<init>(Pattern.java:1133)
at java.util.regex.Pattern.compile(Pattern.java:823)
at com.eetrust.cpm.IPparse.Directory2.main(Directory2.java:149)
古布 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]
pstmt.addBatch()
这样可以吗??
[/Quote]

这样肯定不会有内存溢出。
QQ785468931 2012-06-05
  • 打赏
  • 举报
回复
而且什么异常都看不到~
QQ785468931 2012-06-05
  • 打赏
  • 举报
回复
我用了啊~~但就是抽风啊~因为这个日志每晚两点统计一次,我设置了5点自动运行~~但每次都没有结果~然后我第二天手动运行就可以~~~求指教啊~~~~
古布 2012-06-05
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]
我想把能catch到的异常都写入到日志,因为有时候我手动运行没事,设置了自动运行老没有结果~~~
[/Quote]
一般都用log4j把日文同时输出到控制台和文件。
QQ785468931 2012-06-05
  • 打赏
  • 举报
回复
pstmt.addBatch()
这样可以吗??
QQ785468931 2012-06-05
  • 打赏
  • 举报
回复
我想把能catch到的异常都写入到日志,因为有时候我手动运行没事,设置了自动运行老没有结果~~~
古布 2012-06-05
  • 打赏
  • 举报
回复
LZ的代码说白了就是一个file内容存入到DB。个人建议这样做。
1。IPSeeker 类,读取文件。解析数据。
2。DaoUtil 类,一个通过DB操作工具,增删改查。。。
3。File2DataBase 类 将IPSeeker 类读入的数据存入db.
4。采用pstmt.addBatch()方式,为了减少内存,每1000条,pstmt.executeBatch()一次
心如刀割 2012-06-04
  • 打赏
  • 举报
回复
你这个不但要重构,也要排版我们看的才舒服啊。
wsxiangchao 2012-06-04
  • 打赏
  • 举报
回复
看这代码吐血
QQ785468931 2012-06-04
  • 打赏
  • 举报
回复
但是不用if用什么??
QQ785468931 2012-06-04
  • 打赏
  • 举报
回复
再怎么排贴上来都是这样啊~~就是基础不好啊~~而且我想怎么可以不用那么大的内存就可以运行~
加载更多回复(8)

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧