杰普(briup)软件公司JAVA培训项目《电信宽带运营支撑系统(WOSS)》------采集模块
1. 功能
采集原始计费Log(radwtmp)文件,整理成WOSS类数据清单
2.原始数据
用户名、NASIP、上下线标识、TimeStamp、用户IP
#briup1457|037:wKgB1457A|7|1239108870|104.66.128.6
#|037:wKgB7822A|8|1239610552|38.72.174.112
#briup9683|037:wKgB9683A|7|1239191130|215.238.25.124
#briup4367|037:wKgB4367A|7|1239137970|186.106.245.123
#briup4950|037:wKgB4950A|7|1239143800|6.157.134.168
#briup5608|037:wKgB5608A|7|1239150380|137.239.38.56
#briup4486|037:wKgB4486A|7|1239139160|65.150.6.53
#briup7397|037:wKgB7397A|7|1239168270|127.176.46.85
#briup9064|037:wKgB9064A|7|1239184940|133.32.176.98
#briup7585|037:wKgB7585A|7|1239170150|19.147.112.98
#|037:wKgB9683A|8|1239733378|215.238.25.124
#|037:wKgB4950A|8|1239421000|6.157.134.168
......................................................
3. 思考
(1)当前分析的数据中标识为“7”的时候,该数据中是不含下线时间、在线时长,应如何将该数据的每个属性保存至Woss类对象中?
(2)当前分析的数据标识为“8”的时候,该数据包含下线时间,怎样和之前的上线时间进行匹配得到在线时长?
4.代码如下
(1)WOSS类
package com.briup.woss.bean;
import java.io.Serializable;
public class Woss implements Serializable{
private String userName;
private String nasIP;
private Long startTime;
private Long endTime;
private Long duration;
private String userIP;
public String getUserName(){
return userName;
}
public void setUserName(String userName){
this.userName=userName;
}
public String getNasIP(){
return nasIP;
}
public void setNasIP(String nasIP){
this.nasIP=nasIP;
}
public Long getStartTime(){
return startTime;
}
public void setStartTime(Long startTime){
this.startTime=startTime;
}
public Long getEndTime(){
return endTime;
}
public void setEndTime(Long endTime){
this.endTime=endTime;
}
public Long getDuration(){
return duration;
}
public void setDuration(Long duration){
this.duration=duration;
}
public String getUserIP(){
return userIP;
}
public void setUserIP(String userIP){
this.userIP=userIP;
}
}
(2)RawFileParse类(采集原始数据)
package com.briup.woss.client;
import com.briup.woss.bean.Woss;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class RawFileParse{
// 将文件路径以参数的形式提供
// 使得程序具有通用性
public List<Woss> parse(String path) throws IOException, ClassNotFoundException{
// 读取文件中的每一行数据
// 用Java中的类表示实际的物理意义上的文件
File file=new File(path);
// 由于该文件中的内容是文本内容
// 所以采用字符流读取比较方便
// 使用字节流读取原始文件
FileInputStream fis=new FileInputStream(file);
// 使用桥流进行转化
InputStreamReader isr=new InputStreamReader(fis);
// 使用字符流接受桥流转化之后的数据
BufferedReader br=new BufferedReader(isr);
// 简便方法
// BufferedReader reader=new BufferedReader(new FileReader(file));
// 从字符流中获取数据并且打印
// 定义String类型的变量,用于表示
// 一行数据
// 定义Map集合,Key是UserIP,
// Value是Woss对象
Map<String,Woss> map=new HashMap<String, Woss>();
// 创建List集合,用于保存
// 所有属性都完整的Woss对象
List<Woss> list=new ArrayList<Woss>();
String line;
while((line=br.readLine())!=null){
// System.out.println(line);
// 对文件的每一行以“|”进行分割
String[] strs=line.split("[|]");
// 分割之后的结果是字符串数组,
// 一共有5项,用户名、NASIP、
// 标识、上下线时间戳、用户IP
// 创建Woss对象,将分割之后的每一项
// 赋值给Woss对象的相关属性
Woss woss; // 变量的声明
if("7".equals(strs[2])){
// 变量的定义=声明+初始化
woss=new Woss(); // 变量的初始化
woss.setUserName(strs[0]);
woss.setNasIP(strs[1]);
Long st=Long.parseLong(strs[3]);
woss.setStartTime(st);
woss.setUserIP(strs[4]);
// 由于还需要对该对象进行比对匹配,
// 所以使用Map集合将该对象进行保存
map.put(strs[4],woss);
}
if("8".equals(strs[2])){
// 当标识为8的时候,先从Map集合中
// 找到与之相对应的Woss对象,
// 将该行数据中的下线时间和在线时长
// 保存至对应的woss对象中
// 通常情况下,有8肯定有7与之对象
if(map.containsKey(strs[4])){
// 通过UserIP在Map集合中获取到
// woss对象
Woss wossFromMap=map.get(strs[4]);
Long et=Long.parseLong(strs[3]);
wossFromMap.setEndTime(et);
// 计算在线时长:下线时间戳-上线时间戳
Long dt=et-wossFromMap.getStartTime();
wossFromMap.setDuration(dt);
list.add(wossFromMap);
// 将完整的Woss对象存放至List集合之后
// 移除Map中的不完整的Woss对象
map.remove(strs[4]);
}
}
}
// 当while循环结束之后,整个数据的处理也就
// 完成了,完整的Woss对象被存储至List集合
// 中,不完整的Woss对象呗保存至Map集合中
// for(int x=0;x<10;x++){
// System.out.println(list.get(x));
// }
// System.out.println("-----------");
// 设置计数器,只需要取Map中的10个元素
// int index=0;
// 将Map集合的所有Key存储至Set集合中
// Set<String> keys=map.keySet();
// 由于Set集合的特殊性,不能通过取其索引
// 的形式来遍历该Set集合,只能通过创建
// 迭代器的形式来遍历。
// Iterator<String> it=keys.iterator();
// 先使用迭代器对象调用hasNext方法判断是否有
// 下一个元素,如果有则为true,并且判断计数器的
// 值是否小于10,如果都成立,则执行while的循环体
// while(it.hasNext()&&index++<10){
// 通过迭代器的next方法获取到key
// String key=it.next();
// 通过map的get方法和获取到的key获取到value
// Woss woss=map.get(key);
// System.out.println(woss);
// }
// Map集合遍历的简单形式,
// 使用JDK8中的Lambda表达式
// 匿名内部类对于局部变量的访问
// int x[]=new int[1];
// map.forEach((k,v)->{
// if(x[0]++<10){
// System.out.println(v);
// }
// });
return list;
}
}
至此,这个项目的采集模块就结束了。如需要整个项目的源码(包含采集,备份,入库,网络、日志、配置等各个模块)请留下邮箱。