您的位置:首页 > 编程语言 > Java开发

单线程解析文件,根据文件关键词进行统计,并将结果输出(一)

2016-06-14 16:57 344 查看
待解析的文件:race_dc_2016-05-26

文件大小70W行,其中文件中部分数据如下:

[udpconnect
忘记自己 Udp_Connect 第0次连接成功 223.89.5.212016-05-26 00:00:24]

[udpconnect 忘记自己 Udp_Init_Stream 第0次init成功223.89.5.21
2016-05-26 00:00:24]

[udpconnect
就这样算了吧 Udp_Connect 第0次连接成功 14.124.146.1562016-05-26 00:00:23]

[udpconnect 就这样算了吧 Udp_Init_Stream 第0次init成功14.124.146.156
2016-05-26 00:00:24]

[loadFile 宇宙第一车神 load资源失败 url:scene/material/Material_1005_10.am125.82.186.0
2016-05-26 00:14:56]

[loadFile 宇宙第一车神 load资源失败 url:scene/material/Material_1005_7.am125.82.186.0
2016-05-26 00:14:56]

[loadFile 宇宙第一车神 load资源失败 url:scene/material/Material_1005_3.am125.82.186.0
2016-05-26 00:14:56]

[loadFile 宇宙第一车神 load资源失败 url:scene/skybox/skybox_5.cubeatf125.82.186.0
2016-05-26 00:14:56]

[loadFile 宇宙第一车神 load资源失败 url:scene/material/Material_1005_6.am125.82.186.0
2016-05-26 00:14:56]

[udptotcp 冬青丘比ㅛ Udp转tcp1.27.223.240
2016-05-26 06:00:07]

[udptotcp gjyyhfhtdfcghf Udp转tcp106.39.195.174
2016-05-26 06:00:11]

........................................................................................................等等各种数据类型

一、目标:

解析这种日志:

1)loadFile

[loadFile夏调ツload资源失败
url:a/car/car/car1000401/carwheelf1000401.mesh  183.198.xxx.159 2016-06-01 00:07:21]

 

数据分别是:

昵称  夏调ツ

相关url load资源失败
url:avatar/car/car/car1000401/caxxxeelf1000401.mesh

IP 183.198.xxx.159

统计 :加载文件失败的用户数

     每个加载失败文件的次数

     加载文件失败的IP

2)udpconnect

[udpconnect ㅗ楚天 Udp_Connect 第0次连接成功 219.139.48.64   2016-06-0100:08:51]

[udpconnect 動情ю udp连接失败 reason:Unknow。 27.38.38.226  2016-06-01 00:09:22]

 

数据:

昵称  ㅗ楚天

描述  Udp_Connect 第0次连接成功

 

统计:udp连接成功以及udp连接失败的次数

    udp连接失败的IP

其中每行数据中的空格,有的为“/t”,有的为空格,需要解析看看

-----------------------------------------------------------------------------------------------------------------------------

二、思路

1、对于文件的处理,其流程为:输入——处理——输出,将文件去掉/t解析成一行一行的:如

[udpconnect ㅗ楚天 Udp_Connect 第0次连接成功 219.139.48.64   2016-06-0100:08:51] 解析去掉/t之后,得到

[udpconnect

ㅗ楚天 Udp_Connect 第0次连接成功

 219.139.48.64 

2016-06-0100:08:51]

存放在String字符串中为{[udpconnect,ㅗ楚天 Udp_Connect 第0次连接成功,219.139.48.64,2016-06-0100:08:51] },表明ㅗ楚天 Udp_Connect 第0次连接成功中间有两个空格;

2、对于要处理的数据类型可以抽象为bean类:loadFile类、udpConnect类

3、设置dao类loadFileHandler来处理关键字为loadFile的数据,对应1中处理——输出流程;

设置dao类udpConnectHandler来处理关键字为udpconnect的数据,对应1中的处理——输出流程

4、设置dao类AllHandler来处理文件流的输入,对应1中输入流程

5、对于3中的类,处理流程都一样,因此抽象出一个接口:输入——输出接口,虽然T在本程序为String[]但为了扩展性还是改成泛型T

<span style="font-size:18px;">public interface StatHandler<T>
{
/**
* 输出结果
*/
public void output();

/**
* 输入一行数据
* @param t
*/
public void input(T t);

}</span>


总结:AllHandler类获得文件流,进行遍历每一行数据,将符合关键字的每一行数据,交给对应的处理器loadFileHandler、udpConnectHandler处理,

最后文件被遍历完了,AllHandler类控制总体的结果输出。其中,为了增加程序的灵活性,采用了配置文件config.xml,其作用如下:

比如在config.xml文件如下:则表明,现在关键词loadFile对应的处理类为LoadFileHandler,以后要扩展不同的关键词,只需要(1)配置config.xml文件(2)添加对应处理类

<span style="font-size:18px;"><?xml version="1.0" encoding="UTF-8"?>
<SetObject>
<yourKey name="[loadFile" value="com.zsj.test.daos.LoadFileStatHandler" />
<yourKey name="[udptotcp" value="com.zsj.test.daos.UdpToUpdStatHandler" />
<yourKey name="[udpconnect" value="com.zsj.test.daos.UdpconnectStatHandler" />
</SetObject></span>


下一节,将开始讲如何用代码实现单线程读取文件,实现代码的精简化和良好的扩展性,

其中关于xml解析的知识,见

http://blog.csdn.net/tardis1/article/details/51672801

http://blog.csdn.net/tardis1/article/details/51672687
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息