零基础学习java------29---------网络日志数据session案例,runtime(导出jar程序)
一. 网络日志数据session案例
部分数据

数据中的字段分别为:
访客ip地址,访客访问时间,访客请求的url及协议,网站响应码,网站返回数据量,访客的referral url,访客的客户端操作系统及浏览器信息
需求:
(1)
需要为从访问日志中梳理出每一个session(如果一个用户两次相邻请求之间的时间差<30分钟,则该两次请求都属于同一个session(不考虑不同的URL),否则分属不同的session),并为session中的历次请求打上序号,示意如下:
  
(2) 将每次session进行汇总,得出用户每次session的浏览起、止页面,每次session会话总时长等,示意如下:
  
步骤分析:
1 读取日志文件,获取用户请求数据,会根据用户的ip进行分组 (Map)
2 将用户的url按照时间排序
3. 判断两个相邻的url的时间差值是否是在30分钟内来确定是否是同一个session
4. 判断为每个url生成sessionId并打上运行顺序标签
5. 第二问,获取sessionId相同的url,得出最先请求和最终请求的两个url和之间的时间差值
写代码时犯的一些错误
(1)写正则时,忽视了空格的存在,空格也会进行正则的匹配(),自己将第一个写成(\\d{1,3}\\.)(此处自己无意间加了一个空格){3}\\d{1,3},导致匹配失败

(2)代码写的位置出现问题
将2处的代码块写在1处,导致打印结果出现问题

