课件课后练习代码-01.java基础经典案例_第1页
课件课后练习代码-01.java基础经典案例_第2页
课件课后练习代码-01.java基础经典案例_第3页
课件课后练习代码-01.java基础经典案例_第4页
课件课后练习代码-01.java基础经典案例_第5页
已阅读5页,还剩49页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Java语言基础DMSV1.0日志数据解析算DMSV1.0日志数据匹配算DMSV1.0登录数据查询算DMSV1.0系统整DMSV1.0DMS0业务中需要完成日志数据的解析功能并显示解析后的记录。从日志数据源系统中得到原始数据,这些原始数据是日志数据源程从nix系统的日志文件中而来;解原始记录中的用户登入和登出的数据。控制台输出情况如图-5所示:图-byte[]logs=每条登录记录包含372字节的数据,因此,登录的录数为:数组长登录的用户用户登录的进程用户登录/登出的时这些需要的数据信息在每372个字节中的位置如表-1所示表-1字节数组中需要的数据位置说*解析日志数据logs解析结 到5个数组中解析规则每372个字节数据为**@param 原始日志数据,每372*@param *@param *@param *@param *@param publicstaticvoidparseLogs(byte[]logs,String[]users,int[]short[]types,int[]times,String[]hosts)for(inti=0,start=0;i<users.length;i++,start+=users[i]=toString(logs,start+0,pids[i]=toInt(logs,start+=toShort(logs,start+=toInt(logs,start+=toString(logs,start+114, }使用8位掩码清理int数据:将高24位清理为0,低8位是从数组中的byte数*将byte数组中连续的2个byte数据转换为一个short*@param*@param*@return将连续两个byte转换为一个shortpublicstaticshorttoShort(byte[]bytes,intoffset)intd1=bytes[offset+0];intd2=bytes[offset+{d1&=d2&=0xff;d1<<=8;d2<<=inti=d1+d2;return(short)i;}连续4个byte数据到int的类型变量:d1,d2,d3,使用8位掩码清理int数据:将高24位清理为0,低8位是从数组中的byte数将d1,d2,d3,d4拼接为一个int数据:就是将4个整数相加使两个整数数据拼接为一个整数返回整数*将byte数组中连续的4个byte数据转换为一个int**@param *@param *@return将连续4个byte转换为一个intpublicstaticinttoInt(byte[]bytes,intoffset)intd1=bytes[offset+0]&intd2=bytes[offset+1]&intd3=bytes[offset+2]&intd4=bytes[offset+3]&inti=(d1<<24)+(d2<<16)+(d3<<8)+return}利用字符串的构造器newString(bytebytes利用方法trim*byte数组中从offset位置开始,解析length个字节为String*@param*@param@param要解析的byte*@returnStringpublicstaticStringtoString(byte[]bytes,intoffset,int{returnnewString(bytes,offset,}在ParseLogs类中添加parseLogs方法,解析日志数据logs解析结果到5个数组中。算法

图-*解析日志数据logs*到5个数组中解析规则每372*原始日志数据,每372**pblicstaticvoidparseLogs(byte[]logs,String[]users,int[]short[]types,int[]times,String[]hosts)for(inti=0,start=0;i<users.length;i++,start+={users[i]=toString(logs,start+0,pids[i]=toInt(logs,start+68);types[i]=toShort(logs,start+72);times[i]=toInt(logs,start+80);hosts[i]=toString(logs,start+114,}}**publicstaticvoidprintLogs(Stringint[]pad={15,10,10,30,20int[]pids,short[]+StringUtils.rightPad("pid",*@param**@param**@param**@param**@param+StringUtils.rightPad("type",+StringUtils.rightPad("time",+StringUtils.rightPad("host",pad[0]+pad[1]+pad[2]+pad[3]+for(inti=0;i<users.length;i++) +StringUtils.rightPad(""+pids[i],+StringUtils.rightPad(""+types[i],+++StringUtils.rightPad(hosts[i],}}publicstaticvoidmain(String[]args)byte[]logs=LogDataSource.getLogs();intcount=logs.length/372;//登录记录数量String[]users=newint[]pids=newshort[]types=newint[]times=new String[]hosts=newparseLogs(logs,users,pids,types,times,printLogs(users,pids,types,times,}publicclassParseLogspublicstaticvoidmain(String[]args)byte[]logsLogDataSource.getLogs();//获取原始日志数据intcount=logs.length/372;//登录记录数量 String[]users=newint[]pids=new short[]types=new int[]times=new String[]hosts=newparseLogs(logs,users,pids,types,times,printLogs(users,pids,types,times,hosts); *解析日志数据logs解析结 到5个数组中解析规则每372个字节数据为**@param 原始日志数据,每372*@param *@param *@param *@param *@param publicstaticvoidparseLogs(byte[]logs,String[]users,int[]short[]types,int[]times,String[]hosts)for(inti=0,start=0;i<users.length;i++,start+=users[i]=toString(logs,start+0,pids[i]=toInt(logs,start+types[i]=toShort(logs,start+times[i]=toInt(logs,start+hosts[i]=toString(logs,start+114, **@param *@param *@param *@param *@param publicstaticvoidprintLogs(Stringusers[],int[]pids,short[]int[]pad={15,10,10,30,20System.out.println(StringUtils.rightPad("user", +StringUtils.rightPad("pid", +StringUtils.rightPad("type", +StringUtils.rightPad("time", +StringUtils.rightPad("host",pad[0]+pad[1]+pad[2]+pad[3]+for(inti=0;i<users.length;i++) +StringUtils.rightPad(""+pids[i], +StringUtils.rightPad(""+types[i], + + +StringUtils.rightPad(hosts[i], *将byte数组中连续的4个byte数据转换为一个int**@param 需 *@param *@return将连续4个byte转换为一个intpublicstaticinttoInt(byte[]bytes,intoffset)intd1=bytes[offset+0]&intd2=bytes[offset+1]&intd3=bytes[offset+2]&intd4=bytes[offset+3]&inti=(d1<<24)+(d2<<16)+(d3<<8)+return *将byte数组中连续的2个byte数据转换为一个short**@param 需 *@param *@return将连续两个byte转换为一个shortpublicstaticshorttoShort(byte[]bytes,intoffset)intd1=bytes[offset+intd2=bytes[offset+d1&=d2&=d1<<=d2<<=inti=d1+return(short)}将**要解析的byte*@returnStringpublicstaticStringtoString(byte[]bytes,intoffset,intlength)returnnewString(bytes,offset,length).trim();}}DMSV1.0DMS1.0图-59图-users数组,pids数组,types数组中保存的是原始数据,匹配结果序号到entrys中.匹配过程如

图-**users,pids,types**@paramentrys

@paramusers@param @paramtypespublicstaticvoidmatchLogs(int[]entrys,String[]users,int[]piintindex=0;for(inti=0;i<users.length;i++){(type==7)if(types[i]==7)entrys[index++]=i;(i+1)for(intj=i+1;j<users.length;j++)if(users[i].equals(users[j&&pids[i]==pids[j]&&types[j]==8){//找到logout记录entrys[indexj;break;}}}}}**出数据users,pids,types*匹配结果@param@param@param@paramentrys publicstaticvoidmatchLogs(int[]entrys,String[]users,int[]entrys[index++]=j;break;//找到就可以结束查找过程}}} }intindex=for(inti=0;i<users.length;i++){(type==7)if(types[i]==7)entrys[index++]=i;//从登录记录位置(i+1for(intj=i+1;j<users.length;j++)if(users[i].equals(users[j])&&pids[i]==pids[j]&&types[j]==8){//找到logout记录*publicstaticvoidprintRecHeader()String[]headers={"user","pid","login_time","logout_time","interval","host"};int[]pad={15,10,30,30,10,20inttotal=for(inti=0;i<headers.length;{total+=}System.out.println(StringUtils.repeat("-",total));}**@paramuser*@param *@paramloginTime*@paramlogoutTime*@paramhostpublicstaticvoidprintRec(Stringuser,intpid,intintlogoutTime,Stringhost)int[]pad={15,10,30,30,10,20intpadIndex=System.out.print(StringUtils.rightPad(pid+DateUtils.formatDate(loginTim),DateUtils.formatDate(logoutTime),logoutTime-loginTime)+ *@param@param@paramentrysusers@paramtypes@paramhostspublicstaticvoidlist(int[]entrys,String[]users,int[]pids,short[]types,int[]times,String[]hosts){for(inti=0;i<entrys.length;i+={intlogin=entrys[i];intlogout=entrys[i+1];printRec(users[login],pids[login],times[login],times[logout],hosts[login]);}}byte[]logs=intcount=logs.length/372;//登录记录数量String[]users=newint[]pids=newshort[]types=newint[]times=newString[]hosts=newParseLogs.parseLogs(logs,users,pids,types,int[]entrys=newmatchLogs(entrys,users,pids,list(entrys,users,pids,types,times, publicpublicstaticvoidmain(String[]args)publicclassMatchLogspublicstaticvoidmain(String[]args)byte[]logs=LogDataSource.getLogs(); intcount=logs.length372;//登录记录数量String[]users=newint[]pids=newshort[]types=newint[]times=newString[]hosts=newString[count];ParseLogs.parseLogs(logs,users,pids,types,times,int[]entrys=newmatchLogs(entrys,users,pids,list(entrys,users,pids,types,times,hosts); **出数据users,pids,types*匹配结 *@paramentrys*@paramusers登录用户名数组*@param *@paramtypes登录类型的数组publicstaticvoidmatchLogs(int[]entrys,String[]users,int[]intindex=for(inti=0;i<users.length;i//如果是登录记录(type==7)if(types[i]==7)entrys[index++]=i//从登录记录位置(i+1for(intj=i+1;j<users.length;j++)(users[i].equals(users[j])&&pids[i]&&types[j]==8){//找到logoutentrys[index++]=j;break;//找到就可以结束查找过程}}}}}**@paramentrys*@paramusers*@parampids解析以后的用户进程号数组*@paramtypes*@paramhostspublicstaticvoidlist(int[]entrys,String[]short[]types,int[]times,String[]hosts)for(inti=0;i<entrys.length;i+=2)intlogin=intlogout=entrys[i+printRec(users[login],times[login],times[logout],}}*publicstaticvoidprintRecHeader()String[]headers={"user","pid","login_time","interval","host"int[]pad={15,10,30,30,10,20inttotal=for(inti=0;i<headers.length;i++)total+= System.out.println(StringUtils.repeat("-", **@paramuser*@param *@paramloginTime*@paramlogoutTime*@paramhostpublicstaticvoidprintRec(Stringuser,intpid,intintlogoutTime,Stringhost)int[]pad={15,10,30,30,10,20intpadIndex=System.out.print(StringUtils.rightPad(pid+DateUtils.formatDate(loginTim),DateUtils.formatDate(logoutTime),logoutTime-loginTime)+ DMSV1.0DMS1.0图-图-***@param**@param**@param*@param日志数据进程@param@param@parampublicstaticvoidfind(Stringname,int[]entrys,String[]users,int[]pids,short[]types,int[]times,String[]hosts){for(inti=0;i<entrys.length;i+={intlogin=entrys[i];intlogout=entrys[i+1];if{MatchLogs.printRec(users[login],pids[login],times[login],times[logout],hosts[login]);}}}publicstaticvoidmain(String[]args)byte[]logs=intcount=logs.length/372;String[]users=newint[]pids=newint[count];short[]types=newshort[count];int[]times=newint[count];String[]hosts=newString[count];ParseLogs.parseLogs(logs,users,pids,types,times,//ParseLogs.printLogs(users,pids,types,times,int[]entrys=newMatchLogs.matchLogs(entrys,users,pids,MatchLogs.list(entrys,users,pids,types,times,Scannerscanner=newScanner(System.in);Stringname=scanner.next().trim();find(name,entrys,users,pids,types,times,}publicclassFindRecpublicstaticvoidmain(String[]{byte[]logsintcount=logs.length/372;String[]users=newint[]pids=newint[count];short[]types=newshort[count];int[]times=newint[count];String[]hosts=newParseLogs.parseLogs(logs,users,pids,types,times,//ParseLogs.printLogs(users,pids,types,times,int[]entrys=newMatchLogs.matchLogs(entrys,users,pids,types);MatchLogs.list(entrys,users,pids,types,times,hosts);Scannerscanner=newStringname=scanner.next().trim(); find(name,entrys,users,pids,types,times,hosts); ***@param *@param *@param *@param 日志数据进程*@param *@param *@param 日志数据,登录主机名,一般是publicstaticvoidfind(Stringname,int[]entrys,String[]int[]pids,short[]types,int[]times,String[]hosts)for(inti=0;i<entrys.length;i+=2)intlogin=intlogout=entrys[i+if(users[login].equals(name))pids[login],times[logout],}}}}DMSV1.0系统整合DMS1.0DMS1.0的界面效果如图-63所示。图-图publicclassDms*解析日志数据logs解析结果*到5个数组中解析规则每372@param*@param原始日志数据,每372@param*@param *@param *@param publicstaticvoidparseLogs(byte[]logs,String[]users,int[]short[]types,int[]times,String[]hosts)for(inti=0,start=0;i<users.length;i++,start+= users[i]=toString(logs,start+0,pids[i]=toInt(logs,start+types[i]=toShort(logs,start+times[i]=toInt(logs,start+hosts[i]=toString(logs,start+114, *将byte数组中连续的4个byte数据转换为一个int**@param 需 *@param *@return将连续4个byte转换为一个intpublicstaticinttoInt(byte[]bytes,intoffset)intd1=bytes[offset+0]&intd2=bytes[offset+1]&intd3=bytes[offset+2]&intd4=bytes[offset+3]&inti=(d1<<24)+(d2<<16)+(d3<<8)+return *将byte数组中连续的2个byte数据转换为一个short**@param 需 *@param *@return将连续两个byte转换为一个shortpublicstaticshorttoShort(byte[]bytes,intoffset)intd1=bytes[offset+intd2=bytes[offset+d1&=d2&=d1<<=d2<<=inti=d1+return(short)}*将byte数组中从offset位置开始,解析length个字节为String**@param *@param *@param 连续的的byte*@returnStringpublicstaticStringtoString(byte[]bytes,intoffset,int{returnnewString(bytes,offset,}}整合MatchLogs类中的matchLogslistprintRecHeader方法,printRec方法到**匹配结 *@paramentrys*@paramusers登录用户名数组*@param *@paramtypes登录类型的数组publicstaticvoidmatchLogs(int[]entrys,String[]users,int[]intindex=for(inti=0;i<users.length;i//如果是登录记录(type==7)if(types[i]==7)entrys[index++]=i//从登录记录位置(i+1for(intj=i+1;j<users.length;j++)if(users[i].equals(users[j])&&pids[i]==&&types[j]==8){//找到logoutentrys[index++]=j;break; **@paramentrys*@paramusers*@parampids解析以后的用户进程号数组*@paramtypes*@paramhostspublicstaticvoidlist(int[]entrys,String[]users,int[]short[]types,int[]times,String[]hosts)for(inti=0;i<entrys.length;i+=2)intlogin=intlogout=entrys[i+printRec(users[login],pids[login],times[logout], *publicstaticvoidprintRecHeader()String[]headers={"user","pid","login_time","interval","host"int[]pad={15,10,30,30,10,20inttotal=for(inti=0;i<headers.length;i++)total+= System.out.println(StringUtils.repeat("-", **@paramuser*@param *@paramloginTime*@paramlogoutTime*@paramhostpublicstaticvoidprintRec(Stringuser,intpid,intintlogoutTime,Stringhost)int[]pad={15,10,30,30,10,20intpadIndex=+"",Time),pad[padIndex++]));tTime),pad[padIndex++]));System.out.print(StringUtils.rightPad((logoutTime-+}**@param@param日志数据,登录主机名,一般是publicstaticvoidfind(Stringname,int[]entrys,String[]int[]pids,short[]types,int[]times,String[]{for(inti=0;i<entrys.length;i+=2){intlogin=entrys[i];*@param**@param**@param**@param*日志数据进程*@param*intlogout=entrys[i+if{MatchLogs.printRec(users[login],pids[login],times[logout],}}publicstaticvoidmain(String[]args)byte[]logs=intcount=logs.length/372//根据日志数量创建解析结 String[]users=newint[]pids=newshort[]types=newint[]times=newString[]hosts=new//解析日志,将结果保存到结 parseLogs(logs,users,pids,types,times,hosts); list(entrys,users,pids,types,times,hosts);int[]entrys=new//匹配日志(根据用户名,进程ID,日志类型),将匹配结 到,matchLogs(entrys,users,pids,types);Scannerconsole=newwhile(true)System.out.print("DMSv01>请选择功能:1——显示全部记 //从控制台 Stringcmd=if(cmd.equals("1"))//如果是命令是"1"}elseif(cmd.equals("0"))System.out.println("DMSv01>}elseSystem.out.println("DMSv01>}}}list(list(entrys,users,pids,types,times,}elseif(cmd.equals("2"))//如果是命令是"2"System.out.print("DMSv01>输入用户名:");Stringanamentnsot);types,publicclassDmspublicstaticvoidmain(String[]args)byte[]logs=intcount=logs.length/372;String[]users=newint[]pids=newshort[]types=newint[]times=newint[count];String[]hosts=newString[count];parseLogs(logs,users,pids,types,times,int[]entrys=newID,matchLogs(entrys,users,pids,Scannerconsole=newwhile(true)System.out.print("DMSv01>请选择功能:1——显示全部记 //从控制台 Stringcmd=if(cmd.equals("1"))//如果是命令是"1"list(entrys,users,pids,types,times,}elseif(cmd.equals("2"))//如果是命令是"2"System.out.print("DMSv01>Stringname=find(name,entrys,users,pids,types,times,}elseif(cmd.equals("0"))}else ***@param *@param *@param *@param 日志数据进程*@param *@param *@param 日志数据,登录主机名,一般是publicstaticvoidfind(Stringname,int[]entrys,String[]int[]pids,short[]types,int[]times,String[]hosts)for(inti=0;i<entrys.length;i+=2)intlogin=intlogout=entrys[i+if(users[login].equals(name))printRec(users[login],pids[login],times[logout], **@paramentrys*@paramusers*@parampids解析以后的用户进程号数组*@paramtypes*@paramhostspublicstaticvoidlist(int[]entrys,String[]users,int[]short[]types,int[]times,String[]hosts)for(inti=0;i<entrys.length;i+=2)intlogin=intlogout=entrys[i+printRec(users[login],times[login],times[logout], **匹配结 **@param*@param*@param*@parampublicstaticvoidmatchLogs(int[]entrys,String[]users,int[]intindex=for(inti=0;i<users.length;i//如果是登录记录(type==7)if(types[i]==7)entrys[index++]=i//从登录记录位置(i+1for(intj=i+1;j<users.length;j++)if(users[i].equals(users[j])&&pids[i]==&&types[j]==8){//找到logou

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论