数据挖掘DMS代码JAVA.docx
《数据挖掘DMS代码JAVA.docx》由会员分享,可在线阅读,更多相关《数据挖掘DMS代码JAVA.docx(18页珍藏版)》请在冰豆网上搜索。
数据挖掘DMS代码JAVA
packagecom.tarena.dms。
importjava.io.BufferedReader。
importjava.io.File。
importjava.io.FileInputStream。
importjava.io.FileNotFoundException。
importjava.io.FileReader。
importjava.io.IOException。
importjava.io.InputStream。
importjava.io.OutputStream。
importjava.io.PrintWriter。
importjava.io.RandomAccessFile。
import.Socket。
importjava.util.ArrayList。
importjava.util.List。
importjava.util.Properties。
importjava.util.Scanner。
importjavax.swing.JFrame。
publicclassDMSClient{
privateDMSClientFrameframe。
/**
*用于保存日志文件读取位置
*/
privateFilepositionFile。
/**
*用readLogs生成的文本日志文件
*/
privateFiletextLogFile。
/**
*原始的unix日志文件
*/
privateFilelogFile。
publicstaticfinalintLOG_LENGTH=372。
publicstaticfinalshortLOGIN=7。
publicstaticfinalshortLOGOUT=8。
privatePropertiesconfig。
privateintbatch。
privateFilematchedLogFile。
privateFileloginFile。
privateStringserverHost。
privateintserverPort。
/**
*利用构造器初始化对象属性
*/
publicDMSClient(>{
//读取配置文件,利用配置文件初始化参数对象
config=newProperties(>。
try{
config.load(newFileInputStream("client.properties">>。
b5E2RGbCAP
}catch(IOExceptione>{
e.printStackTrace(>。
thrownewRuntimeException(e>。
}
logFile=newFile(config.getProperty("log.file">>。
p1EanqFDPw
positionFile=newFile(config.getProperty("position.file">>。
DXDiTa9E3d
textLogFile=newFile(config.getProperty("text.log.file">>。
RTCrpUDGiT
batch=Integer.parseInt(config.getProperty("batch">>。
5PCzVD7HxA
matchedLogFile=newFile(config.getProperty("matched.log.file">>。
jLBHrnAILg
loginFile=newFile(config.getProperty("login.log.file">>。
xHAQX74J0X
serverHost=config.getProperty("server.ip">。
serverPort=Integer.parseInt(config.getProperty("server.port">>。
LDAYtRyKfE
}
publicvoidshowReadLogsMsg(Stringmsg>{
if(frame==null>{
System.out.println(msg>。
}else{
frame.showReadLogsMsg(msg>。
}
}
/**
*读取日志文件
*/
publicvoidreadLogs(>{
//要保证在调用readLog(>时logFile变量要有适用的对象
if(!
logFile.exists(>>{
showReadLogsMsg("没有unix日志文件!
">。
return。
}
if(textLogFile.exists(>>{
showReadLogsMsg("文本文件存在!
本次不读取了!
">。
return。
}
//读取上回位置判断是否有新记录产生
intn=0。
//上次读取的记录号
Scannerin=null。
if(positionFile.exists(>>{
try{
in=newScanner(positionFile>。
n=in.nextInt(>。
showReadLogsMsg("读取本次记录号"+n>。
}catch(IOExceptione>{
e.printStackTrace(>。
showReadLogsMsg("没有读取位置文件,从0读取。
">。
n=0。
}finally{
if(in!
=null>{
in.close(>。
}
}
}
//检查是否有新记录产生
if(n*LOG_LENGTH==logFile.length(>>{
showReadLogsMsg("没有新记录产生!
">。
return。
}
//数据检查结束
//日志读取:
从当前记录n开始,每次读取一批数据到log.txt
//批次:
每批次10个<最大)
//打开输入文件RandomAccessFile
//打开输出文件PrintWriter先创建一个临时文件作为输出文件,等文件用完后再改名为log.txtZzz6ZB2Ltk
//使用循环从输入文件读取数据,写出输出文件
//intbatch=10。
RandomAccessFileraf=null。
PrintWriterout=null。
//临时文件,使用系统时间作文件名
Filetemp=newFile(System.currentTimeMillis(>+".txt">。
dvzfvkwMI1
showReadLogsMsg("使用临时文件"+temp>。
try{
raf=newRandomAccessFile(logFile,"r">。
showReadLogsMsg("打开文件"+logFile>。
showReadLogsMsg("文件长度:
"+raf.length(>>。
//输出目标是临时文件
out=newPrintWriter(temp>。
showReadLogsMsg("打开临时文件"+temp>。
inti。
//利用i得到下回读取的起始位置
//for循环读取10条记录或到文件末尾就结束
for(i=0。
ii++>{
//假设n=10,batch=10
//i=10,11....19
intn1=n+i。
showReadLogsMsg("偏移量:
"+raf.getFilePointer(>>。
if(raf.getFilePointer(>==(raf.length(>-1>>{break。
}
Stringlog=readLog(raf,n1>。
if(log==null>{break。
}
showReadLogsMsg("读取日志"+n1+":
"+log>。
out.println(log>。
showReadLogsMsg("写出日志"+log>。
}
//记录最后读取位置
n=n+i。
PrintWriterw=newPrintWriter(positionFile>。
w.println(n>。
showReadLogsMsg("保存下次读取记录号:
"+n>。
w.close(>。
}catch(Exceptione>{
e.printStackTrace(>。
}finally{
try{
if(raf!
=null>{
raf.close(>。
}
if(out!
=null>{
out.close(>。
}
}catch(IOExceptione>{
e.printStackTrace(>。
}
showReadLogsMsg("关闭文件">。
}
//将临时文件改名
if(!
temp.renameTo(textLogFile>>{
showReadLogsMsg("临时文件改名失败!
">。
}
showReadLogsMsg("临时文件改名为log.txt">。
}
publicvoidshowMatchLogs(Stringmsg>{
if(frame==null>{
System.out.println(msg>。
}else{
frame.showMatchLogsMsg(msg>。
}
}
publicvoidmatchLogs(>{
showMatchLogs("开始匹配日志数据">。
if(!
textLogFile.exists(>>{
showMatchLogs("没有找到输入数据:
"+textLogFile>。
return。
}
if(matchedLogFile.exists(>>{
showMatchLogs("匹配数据存在,"+matchedLogFile+"发送后才能继续匹配">。
rqyn14ZNXI
return。
}
Listlogs=newArrayList(>。
Listlogins=newArrayList(>。
Listmatched=newArrayList(>。
try{
readLogs(textLogFile,logs>。
//读取log.txt
readLogs(loginFile,logs>。
//读取login.txt
showMatchLogs("读取文件:
"+textLogFile+","+loginFile>。
}catch(Exceptione>{
showError(e>。
showMatchLogs("读取文失败:
"+e>。
return。
}
//匹配处理
for(Loglog:
logs>{
if(log.getType(>==LOGIN>{
Loglogin=log。
showMatchLogs("发现登录记录:
"+login>。
Loglogout=findLogoutByLogin(logs,login>。
showMatchLogs("查找登录记录:
"+logout>。
if(logout==null>{
logins.add(login>。
showMatchLogs("单条登录记录:
"+login>。
}else{
matched.add(newLogPair(login,logout>>。
showMatchLogs("记录对:
"+login+","+logout>。
}
}
}
//保存文件
FiletempM=newFile(System.currentTimeMillis(>+"m.txt">。
EmxvxOtOco
FiletempL=newFile(System.currentTimeMillis(>+"l.txt">。
SixE2yXPq5
try{
//先保存到临时文件,保存成功再改名为正式文件
save(matched,tempM>。
save(logins,tempL>。
showMatchLogs("保存文结束!
"+tempM+","+tempL>。
if(tempM.renameTo(matchedLogFile>>{
loginFile.delete(>。
textLogFile.delete(>。
tempL.renameTo(loginFile>。
}
showMatchLogs("删除文成功">。
}catch(Exceptione>{
showError(e>。
showMatchLogs("保存文件失败">。
return。
}
showMatchLogs("结束匹配日志数据">。
}
/**
*将list每个元素用文本写出
*@paramlist
*@paramfile
*/
privatevoidsave(Listlist,Filefile>throwsIOException{6ewMyirQFL
PrintWriterout=newPrintWriter(file>。
try{
for(Objectobj:
list>{
//调用Log或LogPair的重写的toString(>
out.println(obj>。
//调用对象toString(>
}
}catch(Exceptione>{
thrownewIOException(e>。
}finally{
if(out!
=null>{
out.close(>。
}
}
}
/**
*在logs中根据login找logout
*@paramlogs
*@paramlogin
*@return
*/
privateLogfindLogoutByLogin(Listlogs,Loglogin>{kavU42VRUs
//查找每个登录日志如果这个登录日志是登出状态而且用户名进程号和ip都一致就匹配上
for(Loglog:
logs>{
if(log.getType(>==LOGOUT>{
if(log.getUser(>.equals(login.getUser(>>&&
log.getPid(>==login.getPid(>&&
log.getIp(>.equals(login.getIp(>>>{
returnlog。
}
}
}
returnnull。
}
/**
*将文件内容读取到集合中,如果文件不存在就不读取了
*@paramfile
*@paramlogs
*/
privatevoidreadLogs(Filefile,Listlogs>throwsIOException{y6v3ALoS89
if(!
file.exists(>>{
return。
}
BufferedReaderin=newBufferedReader(newFileReader(file>>。
M2ub6vSTnP
try{
Stringstr。
while((str=in.readLine(>>!
=null>{
logs.add(newLog(str>>。
}
}catch(Exceptione>{
showError(e>。
throwe。
}finally{
if(in!
=null>{
in.close(>。
}
}
}
publicvoidshowError(Exceptione>{
if(frame==null>{
e.printStackTrace(>。
。
}else{
frame.showErrorMsg(e>。
}
}
publicvoidshowSendMsg(Stringmsg>{
if(frame==null>{
System.out.println(msg>。
}else{
frame.showSendMsg(msg>。
}
}
/**
*将匹配数据发送到服务器
*/
publicvoidsendLogs(>{
showSendMsg("开始发送数据">。
if(!
matchedLogFile.exists(>>{
showSendMsg("发送数据不存在!
">。
return。
}
Listlist=newArrayList(>。
readFile(matchedLogFile,list>。
Sockets=null。
try{
showSendMsg("连接到服务器:
"+serverHost+":
"+serverPort>。
s=newSocket(serverHost,serverPort>。
showSendMsg("连接成功">。
InputStreamin=s.getInputStream(>。
OutputStreamout=s.getOutputStream(>。
showSendMsg("向服务器发送数据">。
//向服务器发送数据
NetService.send(out,list>。
//response:
响应,服务器响应结果
Listresponse=NetService.receive(in>。
showSendMsg("得到服务器响应:
"+response>。
if(response.contains("OK">>{
matchedLogFile.delete(>。
showSendMsg("删除已发送数据文件"+matchedLogFile>。
}
}catch(Exceptione>{
showError(e>。
}finally{
if(s!
=null>{
try{
s.close(>。
}catch(IOExceptione>{
e.printStackTrace(>。
}
}
showSendMsg("关闭网络连接">。
}
showSendMsg("发送数据结束">。
}
/**
*读取匹配成对的日志数据到集合中
*@paramfile
*@paramlist
*/
privatevoidreadFile(Filefile,Listlist>{0YujCfmUCw
Scannerin=null。
try{
in=newScanner(file>。
while(in.hasNext(>>{
Stringstr=in.nextLine(>。
//System.out.println(str>。
list.add(str>。
}
}catch(FileNotFoundExceptione>{
e.printStackTrace(>。
}finally{
if(in!
=null>{
in.close(>。
}
}
}
/**
*DMSClient的start<)方法
*/
publicvoidstart(>{
//启动主流程时显示界面,单元测试时没有界面
frame=newDMSClientFrame(>。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE>。
eUts8ZQVRd
frame.setVisible(true>。
while(true>{
readLogs(>。
//读取日志
matchLogs(>。
//匹配日志
sendLogs(>。
//发送日志
try{
Thread.sleep(5000>。
}catch(InterruptedExceptione>{
e.printStackTrace(>。
}
}
}
publicstaticvoidmain(String[]args>{
DMSClientclient=newDMSClient(>。
//启动客户端的主处理流程
client.start(>。
}
/**
*读取日志数据
*@paramin被读取的日志文件
*@paramn记录号从0开始
*@return文本格式日志数据
*如:
user,pid,type,time,ip
*@throwsException
*/
publicStringreadLog(RandomAccessFilein,intn>throwsIOException{sQsAEJkW5T
intstart=372*n。
byte[]buf=newbyte[32]。
in.seek(start+0>。
in.read(buf>。
//连续读32个byte
Stringuser=newString(buf,"