说明:此处只写第一问的代码
工具类(SessionUtils):
public class SessionUtils {
    /**
     * 正则获取需要的子串
     * @param str
     * @param regex
     * @return
     */
    public static String getStrByRegex(String str,String regex) {
        String res = null;
        Pattern p = Pattern.compile(regex);
        Matcher matcher = p.matcher(str);
        while(matcher.find()) {
            res = matcher.group();
        }
        return res;
    }
    /**
     * 将字符串形式的时间转为date形式的时间
     * @param strDate
     * @return
     */
    public static Date parseStrToDate(String strDate) {
        Date date = null;
        try {
            if(strDate != null) {
                String str = strDate.substring(1, strDate.length() - 1);
                SimpleDateFormat sdf = new SimpleDateFormat("dd/MMM/yyyy:hh:mm:ss",Locale.US);
                date = sdf.parse(str);
            }
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
    /**
     * 获取唯一的sessionId
     * @return
     */
    public static String getSessionId() {
        UUID uuid = UUID.randomUUID();
        String str = uuid.toString();
        String sessionId = str.replaceAll("-","");
        return sessionId;
    }
    /**
     * 将map中的list以date的形式排序
     * @param map
     */
    public static void sortDate(Map<String, List<SessionBean>> map) {
        Set<Entry<String,List<SessionBean>>> entrySet = map.entrySet();
        for (Entry<String, List<SessionBean>> entry : entrySet) {
            List<SessionBean> list = entry.getValue();
            Collections.sort(list, new Comparator<SessionBean>() {
                @Override
                public int compare(SessionBean o1, SessionBean o2) {
                    return o1.getDate().before(o2.getDate())?-1:1;
                }
            });
        }
    }
    /**
     * 判断两个相邻的sessionBean是否是同一个sessionId
     * @param bean1
     * @param bean2
     * @return
     */
    public static boolean isSameSession(SessionBean bean1, SessionBean bean2) {
        boolean res = false;
        //
        if (bean1 != null && bean2 != null) {
            Date d1 = bean1.getDate();
            Date d2 = bean2.getDate();
            long l = d2.getTime() - d1.getTime();
            if (l >= 0 && l <= 30 * 60 * 1000) {
                res = true;
            }
        }
        return res;
    }
}
SessionBean
public class SessionBean {
    private String sessionId;
    private String ip;
    private String url;
    private Date date;
    private int order;
    public String getSessionId() {
        return sessionId;
    }
    public void setSessionId(String sessionId) {
        this.sessionId = sessionId;
    }
    public String getIp() {
        return ip;
    }
    public void setIp(String ip) {
        this.ip = ip;
    }
    public String getUrl() {
        return url;
    }
    public void setUrl(String url) {
        this.url = url;
    }
    public Date getDate() {
        return date;
    }
    public void setDate(Date date) {
        this.date = date;
    }
    public int getOrder() {
        return order;
    }
    public void setOrder(int order) {
        this.order = order;
    }
    @Override
    public String toString() {
        return "SessionBean [sessionId=" + sessionId + ", ip=" + ip + ", url=" + url + ", date=" + date + ", order="
                + order + "]";
    }
}
主程序(main)
public class TestMain {
    public static void main(String[] args) {
        // 读取数据并使用正则获取相应的子串
//        List<SessionBean> list = new ArrayList<SessionBean>();
        Map<String, List<SessionBean>> map = new HashMap<>();
        try (
                BufferedReader br = new BufferedReader(new FileReader("E:\\javafile\\session.txt"));
                ){
            String line = null;
            while((line = br.readLine())!= null) {
                // 正则获取相应的字段
                String ipRegex = "(\\d{1,3}\\.){3}\\d{1,3}";
                String timeRegex = "\\[.+\\d\\]";
                String urlRegex = "(GET|POST){1}\\s(\\S)*\\s";
                String ip = SessionUtils.getStrByRegex(line, ipRegex);
                String strDate = SessionUtils.getStrByRegex(line, timeRegex);
                String url = SessionUtils.getStrByRegex(line, urlRegex);
                // 将字符串形式的时间转为date形式的时间
                Date date = SessionUtils.parseStrToDate(strDate);
                SessionBean bean = new SessionBean();
                bean.setIp(ip);
                bean.setDate(date);
                bean.setUrl(url);
                List<SessionBean> list = map.getOrDefault(ip, new ArrayList<SessionBean>());
                list.add(bean);
                map.put(ip, list);
            }
            //map的list按照时间的先后顺序排列
            SessionUtils.sortDate(map);
            // 生成sessionId以及编号
            getResult(map);
            // 遍历打印结果
            Set<Entry<String, List<SessionBean>>> entrySet = map.entrySet();
            for (Entry<String, List<SessionBean>> entry : entrySet) {
                String ip = entry.getKey();
                List<SessionBean> list = entry.getValue();
                for(SessionBean sessionBean:list) {
                    System.out.println(ip+"==="+sessionBean.getSessionId()+"=="+sessionBean.getOrder());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    private static void getResult(Map<String, List<SessionBean>> map) {
        Set<Entry<String, List<SessionBean>>> entrySet = map.entrySet();
        for (Entry<String, List<SessionBean>> entry : entrySet) {
            List<SessionBean> list2 = entry.getValue();
            // list内只有一个SessionBean的情况
            if(list2.size() == 1) {
                SessionBean sb = list2.get(0);
                String sessionId = SessionUtils.getSessionId();
                sb.setSessionId(sessionId);
                sb.setOrder(1);
            }
            // list内超过两个SessionBean的情况
            if(list2.size() >=2) {
                for (int i = 0; i < list2.size()-1; i++) {
                    SessionBean sb1 = list2.get(i);
                    SessionBean sb2 = list2.get(i+1);
                    // 当两个SessionBean的sessionId相同时,设置sessionId和编号
                    if(SessionUtils.isSameSession(sb1, sb2)) {
                        if(sb1.getSessionId() == null) {
                            String sessionId = SessionUtils.getSessionId();
                            sb1.setSessionId(sessionId);
                        }
                        sb2.setSessionId(sb1.getSessionId());
                        if(sb1.getOrder() == 0) {
                            sb1.setOrder(1);
                        }
                        sb2.setOrder(sb1.getOrder()+1);
                    // 当两个SessionBean的sessionId不同时,设置sessionId和编号
                    }else {
                        if(sb1.getSessionId() == null) {
                            String sessionId = SessionUtils.getSessionId();
                            sb1.setSessionId(sessionId);
                        }
                        String sessionId = SessionUtils.getSessionId();
                        sb2.setSessionId(sessionId);
                        if(sb1.getOrder() == 0) {
                            sb1.setOrder(1);
                        }
                        sb2.setOrder(1);
                    }
                }
            }
        }
    }
}
二. runtime
在java中Runtime类表示运行时操作类,是一个封装了JVM进程的类,每一个JVM都对应着一个Runtime类的实例,此实例由JVM运行时为其实例化。所以在JDK文档中读者不会发现任何有关Runtime类中构造方法的定义,这是因为Runtime类本身的构造方法是私有化的(单例设计),如果想要得到一个Runtime实例,只有以下方法:
Runtime run=Runtime.getRuntime();
也就是说在Runtime类中提供了一个静态的getRuntime()方法,此类可以取得Runtime类的实例,然后通过Runtime就可以取得一些系统的信息。如,getRuntime(),取得Runtime实例;freeMemory()返回java虚拟机中的空闲内存量;maxMemory()返回JVM的最大内存量;gc()运行垃圾回收器,释放空间;exec(command)执行本机命令
导出jar程序:
eclipse导出的jar包程序有两种
(1)导出的runnable jar --------- java -jar C:\Users\hang\Desktop\t.jar 执行
(2)普通的jar程序 ------------- java - cp C:\Users\hang\Desktop\t.jar com_51doit.Test1
测试类:
public class Test1 {
    public static void main(String[] args) {
        for (int i = 0; i < 5; i++) {
            System.out.println("hello hello");
        }
    }
}
类--->右键---->java/runnable jat file----->next,得到如下图

点击finish即可得到jar程序(可以在cmd中运行(java -jar C:\Users\hang\Desktop\t.jar ),也可在eclipse中用代码去执行)
RunTime
public class TestRunTime {
    public static void main(String[] args) throws Exception {
        Runtime runtime = Runtime.getRuntime();
        String command = "java -jar C:\\Users\\ASUS\\Desktop\\t.jar";
        Process p = runtime.exec(command);
        InputStream in = p.getInputStream();
        BufferedReader br = new BufferedReader(new InputStreamReader(in));
        String line = null;
        while((line = br.readLine()) != null) {
            System.out.println(line);
        }
    }
}
运行结果:

零基础学习java------29---------网络日志数据session案例,runtime(导出jar程序)的更多相关文章
- 总结了零基础学习Java编程语言的几个基础知识要点
		很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面 初学者先弄清这 ... 
- 音乐出身的妹纸,零基础学习JAVA靠谱么
		问:表示音乐出身的妹纸一枚 某一天突然觉得身边认识的是一群程序员 突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ... 
- salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)
		我们都知道,报表有个功能为导出excel,但是有的时候客户需求往往标准的报表达不到,比如导出excel,其中本月修改的数据字段标红,如下图所示. 这就需要我们去写VF来实现此功能. 需求:将数据表记录 ... 
- 零基础学习hadoop到上手工作线路指导(编程篇)
		问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如 ... 
- 零基础学习hadoop开发所必须具体的三个基础知识
		大数据hadoop无疑是当前互联网领域受关注热度最高的词之一,大数据技术的应用正在潜移默化中对我们的生活和工作产生巨大的改变.这种改变给我们的感觉是“水到渠成”,更为让人惊叹的是大数据已经仅仅是互联网 ... 
- 零基础学习hadoop到上手工作线路指导(中级篇)
		此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结. 五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解: hadoop分为h ... 
- [学习线路] 零基础学习hadoop到上手工作线路指导(初级篇)
		about云课程最新课程Cloudera课程 零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了. ... 
- 零基础学习openstack【完整中级篇】及openstack资源汇总
		1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事 ... 
- 零基础学习hadoop到上手工作线路指导初级篇:hive及mapreduce
		此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结.五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解:hadoop分为h ... 
随机推荐
- STL 去重 unique
			一.unique函数 类属性算法unique的作用是从输入序列中"删除"所有相邻的重复元素. 该算法删除相邻的重复元素,然后重新排列输入范围内的元素,并且返回一个迭代器(容器的长度 ... 
- hdu 1058 Humble Numbers(构造?枚举?)
			题意: 一个数的质因子如果只是2,3,5,7中的若干个.则这个数叫做humble number. 例如:1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14, 15, 16, 1 ... 
- 王爽汇编第五章,[bx]和loop指令
			目录 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 例子: 王爽汇编第五章,[bx]和loop指令 [bx]和loop指令 [bx]之前我们介绍寄存器的时候,已经很详细的说明过了,b ... 
- ELK 脚本自动化删除索引
			kibana有自带接口,可通过自带的API接口 通过传参来达到删除索引的目的. # 删除15天前的索引 curl -XDELETE "http://10.228.81.161:9201/pa ... 
- Swift-技巧(二)模糊脸部功能
			摘要 本文介绍模糊脸部的功能逻辑和实现方式,实现方式会尽可能的使用苹果提供的 API,保证功能高效率和简洁. 逻辑 模糊脸部的逻辑主要有两个流程,就是先找到脸部,然后模糊脸部,那么就引申出这两个实现问 ... 
- kubernetes常见日志采集问题和解决方案分析
			传统日志与kubernetes日志对比 传统服务 目录固定 重启不会丢失 不用关注标准与错误日志输出 容器服务 节点不固定 重启服务会漂移 需要关注标准与错误日志输出 日志文件重启会丢失 日志目录不固 ... 
- mac 工作区
			https://www.zhihu.com/question/20917614 http://www.bjhee.com/mission-control.html 窗口切换 https://sspai ... 
- PHP、TP6框架及JavaScript的单步调试
			目录 一.PHP程序的调试 1. 单个PHP程序的调试 2. PHP框架代码的调试 二.JavaScript程序的调试 三.总结 参考资料:https://www.bilibili.com/video ... 
- Handler处理器&&使用代理服务器urllib.request.ProxyHandler
			urllib.request.urlopen(url) 不能定制请求头 urllib.request.Request(url,headers,data) 可以定制请求头 Handler 定制更高级的 ... 
- 菜鸡的Java笔记 数字操作类
			数字操作类 Math 类的使用 Random 类的使用 BigInteger 和 BigDecimal 类的使用 Math 是一 ... 
