`

高效io操作方式

 
阅读更多
package com.yesky.apachelog.task;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;

import com.yesky.apachelog.Property;
import com.yesky.apachelog.model.ApacheDBObject;
import com.yesky.apachelog.model.ObjectActionSum;
import com.yesky.apachelog.model.ObjectDetail;
import com.yesky.apachelog.service.IApacheRegexDAOService;
import com.yesky.apachelog.service.IObjectActionSumService;
import com.yesky.apachelog.util.file.ApacheSparaFileDelTool;

public class ApacheTask {
	private List<ApacheDBObject> apacheOList = new ArrayList<ApacheDBObject>();
	private IApacheRegexDAOService apacheDaoService;
	private IObjectActionSumService actionService;
	private List<String> numList = new ArrayList<String>();

	public void doTask() {
		// 日志文件路径
		String fileAndPath = Property.fileAndPath;
		// 拆分文件存放路径
		String currentPath = Property.currentPat;
		// 拆分文件,行数
		long fileLineNum = Property.fileLineNum * 10000;

		String file[] = fileAndPath.split(",");
		for (int i = 0; i < file.length; i++) {
			String filePath = file[i];
			System.out.println("日志文件路径===============" + filePath);
			List<String> separaFileList = apacheDaoService.separatorFileByPath(
					filePath, currentPath, fileLineNum);
			Iterator<String> it = separaFileList.iterator();
			while (it.hasNext()) {
				String sparaFilePath = (String) it.next();
				System.out.println("拆分文件路径===============" + sparaFilePath);
				readSparatorFileByPath(sparaFilePath, fileLineNum);
			}
		}
	}

	/**
	 * 读取拆分后的文件,并把记录出入数据
	 * 
	 * @param sparaFilePath:拆分后的文件路径
	 */
	public void readSparatorFileByPath(String sparaFilePath, long fileLineNum) {
		System.out.println("-------------读取文件-------------");
		FileReader fr = null;
		try {
			fr = new FileReader(sparaFilePath);
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
		BufferedReader buf = new BufferedReader(fr, 10 * 1024 * 1024);
		String temp = null;
		try {
			while ((temp = buf.readLine()) != null) {
				System.out.println("00000000000000000000000000000");
				numList.add(temp);
				if (numList.size() % fileLineNum == 0) {
					apacheOList.addAll(apacheDaoService
							.getDBObListjectFromaLineString(numList));
					numList.clear();
					if (apacheOList != null && (apacheOList.size() % 5000 == 0)) {
						System.out
								.println("-------------2222222222222222------------");
						this.insertDbLogBatch(apacheOList);
						apacheOList.clear();
					}

				}

			}

			if (numList != null && numList.size() > 0) {
				apacheOList.addAll(apacheDaoService
						.getDBObListjectFromaLineString(numList));
				numList.clear();
				this.insertDbLogBatch(apacheOList);
				apacheOList.clear();

			}

			System.out.println("-------------文件结束------------ "
					+ apacheOList.size());
			if (apacheOList != null && apacheOList.size() > 0) {
				System.out.println("-------------进入数据------------");
				this.insertDbLogBatch(apacheOList);
				apacheOList.clear();
			}
			buf.close();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (buf != null) {
				try {
					buf.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}

		ApacheSparaFileDelTool delTool = new ApacheSparaFileDelTool();
		boolean b = delTool.DeleteFolder(sparaFilePath);
		if (b) {
			System.out.println("删除文件成功 !!!!");
		}

	}

	/**
	 * 向数据库添加记录
	 * 
	 * @param dblog:dblog的list对象(符合条件的)
	 */
	public void insertDbLogBatch(final List<ApacheDBObject> dblog) {
		Iterator<ApacheDBObject> it = dblog.iterator();
		System.out.println("插入数据库。。。。。。。。。。。。。。。dblog。。" + dblog.size());
		while (it.hasNext()) {
			ApacheDBObject log = (ApacheDBObject) it.next();
			ObjectActionSum objectActionSumVO = new ObjectActionSum();
			ObjectDetail objectDetail = new ObjectDetail();
			String name = log.getModuleName().trim();
			System.out.println("-----------name = " + name);
			if (("1").equals(name) || ("2").equals(name)) {
				// 电影
				if (("1").equals(name)) {
					Integer srcid = Integer.parseInt(log.getSrcId());
					objectActionSumVO.setTarObjTypeId(3);// 电影库类型
					objectActionSumVO.setSrcObjTypeId(3);// 电影库类型
					// 模块名称
					objectActionSumVO.setSuffix("MOVIE");
					objectActionSumVO.setTarObjId(Integer.parseInt(log
							.getTargetId()));
					objectActionSumVO.setSrcObjId(srcid);
					objectActionSumVO.setStatus(1);
					objectActionSumVO.setActionId(41);// 动作为看了又看
					objectActionSumVO.setScore(0);
					objectActionSumVO.setActionTime(new Date());
					objectActionSumVO.setActionCount(1);
					objectActionSumVO.setTableName("MOVIE" + "_"
							+ String.valueOf(srcid / 10000 + 1));
					objectDetail.setObjId(objectActionSumVO.getSrcObjId());
					objectDetail.setSuffix(objectActionSumVO.getSuffix());

				} else if (("2").equals(name))// 产品
				{
					Integer srcid = Integer.parseInt(log.getSrcId());
					objectActionSumVO.setTarObjTypeId(1);// 产品库类型
					objectActionSumVO.setSrcObjTypeId(1);// 产品库类型
					// 模块名称
					objectActionSumVO.setSuffix("CPK");
					objectActionSumVO.setTarObjId(Integer.parseInt(log
							.getTargetId()));
					objectActionSumVO.setSrcObjId(srcid);
					objectActionSumVO.setStatus(1);
					objectActionSumVO.setActionId(41);// 动作为看了又看
					objectActionSumVO.setScore(0);
					objectActionSumVO.setActionTime(new Date());
					objectActionSumVO.setActionCount(1);
					objectActionSumVO.setTableName("CPK" + "_"
							+ String.valueOf(srcid / 10000 + 1));
					objectDetail.setObjId(objectActionSumVO.getSrcObjId());
					objectDetail.setSuffix(objectActionSumVO.getSuffix());
				}
				System.out.println("objectDetail === "
						+ objectDetail.getSuffix());
				// 创建表
				this.createObjectActionSumTable(objectDetail);
				// 更新记录
				int count = this.actionService
						.updateObjectActionSum(objectActionSumVO);
				// 如果记录不存在,添加新纪录
				if (count <= 0) {
					this.actionService.insertObjectActionSum(objectActionSumVO);
				}

			} else {
				System.out
						.println("暂时不处理--------------------------------------");
			}
		}
	}

	public void createObjectActionSumTable(ObjectDetail objectDetail) {
		String tableName = null;
		ObjectActionSum objectActionSumVO = new ObjectActionSum();
		System.out
				.println("要创建的表:........................objectDetail.getSuffix()........... "
						+ objectDetail.getSuffix());
		try {
			if (objectDetail != null && objectDetail.getSuffix() != null) {
				tableName = objectDetail.getSuffix().toUpperCase() + "_"
						+ String.valueOf((objectDetail.getObjId() / 10000) + 1);
				System.out.println("要创建的表:................................... "
						+ tableName);
				objectActionSumVO.setTableName(tableName);
				actionService.createObjSumTable(objectActionSumVO);
				actionService.createObjSumTableIndex(objectActionSumVO);
			}

		} catch (Exception e) {
			System.out.println("要创建的表:OBJ_ACTION_SUM_" + tableName + "已存在。");

		}
	}

	public IObjectActionSumService getActionService() {
		return actionService;
	}

	public void setActionService(IObjectActionSumService actionService) {
		this.actionService = actionService;
	}

	public IApacheRegexDAOService getApacheDaoService() {
		return apacheDaoService;
	}

	public void setApacheDaoService(IApacheRegexDAOService apacheDaoService) {
		this.apacheDaoService = apacheDaoService;
	}

}

 

分享到:
评论

相关推荐

    JAVA IO-NIO 详解

    在Java中,IO(输入/输出)是程序与外部世界进行交互的重要桥梁,而NIO(非阻塞IO)则是Java IO的一个重要扩展,它提供了更为高效、灵活的数据处理方式。 传统的Java IO是阻塞式的,即当程序进行读写操作时,如果...

    IO输入输出体系.rar

    缓冲流是一种装饰器类 可实现按规定字符数、按行等方式的高效读写 缓冲区的大写可指定 也可使用默认大小 FileInputStream fis = new FileInputStream("Car.java"); 装饰器类 in = new 装饰器类(fis); BufferedReader...

    开源一STM32项目,CAN,UART,Input检测 原创相对高效性能与代码重用平衡思路,可直接做工程模板

    使用本方式的考虑是在执行效率与代码重用间的平衡,部分代码使用了ST的库,如初始化时不时间使用不高时,而中断处理则基本是直接操作寄存器。并且均考虑了做为uCOS的接口,直接替换UARTx_ENTER_CRITICALx()、UARTx_...

    掌握Redis:从安装到高效数据处理的核心原理与技巧

    Redis的高性能得益于其单线程架构,这意味着其主要的网络IO和键值对读写操作由单一线程完成,从而避免了多线程环境下的上下文切换开销。此外,文档还讨论了Redis的IO多路复用机制,这是Redis处理大量并发客户端连接...

    Java流NIO

    NIO于原来的IO有相同的功能,但是他们之间的使用方式是完全不同的,NIO是面向缓冲区,面向通道的的IO操作,NIO拥有更加高效的进行文件读写。 另外NIO在网络编程可以是一个无阻塞的IO交互,可以大大提升Socket交互的...

    通俗易懂的NIO教程(含配套资料)

    本教程为授权出品教程 本Java视频主要讲授 Java NIO 的使用及原理。Java NIO 是 JDK 1.4 发布的一套全新的IO API(New IO ...NIO支持面向缓冲区的、基于通道的IO操作。并且,NIO将以更加高效的方式进行文件的读写操作。

    javasnmp源码-nio-learn:JavaNIO使用示例,NIO的使用,TCP,UDP的简单示例

    NIO支持面向缓冲区的,基于通道的IO操作。 NIO将以更加高效的方式进行文件的读写操作。 Java NIO与普通IO的主要区别 io nio 面向流 面向缓冲区(buffer,channel) 堵塞io 非堵塞io - 选择器 java nio主要的核心组件...

    C++从0实现百万并发Reactor服务器完结13章下载

    reactor中的 IO 使用的是select poll epoll 多路复用IO, 以便提高 IO 事件的处理能力,提高IO事件处理效率,支持更高的并发 。 二、Reactor 模型有三个重要的组件: 多路复用器:由操作系统提供,在 linux 上一般是...

    CCB论坛 v4.155 Big5繁体中文版

    CCB系统基于linux,采用功能强大的Perl语言编写,是一种可运行于多种操作系统平台的新型高效多用途动态网页发布和实时交互数据库系统. CCB系统是个和以往工作方式完全不同的新型CGI文本数据库系统,采用新型高速...

    CCB论坛 v4.155 utf-8繁体中文版

    CCB系统基于linux,采用功能强大的Perl语言编写,是一种可运行于多种操作系统平台的新型高效多用途动态网页发布和实时交互数据库系统. CCB系统是个和以往工作方式完全不同的新型CGI文本数据库系统,采用新型高速...

    swrabbit.github.io

    软件特点➣收支类别、费用类别、费用名称、支付方式等预先自定义添加,便捷高效。➣一键查询年度收支明细,便捷查看月度总支出、总收入、总结余、日均收支等各项明细。➣收支明细支持曲线图、柱状图,立体柱状图等...

    ffengine:ffengine是高效的tcp 服务器框架,适用于端游、页游、手游的实时服务器

    数据库异步化,我们知道内存计算是飞快的,但是数据库操作设计到io,效率低一个数量级,所以ffengine数据库的访问采用异步加回调的方式,加上python 对于lambda的完美支持,异步加回调非常的容易。 多协议支持,做...

    bytestring:适用于二进制或8位字符数据的高效紧凑,不可变的字节字符串类型(严格和惰性)

    ByteString:快速的字节打包字符串该库提供Data.ByteString模块-严格和惰性字节数组可作为字符串操作-提供非常节省时间/空间的字符串和IO操作。对于非常大的数据要求或对堆大小的限制,提供了Data.ByteString.Lazy ...

    使用协同路由的同步异步_Synchronous asynchrony using coroutines_C+

    小型但高效的库,用于以同步方式执行异步操作(“async”-&gt;“Synca”)。该方法大大简化了有效IO和CPU密集型应用程序或其他非平凡并发算法的编写。该库演示了如何使用协同例程来实现所描述的简化。代码本身看起来像...

    java7源码-java-convert-example:本项目记录一些常见对象转换的方法,例如:文件转换、日期时间转换、stream流转换、

    java7 源码 java-convert-example 平时的java项目中会存在各种对象的...按照操作方式分类: 按照操作对象分类: IO 流基础对象: InputStream/Reader: 所有的输入流的基类,前者是字节输入流,后者是字符输入流。 Outpu

    ZipZap:适用于iOS,macOS和tvOS的zip文件IO库

    格式压缩得体,并具有广泛的操作系统和工具支持。 因此,我们希望使这种格式对您来说更加容易。 因此,该库具有以下特点: 易于使用的界面:公共API仅提供两个类! 但是,您可以使用熟悉的NSArray集合和属性浏览zip...

    代码客:G-Socket(IOCP) 1.0 (Server/Client)例程源码+Server体验程序+强大的压力测试工具

    (11)、PerHandleData的回收不以IO投递的计数器或链表来做依据但仍能安全回收,同时尽量避免在高频的读写操作时做其他无关的操作以提高读写效率。 (12)、处理线程和工作线程有着良好分工界限,繁重的工作交给处理...

    串口通信2.4G nRF24L01无线通信模块资料汇总(原理图、上位机、例程、无线232通信程序等)-电路方案

    例如0XA1,0XFD,0X01,0X00,0X01 只要发送这一串字符后,接收方的IO 口1 输出低电平,对远程的IO控制操作极其方便。更具体的指令请查看使用手册。 5、可结合本店的继电器模块简单便捷的实现远程高压控制,智能家居,...

    kafka & mafka client开发与实践

    首先,kafka的开发者们认为不需要在内存里缓存什么数据,操作系统的文件缓存已经足够完善和强大,只要你不搞随机写,顺序读写的性能是非常高效的。kafka的数据只会顺序append,数据的删除策略是累积到一定程度或者...

    bioinfo_benchmarks:对生物信息学脚本编写很重要的语言基准

    IO-语言处理IO的方式在本质上有些慢吗? 字符串操作-用于执行字符串操作的内建函数是否高效,或者它们看起来很漂亮? 轻量级类-我们可以便宜地创建一个类来保存数据吗? 数组和字符串分配-编译器/解释器是否优化...

Global site tag (gtag.js) - Google Analytics