`
frenchmay
  • 浏览: 232480 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

二进制文件二分查找算法

阅读更多
package com.xxx.xxx.query.version2;

import java.io.File;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import com.xxx.xxx.decode.MetaData;
import com.xxx.xxx.utils.DateFormatUtil;


public abstract class DataReader {
	protected static Log log = LogFactory.getLog(DataReader.class);
	
	
	protected static final int BUF_SIZE = 1024 * 4;
	
	protected static final long MIN = 0L;
	
	protected static final long MAX = 99999999999999L;
	
	static final ThreadLocal<SimpleDateFormat> TL_DATE_FORMAT = DateFormatUtil.threadLocalDateFormat("yyyyMMddHHmmss");
	
	public static long time_t2tick(long time_t, int clctDate){
		long tick = 0L;		
		Date date = new Date(time_t * 1000);		
		DateFormat df = TL_DATE_FORMAT.get();		
		String str = df.format(date);					
		tick = Long.parseLong(str);		
		int clctYear = clctDate/10000;
		int year = (int) (tick/10000000000L);
		
	//	System.out.println(clctYear + " " + year);
		if(((clctYear - year) > 1)||((clctYear - year) < -1)){
			long tail = tick%10000000000L;
			long head = clctYear * 10000000000L;
			tick = head + tail;
		//	System.out.println("tick " + tick);
		}
		return tick;
	}
	
	public abstract int getDataBuffSize();
	
	public MetaData readTailRecord(String fileName, int date){
		MetaData data = null;
		int dataBuffSize = this.getDataBuffSize();
		if(null != fileName && fileName.length() > 0 && dataBuffSize > 0){
			File file = new File(fileName);
			if(file.exists()){
				long len = file.length();
				long pos = len - dataBuffSize;
				data = readSingleData(fileName, pos, date);
			}			
		}
		return data;
	}
	
	public MetaData readRecordByTick(String fileName, long tick, int date){
		return binarySearchTick(fileName, tick, this.getDataBuffSize(), date);
	}
	
	protected MetaData readSingleData(String fileName, long pos, int date) {
		MetaData data = null;
		int dataBuffSize = this.getDataBuffSize();
		if(null != fileName && fileName.length() > 0 && pos >= 0 && dataBuffSize > 0){
			try {
				byte[] buf = readBuf(fileName, pos, pos + dataBuffSize, dataBuffSize);
				if(null != buf && buf.length == dataBuffSize){
					@SuppressWarnings("unchecked")
					List<MetaData> list = (List<MetaData>) this.decodeBody(buf, date);
					if(null != list && list.size() > 0){
						data = list.get(list.size() - 1);
					}
				}
			} catch (Exception e) {
				System.out.println(e);
			}
		}
		return data;
	}
		
	protected MetaData binarySearchTick(String fileName, long tick, int dataSize, int date) {
		MetaData data = null;	
				
		if(null != fileName && fileName.length() > 0 && tick > 0 && dataSize > 0){
			File file = new File(fileName);		
			if(file.exists()){			
				int low = 0;
				int high = (int)(file.length()/dataSize);
				int hit = 0;

				while(low <= high){
					int mid = (low + high) / 2;
					int midOffSet = mid * dataSize;
										
					MetaData current = readSingleData(fileName, midOffSet, date);					
					if(null != current){						
						long midTick = current.getTick();
												
						if(midTick < tick){
							low = mid + 1;
						}						
						else if(midTick > tick){
							high = mid - 1;
						}						
						else{
							hit = mid;
							data = current;
							break;
						}						
					}
					hit = low - 1;	
				}
						
				if(null == data && hit > 0){

				//	System.out.println("readSingleData " + fileName+ " " + hit * dataSize);
					if(hit * dataSize == file.length())
					{
						hit--;
					}
					data = readSingleData(fileName, hit * dataSize, date);	
			
				}
			}	
		}	
		return data;
	}
	
	protected final static byte[] readBuf(String filePath, long beginPos, long endPos, int buffSize){
		byte[] buf = null;
		File file = null;
		RandomAccessFile raf = null;

		if(null != filePath && filePath.length() > 0 && beginPos >= 0 && beginPos < endPos && buffSize > 0){
			buf = new byte[buffSize];
			try {
				file = new File(filePath);
				if(file.exists()){
					raf = new RandomAccessFile(file, "r");
					long size = raf.length();
					if(endPos <= size){
						raf.seek(beginPos);
						raf.read(buf);
					}
				}					
			} catch (Throwable e) {
				System.out.println(e);
			} finally {
				if (null != raf){
					try {
						raf.close();
					} catch (IOException e) {
					}
				}					
			}
		}
		return buf;
	}
	
	protected List<? extends MetaData> decodeBody(byte[] buf, int date) throws Exception{
		return this.decodeBody(buf, MIN, MAX, date);
	}

	protected abstract List<? extends MetaData> decodeBody(byte[] buf, long beginTime, long endTime, int date) throws Exception;
		
	protected final static byte[] intToByte2(int n) {
		byte[] bytes = new byte[2];
		for (int i = 0; i < 2; i++) {
			bytes[i] = (byte) (n % 256);
			n = n >> 8;
		}
		return bytes;
	}

	protected final static byte[] intToByte4(long n) {
		byte[] bytes = new byte[4];
		for (int i = 0; i < 4; i++) {
			bytes[i] = (byte) (n % 256);
			n = n >> 8;
		}
		return bytes;
	}

	protected final static byte[] longToByte8(long n) {
		byte[] bytes = new byte[8];
		for (int i = 0; i < 8; i++) {
			bytes[i] = (byte) (n % 256);
			n = n >> 8;
		}
		return bytes;
	}

	protected final static short byte1ToShort(byte b) {
		short n = 0;
		if (b < 0) {
			n = (short) (256 + b);
		} else {
			n = b;
		}
		return n;
	}

	protected final static int byte1ToInt(byte bt) {
		int n = 0;

		n = bt;
		if (bt < 0)
			n += 256;
		return n;
	}

	protected final static int byte2ToInt(byte[] buf, int start) {
		int n = 0;
		if (null != buf) {
			for (int i = 1; i >= 0; i--) {
				n <<= 8;
				n |= (buf[start + i] & 0x00ff);
			}
		}
		return n;
	}

	protected final static long byte8ToLong(byte[] buf, int start) {
		long n = 0;
		try {
			if (null != buf) {
				for (int i = 7; i >= 0; i--) {
					n <<= 8;
					n |= (buf[start + i] & 0x000000ff);
				}
			}
		} catch (Exception e) {
			log.error(e);
		}
		return n;
	}

	protected final static int byte4ToInt(byte[] buf, int start) {
		int n = 0;
		try {
			if (null != buf) {
				for (int i = 3; i >= 0; i--) {
					n <<= 8;
					n |= (buf[start + i] & 0x000000ff);
				}
			}
		} catch (Exception e) {
			log.error(e);
		}
		return n;
	}
}

 

package com.xxx.xxx.decode;

public abstract class MetaData
{
	public long getTick()
	{
		return tick;
	}

	public void setTick(long tick)
	{
		this.tick = tick;
	}
	

	
	protected long tick;
}

 

package com.xxx.xxx.utils;

import java.text.SimpleDateFormat;
import java.util.Locale;
import java.util.TimeZone;


public class DateFormatUtil {
	
	
	
	private static final String GMT_TIME_ZONE = "GMT+8:00".intern();
	
    public static ThreadLocal<SimpleDateFormat> threadLocalDateFormat(final String pattern) 
    {
        ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>() {
            protected SimpleDateFormat initialValue() {
                SimpleDateFormat df = new SimpleDateFormat(pattern, Locale.ENGLISH);
                df.setTimeZone(TimeZone.getTimeZone(DateFormatUtil.GMT_TIME_ZONE));
                return df;
            }
        };
        return tl;
    }
    public static ThreadLocal<SimpleDateFormat> threadLocalDateFormat
    (final String pattern, final TimeZone time_zone) 
    {
        ThreadLocal<SimpleDateFormat> tl = new ThreadLocal<SimpleDateFormat>() 
        {
            protected SimpleDateFormat initialValue() {           	                       	
                SimpleDateFormat df = new SimpleDateFormat(pattern, Locale.ENGLISH);
                df.setTimeZone(time_zone);
                return df;
            }
        };
        return tl;
    }
}
 

 

分享到:
评论

相关推荐

    二进制文件读与查找

    总的来说,VC++ Win32控制台应用程序可以有效地处理二进制文件的读取和查找操作,通过`fstream`类提供的接口进行文件操作,配合合适的搜索算法,可以实现高效的数据访问。在这个过程中,理解二进制文件的特性和正确...

    c语言二进制地图文件管理系统

    在C语言中,二进制地图文件管理系统是一个用于操作二进制文件的实用程序,它主要涉及以下几个核心知识点:二进制文件的读写、文本文件的转换、数据的排序以及查找与更新功能。下面将详细阐述这些内容。 首先,**二...

    cmp.rar_二进制文件

    7. **二进制搜索算法**:在大量数据中查找特定模式时,可以使用二分搜索、Boyer-Moore算法、Knuth-Morris-Pratt算法等高效方法。 8. **安全与隐私考虑**:在处理二进制文件时,必须注意隐私和安全问题。不要随意...

    基于java实现的,以rsync算法原理为基础的二进制文件差异比较处理.zip

    本项目基于Java实现,运用了rsync算法的原理,来高效地处理二进制文件的差异比较。rsync算法是一种广泛使用的快速增量数据传输算法,它能够在大量数据中找出差异部分,仅传输这些差异,从而极大地提高了数据传输效率...

    java 搜索算法(二进制)

    Java中的二分搜索算法是一种高效的查找方法,尤其适用于已排序的数组。在本文中,我们将深入探讨二分搜索算法的概念,以及如何在Java中实现它。这个特定的Java程序展示了如何在一个长整型数组中使用递归二分搜索算法...

    Python-基于二进制代码生成YARA规则

    "基于二进制代码生成YARA规则"的主题涉及如何利用Python编写脚本,从二进制文件中提取特征,并创建YARA规则来识别这些特征。 YARA是一种元编程语言,专门设计用于识别和分类二进制文件,如PE(Portable Executable...

    BINARY_ADD.rar_ BINARY_ADD_adder_binary_add_二进制加法

    "COUNT-MERGE.h"、"BINARY-SEARCH.h"和"BINARY-SEARCH-2.h"可能包含了不同的排序算法,如计数排序(COUNT-MERGE可能是一种变体)和两种版本的二分查找算法。这些算法虽然不是直接与二进制加法相关,但它们都是算法...

    如何在DSP上实现二进制数折半查找算法

    二进制数折半查找算法,也称为二分查找,是一种高效的查找技术,尤其适用于已排序的数据集合。这种算法的基本思想是通过不断缩小查找范围,每次比较中间元素,根据比较结果决定是在左半部分还是右半部分继续查找,...

    二进制搜索:C#中的二进制搜索

    二进制搜索是一种高效的数据查找算法,尤其适用于大型有序数据集。在C#编程语言中,我们可以利用其强大的数据处理能力和面向对象特性来实现二进制搜索。这种搜索方法基于分治策略,通过不断将搜索空间减半来快速定位...

    bin_conv.7z

    3. **二进制转换算法**:介绍不同的转换算法,例如使用移位运算、除法和模运算进行二进制到十进制的转换,使用查找表进行二进制到十六进制的转换等。 4. **数据类型和字节顺序**:了解计算机中存储数据的方式,包括...

    单片机与DSP中的二进制数折半查找算法在DSP上的实现

    二进制数折半查找算法在数字信号处理器(DSP)上的实现主要涉及到高效的数据搜索策略和特定硬件平台的优化。折半查找,又称二分查找,是一种在有序数组中查找特定元素的算法,其核心思想是通过每次比较中间元素与...

    经典算法 链表 二分查 STLtree

    在“2进制算法.txt”中,可能会涉及二分查找在数组或者链表上的实现,包括递归和迭代两种方式。二分查找的时间复杂度为O(log n),显著快于线性查找。 接下来,STL中的tree容器,通常指的是红黑树,是一种自平衡的...

    二进制搜索算法结构模型对象二进制编组

    二进制搜索算法,也称为二分查找,是一种在有序数组中寻找特定元素的高效算法。它的基本思想是将数组分为两半,每次都比较中间元素与目标值,然后根据比较结果决定是在左半部分还是右半部分继续搜索。这个过程会不断...

    一种新的快速IPv6路由查找算法.pdf

    - **常用前缀查找**:首先通过Hash表找到对应前缀长度的集合,然后在这个集合中进行二分查找。 - **非常用前缀查找**:若在Hash表中未找到匹配项,则根据Hash表提供的索引进入相应的多分支Trie树进行最长前缀匹配。 ...

    IP地址分类以及路由查找算法

    IP地址由32位二进制组成,通常采用点分十进制表示法,分为五类:A、B、C、D和E类。其中,A、B、C类地址用于主机,D类用于多播,E类则保留用于将来使用。 1. A类地址:第一段(8位)用作网络ID,范围是0-127,剩下的...

    基于卷积神经网络和二进制K-means的图像快速聚类.pdf

    二进制K-means是一种基于哈希码的聚类算法,可以快速地将图像聚类到不同的类别中。哈希码是一种高效的数据结构,可以快速地查找和比较数据。通过使用二进制K-means,可以快速地完成图像聚类,降低时间复杂度。 在 ...

    用COBOL包围二进制印章

    二进制印章(Binary Chop)是一种在二进制数据流中查找特定值或模式的算法,它通常涉及二分查找法,这是一种高效的搜索策略。 COBOL(Common Business Oriented Language)是一种古老但仍然广泛使用的编程语言,...

    电子地图管理系统

    5. 数据查找与排序:系统利用多种查找算法,如线性查找、二分查找、哈希查找等,来快速定位地图上的特定位置或对象。排序算法,如快速排序、归并排序、堆排序,用于优化数据结构,提升查询效率。例如,可以按地理...

    16二分查找(下):如何快速定位IP对应的省份地址?.pdf

    需要对二分查找算法进行修改,增加额外的条件判断来确保找到的是第一个符合要求的元素。 2. 查找最后一个值等于给定值的元素:与查找第一个值类似,只是查找的方向相反,需要在右半部分找到最后一个目标值的位置。 ...

Global site tag (gtag.js) - Google Analytics