杰普(briup)软件公司JAVA培训项目《电信宽带运营支撑系统(WOSS)》

杰普(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;
    }
}

至此,这个项目的采集模块就结束了。如需要整个项目的源码(包含采集,备份,入库,网络、日志、配置等各个模块)请留下邮箱。

发布了5 篇原创文章 · 获赞 0 · 访问量 152

猜你喜欢

转载自blog.csdn.net/qq_44972405/article/details/101119983