一. 网络日志数据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程序)的更多相关文章

  1. 总结了零基础学习Java编程语言的几个基础知识要点

    很多Java编程初学者在刚接触Java语言程序的时候,不知道该学习掌握哪些必要的基础知识.本文总结了零基础学习Java编程语言的几个基础知识要点. 1先了解什么是Java的四个方面   初学者先弄清这 ...

  2. 音乐出身的妹纸,零基础学习JAVA靠谱么

    问:表示音乐出身的妹纸一枚  某一天突然觉得身边认识的是一群程序员   突然想 要不要也去试试... 众好友都觉得我该去做个老师,可是我怕我会误人子弟,祸害祖国下一代..... 要不要 要不要 学Ja ...

  3. salesforce 零基础学习(二十三)数据记录导出至excel(自定义报表导出)

    我们都知道,报表有个功能为导出excel,但是有的时候客户需求往往标准的报表达不到,比如导出excel,其中本月修改的数据字段标红,如下图所示. 这就需要我们去写VF来实现此功能. 需求:将数据表记录 ...

  4. 零基础学习hadoop到上手工作线路指导(编程篇)

    问题导读: 1.hadoop编程需要哪些基础? 2.hadoop编程需要注意哪些问题? 3.如何创建mapreduce程序及其包含几部分? 4.如何远程连接eclipse,可能会遇到什么问题? 5.如 ...

  5. 零基础学习hadoop开发所必须具体的三个基础知识

    大数据hadoop无疑是当前互联网领域受关注热度最高的词之一,大数据技术的应用正在潜移默化中对我们的生活和工作产生巨大的改变.这种改变给我们的感觉是“水到渠成”,更为让人惊叹的是大数据已经仅仅是互联网 ...

  6. 零基础学习hadoop到上手工作线路指导(中级篇)

    此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结. 五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解: hadoop分为h ...

  7. [学习线路] 零基础学习hadoop到上手工作线路指导(初级篇)

    about云课程最新课程Cloudera课程   零基础学习hadoop,没有想象的那么困难,也没有想象的那么容易.在刚接触云计算,曾经想过培训,但是培训机构的选择就让我很纠结.所以索性就自己学习了. ...

  8. 零基础学习openstack【完整中级篇】及openstack资源汇总

    1.你是如何学习openstack的?2.你对openstack的组件了解多少?3.你认为openstack该如何学习? 一直想写关于openstack的方面的内容,今天终于整理完成.算是完成一桩心事 ...

  9. 零基础学习hadoop到上手工作线路指导初级篇:hive及mapreduce

      此篇是在零基础学习hadoop到上手工作线路指导(初级篇)的基础,一个继续总结.五一假期:在写点内容,也算是总结.上面我们会了基本的编程,我们需要对hadoop有一个更深的理解:hadoop分为h ...

随机推荐

  1. 设计模式(1-3)-动态代理(WeakCache的运用)

    阅读本篇文章前,请事先阅读 理解Java的强引用.软引用.弱引用和虚引用. 看看什么是强引用.什么是弱引用及它们的用途,很必要!!! 上一节讲到,获取对应的代理类时,首先会从缓存中去拿,若拿不到才会去 ...

  2. Oracle 19c 没有匹配的协议

    Oracle12c连接问题ORA-28040:没有匹配的验证协议 造成改问题的原因是客户端版本太低.修改sqlnet.ora文件可以让服务器适配低版本的客户端 sqlnet.ora文件中加入 SQLN ...

  3. grafan源码编译

    下载grafana源码:https://github.com/grafana/grafana 前端: 安装node.js,安装完自带npmnpm install -g yarnyarn install ...

  4. 自由导入你的增量数据-根据条件将sqlserver表批量生成INSERT语句的存储过程实施笔记

    文章标题: 自由导入你的增量数据-根据条件将sqlserver表批量生成INSERT语句的存储过程增强版 关键字 : mssql-scripter,SQL Server 文章分类: 技术分享 创建时间 ...

  5. 题解 P6345 [CCO 2017]接雨滴

    解题思路 NOIP在即,感觉即将退役,或许是最后一篇题解了... 求水的体积不是特别好求,我们考虑求出 水+柱子 的体积最后再减去柱子的体积. 发现对于最高的柱子在中间的情况其实可以把最高柱子一侧的柱 ...

  6. [atAGC034F]RNG and XOR

    令$N=2^{n}$先将$\forall 0\le i<N,a_{i}$除以$\sum_{i=0}^{N-1}a_{i}$,即变为概率 令$f_{i}$表示$i$的答案(第一次变成$i$的期望步 ...

  7. [atAGC050B]Three Coins

    记$p_{i}$表示该位置是否有硬币 称使得$p_{i,i+1,i+2}$都变为1的操为对$i$的添加操作,使得$p_{i,i+1,i+2}$都变为0的操作为对$i$的删除操作 考虑一个简单的操作:若 ...

  8. 【HTML】WebStorage

    WebStorage 2019-11-13  10:46:18  by冲冲 1. 概况 早期浏览器的本地存储使用cookie,当前推荐使用Web Storage. Web Storage的数据以&qu ...

  9. UI自动化测试:App的WebView页面中,当搜索栏无搜索按钮时处理方法

    一.遇到的问题 在做移动端的UI自动化测试时,经常会遇到上图所示的搜索框,这里有个麻烦就是搜索框没有"搜索"按钮,UI自动化测试时不能确认搜索. 要解决这个问题,我们可以通过 dr ...

  10. negix安装与配置2-反向代理一台

    negix反向代理: 1.实现效果:打开浏览器,输入www.123.com 跳转到linux系统主页面中 2.准备工作tomcat java环境 https://www.cnblogs.com/q13 ...