`

使用java实现grep功能(FileChannel, Pattern, MappedByteBuffer 直接字节缓冲区,其内容是文件的内存映射区域)

 
阅读更多
利用正则表达式查找一系列文件,类似于grep功能. 演示了 NIO mapped byte buffers, charsets, and regular expressions
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.CharBuffer;
import java.nio.MappedByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.regex.PatternSyntaxException;

/**
 * User: wenzhihong
 * Date: 12-2-23
 * Time: 上午10:06
 */
public class Grep {
    private static Charset charset = Charset.forName("utf-8");
    private static CharsetDecoder decoder = charset.newDecoder();
    
    private static Pattern linePattern = Pattern.compile(".*\r?\n");
    private static Pattern pattern;

    public static void main(String[] args) {
        if (args.length < 2) {
            System.err.println("Usage : java Grep pattern file...");
            return ;
        }
        compile(args[0]);
        for (int i = 1; i < args.length; i++) {
            File f = new File(args[i]);
            try {
                grep(f);
            } catch (IOException e) {
                System.err.println(f + ":" + e);
            }

        }
    }

    private static void grep(File f) throws IOException {
        //取得 FileChannel
        FileInputStream fis = new FileInputStream(f);
        FileChannel fc = fis.getChannel();

        // Get the file's size and then map it into memory
        int sz = (int) fc.size();
        MappedByteBuffer bb = fc.map(FileChannel.MapMode.READ_ONLY, 0, sz);
        //把 字节buffer decode 成 charBuffer
        CharBuffer cb = decoder.decode(bb);
        
        grep(f, cb);

        fc.close();
    }

    private static void grep(File f, CharBuffer cb) {
        Matcher lm = linePattern.matcher(cb); //line matcher
        Matcher pm = null; //pattern matcher
        int lines = 0;
        while (lm.find()){
            lines++;
            CharSequence curLineCs = lm.group();//the current line
            if (pm == null){
                pm = pattern.matcher(curLineCs);
            } else {
                pm.reset(curLineCs);
            }
            
            if (pm.find()){
                System.out.println(f + ":" + lines + ":" + curLineCs);
            }

            if (lm.end() == cb.limit()) { //文件最后
                break;
            }

        }
        
    }

    private static void compile(String pat) {
        try {
            pattern = Pattern.compile(pat);
        } catch (PatternSyntaxException e) {
            System.err.println(e.getMessage());
            System.exit(1);
        }
    }
}
分享到:
评论

相关推荐

    Grep:使用Java实现Grep功能

    本话题聚焦于如何使用Java编程语言来实现`grep`的功能。让我们深入探讨这个过程,以及Java如何为这个任务提供支持。 首先,理解`grep`的基本原理至关重要。`grep`命令接受一个或多个模式(通常是正则表达式),然后...

    Linux下使用ext3grep恢复文件

    ### Linux下使用ext3grep恢复文件 #### 一、引言 在Linux系统中,误删文件或数据丢失是常见的问题之一。对于采用ext3文件系统的磁盘分区来说,使用`ext3grep`这一工具可以有效地帮助我们恢复已删除的文件。本文将...

    Linux中利用grep命令如何检索文件内容详解

    ### Linux中利用grep命令检索文件内容详解 #### 前言 在Linux系统中,进行文件内容搜索是一项常见的任务。为了高效地完成这项任务,Linux提供了多种工具,其中`grep`命令是最为常用的一种。本篇文章将深入探讨如何...

    matlab开发-Filegrep

    在"filegrep.m"这个源代码文件中,我们可以看到MATLAB脚本实现的grep功能。这个脚本可能包括以下关键部分: 1. **用户界面设计**:MATLAB的GUIDE工具可以用来创建GUI,包括输入框、按钮和文本区域等组件,让用户...

    linuxgrep命令.pdf

    Linux中的grep命令是一个非常强大的文本搜索工具,用于搜索文件中符合特定模式的字符串。以下是对文档中grep命令相关知识点的详细说明: 1. grep命令的结构和基本用法 grep的基本语法是:grep [options] pattern ...

    Java.NIO资源下载资源下载

    - **内存映射文件 (Memory-Mapped Files)**:探讨了如何利用内存映射文件来提高文件读写的性能。 - **SocketChannel**:介绍了 SocketChannel 的使用,这是在网络编程中常用的一种 Channel。 - **管道 (Pipes)**:...

    grep用法总法

    `grep` 命令因其高效性和灵活性而在 Linux 和 Unix 系统中广泛使用。本文旨在全面解析 `grep` 的各种功能和用法,帮助用户更好地理解和掌握这一工具。 #### 二、基本概念 `grep` 支持多种类型的搜索模式,包括基础...

    一个类似于grep功能的lisp程序

    根据给定的信息,本文将详细解析一个类似于`grep`功能的Lisp程序,并结合描述中的内容,探讨如何在Common Lisp环境中实现字符串处理以及文件的输入输出操作。 ### 1. Common Lisp简介 Common Lisp是一种高级的、...

    linux grep命令详解

    `grep` 是 Linux 下一款强大的文本搜索工具,可以在文件中搜索固定字符串或者使用正则表达式搜索,是日常开发、运维工作中非常实用的一个命令。本文将详细介绍 `grep` 的常用选项及其功能。 #### 1. 基本概念 `grep...

    windows平台的adb tools 带grep功能 新版

    在使用这个压缩包"adb-tools(adb+grep)"时,首先需要将其解压,然后将包含ADB工具的目录添加到系统的PATH环境变量中,这样就可以在命令行窗口中直接调用ADB命令了。确保设备已开启USB调试,并连接到电脑,就可以开始...

    java解析apk文件

    首先,Java解析APK主要依赖于对ZIP文件格式的理解,因为APK本质上就是一个ZIP文件,其结构遵循特定的Android规范。你可以使用Java内置的`java.util.zip`包来读取和解压APK,然后提取所需的元数据。以下是一些关键...

    windows 下的grep,转贴

    标题中的“windows 下的grep,转贴”表明我们要讨论的是如何在Windows操作系统中使用grep命令,这个命令通常在Unix或Linux环境中用于搜索文本文件中的特定模式。在Windows中,由于默认命令行环境(CMD)不支持grep,...

    Linux系统指令:文件内容查询工具Grep

    【Linux系统指令:文件内容查询工具Grep】 Grep是一个在Linux系统中广泛使用的文本搜索工具,它基于正则表达式,能够高效地在文件内容中查找匹配的文本行。这个强大的工具是GNU项目的一部分,提供了更丰富的功能,...

    使用 grep 命令搜索多个字符串.doc

    使用 grep 命令搜索多个字符串可以使用多条件搜索模式,语法如下:`# grep 'pattern1\|pattern2' file`。当使用基本正则表达式时,需要使用 `\` 转义符为 `|` 管道符转义。如果使用扩展模式,可以添加 `-E` 参数。...

    linux grep 程序源码

    5. **行号和偏移量**:`grep`的`-n`选项打印匹配行的行号,`-b`选项打印匹配行的字节偏移量,这需要对文件内容的读取和处理有所了解。 6. **性能优化**:`grep`可以通过并行处理(`-P`选项)来加快搜索速度,特别是...

    windows系统grep命令.7z

    "windows系统grep命令.7z"就是这样一个工具,它允许你在Windows中使用`grep`命令,从而实现跨平台的文本搜索功能。 `grep`(global regular expression print)命令是Linux和Unix系统中用于搜索含有特定模式的文本...

    linux grep命令详解_linux_grep_

    3. **使用文件作为模式**:`grep -f pattern_file file` 可以从pattern_file中读取模式,每个模式占一行。 通过学习并熟练运用`grep`命令,不仅可以提高在大量文本数据中查找特定信息的效率,还能为日后的Linux系统...

    linux中grep命令的使用.docx

    Linux 中 grep 命令的使用 grep 命令是 Unix家族中的一种强大的文本搜索工具,能够使用正则表达式搜索文本,并把匹配的行打印出来。grep 命令的全称是 Global Regular Expression Print,表示全局正则表达式版本,...

    grep命令的用法

    - **组与引用**:括号`()`用于创建组,反斜杠加数字`\n`用于引用组,但直接在`grep`中使用较为复杂,通常在构造复杂正则时才会用到。 #### 五、示例与实践 - **案例1**:查找包含“man”但不包括“Batman”和...

Global site tag (gtag.js) - Google Analytics