写在前面的废话不想看的可以skip-----由于工作需要,经常需要打开和查询250M左右的文本文件(总行数超过250万行)分析日志,公司发的笔记本内存才512M,地球人都知道,这样的电脑根本不能胜任。不知道有没有人和我一样倒霉,面对这么庞大的文件,曾经让我很无奈,很彷徨。从寻找优秀的类似notepad这样的文本工具,企图通过工具来提高下速度,其中JIURL这个记事本工具,我个人觉得很好,它陪我走了好长时间,虽然它老是有这样那样的BUG,不过它的速度确实比其他的记事本快很多,对于巨型文件,不会像其他记事本那样直接挂死。工具再好,也是死的,经常操作一样的动作,让我想撞墙。偶又去研究了Linux下的sh命令,哎,不是我说MicroSoft的系统不好,Linux的命令确实好使,特别是查询文档,日志分析的时候,只要你使用的好,基本都能完成你的任务。像grep,gawk,wc,head,hail etc.这样的命令总是能给我们带来惊喜。Linux系统还是要好好学的,虽然和widows差别很大,但是很强,很方便。 下面我就来说说用JAVASE怎么操作这些庞然大物的。
先介绍下我要操作的文本文件
[28-03-2008 00:00:00.101] |SH1|CIC015|->|SH1|AG015| >>IAM|CN15|CD51001500|CG15921351879|PA0|PB1|<<
[28-03-2008 00:00:00.101] |SH1|CIC153|->|SH1|AG144| >>IAM|CN144|CD51001500|CG13761957943|PA0|PB1|<<
[28-03-2008 00:00:00.117] |SH1|CIC015|<-|SH1|AG015| >>ACM|CN15|<<
[28-03-2008 00:00:00.117] |SH1|CIC153|<-|SH1|AG144| >>ACM|CN144|<<
[28-03-2008 00:00:00.179] |SH1|CIC111|->|SH1|AG105| >>REL|CN105|PA16|PB0|PC4|<<
[28-03-2008 00:00:00.179] |SH1|CIC111|<-|SH1|AG105| >>RLC|CN105|<<
[28-03-2008 00:00:00.273] |SH1|CIC1373|->|SH3|AG118| >>ANM|CN118|<<
[28-03-2008 00:00:00.383] |SH1|CIC1365|<-|SH3|AG110| >>REL|CN110|PA16|<<
[28-03-2008 00:00:00.461] |SH1|CIC1365|->|SH3|AG110| >>RLC|CN110|<<
[28-03-2008 00:00:00.586] |SH1|CIC2577|->|S11|AG196| >>ANM|CN196|<<
大家不要头晕,这个本来就是日志,搞过No.7的人都看的懂,不过这个不是重点了。我们要处理就是这样的文件,JAVASE里有一个新的包 java.nio,具体干啥的,我就不说了,自己去查看API吧。下面贴出具体代码,大家重点看getResult() 方法。在里面使用了MappedByteBuffer把文件映射到内存里面去,然后使用缓存的技术把他再读出来,如果不适用缓存,速度会很慢,想在这个里面查个东西,至少要7分钟以上,使用了缓存整个文件遍历最多13秒,差距很大吧,这个时间还是和硬件有关系的,我的电脑比较烂了,我老婆经常说我的是“低廉的双核”,我那个汗啊!o(∩_∩)o...,大家好好看看里面的代码吧。希望能对经常和大型文件打交道的人有个帮助!
先介绍下我要操作的文本文件
[28-03-2008 00:00:00.101] |SH1|CIC015|->|SH1|AG015| >>IAM|CN15|CD51001500|CG15921351879|PA0|PB1|<<
[28-03-2008 00:00:00.101] |SH1|CIC153|->|SH1|AG144| >>IAM|CN144|CD51001500|CG13761957943|PA0|PB1|<<
[28-03-2008 00:00:00.117] |SH1|CIC015|<-|SH1|AG015| >>ACM|CN15|<<
[28-03-2008 00:00:00.117] |SH1|CIC153|<-|SH1|AG144| >>ACM|CN144|<<
[28-03-2008 00:00:00.179] |SH1|CIC111|->|SH1|AG105| >>REL|CN105|PA16|PB0|PC4|<<
[28-03-2008 00:00:00.179] |SH1|CIC111|<-|SH1|AG105| >>RLC|CN105|<<
[28-03-2008 00:00:00.273] |SH1|CIC1373|->|SH3|AG118| >>ANM|CN118|<<
[28-03-2008 00:00:00.383] |SH1|CIC1365|<-|SH3|AG110| >>REL|CN110|PA16|<<
[28-03-2008 00:00:00.461] |SH1|CIC1365|->|SH3|AG110| >>RLC|CN110|<<
[28-03-2008 00:00:00.586] |SH1|CIC2577|->|S11|AG196| >>ANM|CN196|<<
大家不要头晕,这个本来就是日志,搞过No.7的人都看的懂,不过这个不是重点了。我们要处理就是这样的文件,JAVASE里有一个新的包 java.nio,具体干啥的,我就不说了,自己去查看API吧。下面贴出具体代码,大家重点看getResult() 方法。在里面使用了MappedByteBuffer把文件映射到内存里面去,然后使用缓存的技术把他再读出来,如果不适用缓存,速度会很慢,想在这个里面查个东西,至少要7分钟以上,使用了缓存整个文件遍历最多13秒,差距很大吧,这个时间还是和硬件有关系的,我的电脑比较烂了,我老婆经常说我的是“低廉的双核”,我那个汗啊!o(∩_∩)o...,大家好好看看里面的代码吧。希望能对经常和大型文件打交道的人有个帮助!
package com.xhp.ss7 ; import java.io.File ; import java.io.RandomAccessFile ; import java.io.BufferedReader ; import java.io.StringReader ; import java.util.List ; import java.util.ArrayList ; import java.util.Date ; import java.util.regex.Pattern ; import java.util.regex.Matcher ; import java.nio.MappedByteBuffer ; import java.nio.channels.FileChannel ; public class SS7Handle...{ private String year ; private String month ; private String day ; private long length ; private File file ; private int bufferSize = 0x600000;// 默认6M的缓冲 ; private long diff ; public SS7Handle(String path)...{ this.loadFile(path) ; } public List<String> getResult(int type,String number,String time,String minute,String second,int count)...{ List<String> result = new ArrayList<String>() ; String strRex = getStrRex(type,number,time,minute,second) ; Pattern pattern = Pattern.compile(strRex) ; int counts = count ; Date begin = null ; Date end = null ; try...{ MappedByteBuffer inputBuffer = new RandomAccessFile(file,"r").getChannel() .map(FileChannel.MapMode.READ_ONLY, 0, length); byte[] dst = new byte[bufferSize] ; //每次读出6M的内容 BufferedReader br = null ; boolean findFirst = false ; boolean over = false ; begin = new Date() ; for(int offset=0; offset < length; offset+= bufferSize)...{ //for(int offset=0; offset < 1; offset+= bufferSize){ if(length - offset >= bufferSize)...{ for(int i = 0;i < bufferSize;i++) dst[i] = inputBuffer.get(offset + i); }else...{ for(int i = 0;i < length - offset;i++) dst[i] = inputBuffer.get(offset + i); } //把得到的dst 交给 BufferedReader 按行读出 br = new BufferedReader(new StringReader(new String(dst))) ; String line ; StringBuffer next = new StringBuffer() ; while((line=br.readLine()) != null )...{ if(!findFirst)...{ if(pattern.matcher(line).find())...{ System.out.println("line-->"+line) ; counts-- ; result.add(line) ; findFirst = true ; String[] temp = line.split("\|") ; next.append(temp[4]).append("|").append(temp[5]) ; } }else if(findFirst) ...{ if(line.contains(next.toString()))...{ System.out.println(next) ; result.add(line) ; counts-- ; } } if(counts<0)...{ over = true ; break ; } } br.close() ; if(over)...{ break ; } } end = new Date(); this.setDiff(end.getTime()-begin.getTime()) ; }catch(Exception e)...{ System.out.println("error") ; } return result ; } private String getStrRex(int type,String number,String hour,String minute,String second)...{ if(0<minute.length() && minute.length()<2)...{ minute = "0"+minute ; }else if(0<second.length() && second.length()<2)...{ second = "0" +second ; } StringBuffer temp = new StringBuffer() ; if(type == 1)...{ // 查询 系统 打出的电话 String outnumber = "CD"+number ; temp.append("^\[").append(day).append("\-").append(month).append("\-").append(year) .append(" ").append(hour) .append(!(minute.trim()==null || "".equals(minute.trim()))?("\:"+minute):"") .append(!(second.trim()==null || "".equals(second.trim()))?("\:"+second):"") .append(".*\<\-.*IAM.*").append(outnumber).append(".*") ; System.out.println(temp.toString()) ; }else if(type ==2)...{ //查询 用户打进的 电话 String innumber = "CG" + number ; temp.append("^\[").append(day).append("\-").append(month).append("\-").append(year) .append(" ").append(hour) .append(!(minute.trim()==null || "".equals(minute.trim()))?("\:"+minute):"") .append(!(second.trim()==null || "".equals(second.trim()))?("\:"+second):"") .append(".*\-\>.*IAM.*").append(innumber).append(".*") ; } return temp.toString() ; } public void loadFile(String path)...{ this.file = new File(path) ; this.setLength(file.length()) ; int pathLength = path.length() ; int start = pathLength - new String("xxxxxxxx_xxx.xxx").length() ; this.setYear(path.substring(start,start+4)) ; this.setMonth(path.substring(start+4,start+6)) ; this.setDay(path.substring(start+6,start+8)) ; } public void setYear(String year)...{ this.year = year ; } public void setMonth(String month)...{ this.month = month ; } public void setDay(String day)...{ this.day = day ; } private void setLength(long length)...{ this.length = length ; } public void setDiff(long diff)...{ this.diff = diff ; } public long getDiff()...{ return this.diff ; } public long getLength()...{ return this.length ; } public String getYear()...{ return this.year ; } public String getMonth()...{ return this.month ; } public String getDay()...{ return this.day ; } public String toString()...{ return this.year+"-"+this.month+"-"+this.day ; } }
发表评论
-
Spring Framework : What is Spring?
2008-07-07 14:40 1003到底Spring是什么?能用来干什么?如果你刚接触Spring ... -
Spring Framework :Introduction to Spring's jars
2008-07-07 14:37 1341如果你对Spring中的jar包还不是很熟悉,我建议你好好的看 ... -
Spring Framework : Introduction on broad(Forward)
2008-07-07 14:29 1159这篇文章是国外一个学习网站上看到的,写得不错,大体上对spri ...
相关推荐
Java文本文档编辑器是一款基于Java编程语言开发的文本编辑工具,主要面向初级开发者或学习者,用于理解和实践Java在创建桌面应用中的能力。这款编辑器可能是为了帮助用户创建、编辑和保存纯文本文件,类似于常见的...
本文将围绕标题“java读取超大文本文件”及其相关描述和部分代码片段进行深入解析,探讨如何有效地读取大型文本文件。 #### 1. 使用`BufferedReader` `BufferedReader`是Java中读取文本文件的一种常见方法。它内部...
标题中的“14-Java操作Linux命令分割合并文本文件1”指的是使用Java编程语言来执行Linux命令,以实现对文本文件的分割和合并操作。在处理大文件时,由于内存限制,不能一次性将整个文件读入,因此需要采用分块处理的...
例如,你可以编写一个Java程序来搜索日志文件中的错误信息,或者从大型文本数据集中提取特定信息。 综上所述,"Java 从txt文件查找数据"涉及了Java的核心概念和技术,包括文件I/O、字符串处理、正则表达式,以及...
这个工具利用Java语言的强大功能,将大的TXT文本文件分割成更小、更易管理和使用的部分。 【描述】中的“能把txt文件变为想要的大小”意味着该程序允许用户自定义分割的大小,这样可以灵活地适应不同的存储和处理...
Java XML API是Java平台上的...通过这些API,开发者可以根据需求选择最适合的XML处理方式,不论是小型还是大型XML文件,都能有效地进行操作。在实际项目中,合理选择和组合使用这些API,能够提高代码的效率和可维护性。
然而,需要注意的是,由于 `.doc` 文件格式的复杂性,处理起来可能会有一些性能问题,尤其是处理大型文档时。对于现代的 .docx 格式,Apache POI 提供了 XWPF 模块来进行处理,它使用 XML 格式,通常更易于操作且...
Java XML API是Java平台提供的一套用于处理XML文档的接口和类,它使得开发者能够方便地在Java程序中创建、解析、修改XML文档。本文将深入探讨Java XML API中的核心组件,包括SAX(Simple API for XML)、DOM...
PDF(Portable Document Format)是一种广泛使用的文件格式,用于在各种操作系统和硬件之间交换文档,保持原始格式不变。在Java中,处理PDF文档是一项常见的任务,包括读取、修改、添加内容以及删除页面等操作。本篇...
Java文件操作是编程中不可或缺的一部分,它涉及到对磁盘上文件和目录的创建、删除、读取和修改等操作。以下是对标题和描述中提到的知识点的详细解释: 1. **创建文件夹**:在Java中,我们可以使用`java.io.File`类...
在Java开发中,有时我们需要对各种类型的文档进行保护或标识,这时添加文本水印是一种有效的方法。本教程将详细介绍如何使用Free Spire.Office for Java库为Word、PPT和PDF文档添加文本水印,以及如何利用Apache POI...
我们将通过一个简单的Java程序来理解如何在文本文件中查找特定的字符串,并提供相关的源码分析。 首先,我们要知道在Java中进行文本搜索主要涉及`java.io`和`java.util`这两个包。`java.io`包提供了用于读写文件的...
对于大型文本文件,可以使用多线程并行处理,提高效率。`ExecutorService`和`Future`可以帮助实现这一点。 总的来说,Java在文本处理方面提供了全面且强大的支持,无论是简单的文件读写,还是复杂的文本分析和处理...
- **字符流**: 对于文本文件,`java.io.FileReader`和`java.io.FileWriter`更方便,它们使用字符编码进行读写。例如: ```java FileReader fr = new FileReader("input.txt"); FileWriter fw = new FileWriter(...
在Java编程环境中,实现两个Word文档的比较是一项常见的任务,特别是在文档处理或自动化测试的场景中。本篇文章将深入探讨如何使用Java技术有效地完成这个任务,重点在于理解文档的结构、选择合适的库以及如何标记...
内容概要: 这段代码是一个Java小工具,名为 "TextFileMerger",用于将多个文本文件的内容合并成一个文件。 适用人群: 适用于需要整合多个文本文件内容的个人用户和小团队,特别是在日常工作中需要处理多个文本资源...
在Java编程语言中,读写文本文件是常见的操作。这里我们详细探讨了四种不同方法来读取文本文件:按字节读取、按字符读取、按行读取以及随机读取。 1. **按字节读取文件内容**: 这种方法通常适用于读取二进制文件...
总的来说,“TXT文本文件裁剪器”是一款实用的文本处理工具,适用于需要对大型TXT文件进行切割和管理的场景。无论是日常办公还是编程开发,都能提供便捷的帮助。通过合理利用这款软件,我们可以更有效地管理和处理...
在Java开发领域,创建一个Java文本编辑器是一项挑战性但有趣的任务,它涉及到GUI(图形用户界面)设计、事件处理、文件I/O操作等多个核心技术。本文将深入探讨这个主题,帮助开发者了解如何利用Java实现一个功能完备...
导入XML文件到Java程序中,通常涉及解析XML文档。Java提供了多种解析器,如DOM(Document Object Model)、SAX(Simple API for XML)和StAX(Streaming API for XML)。DOM解析器将整个XML文档加载到内存中的树形...