繁体   English   中英

在Java中,如何使用posix通配符语法从多个文件读取数据?

[英]In Java, how can I read data from multiple files using posix wildcard syntax?

当前,我有一个遍历System.in的脚本,用于数据处理。 我正在使用cat将数据从几个文件传递给它。

cat myfiles*.txt | java MyDataProcessor 

cat直接打开文件相比, cat增加了一些效率低下的想法,我想将其优化为Java直接打开文件的位置:

java MyDataProcessor myfiles*.txt

是否有任何Java库可以使此过程变得相当容易(即处理posix通配符到文件处理程序的转换)?

Java 7添加了一个PathMatcher类,该类可用于验证基于glob的路径名(这类似于您的shell进行的匹配)

PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:myfiles*.txt");
matcher.matches(filename);

可以在此处的Oracle Java教程中找到遍历文件树并基于glob搜索文件的示例。

最好传递目录名称并通过目录树进行Java解析,而不要依赖于特定于shell的“通配符”。

我将使用java.io.File遍历整个目录,然后使用正则表达式过滤文件名。 您可以使用以下代码将通配符表达式转换为正则表达式:

    /**
 * Converts wildcard expression to regular expression. In wildcard-format,
 * '*' = 0-N characters and ? = any one character.
 * @param wildcardExp wildcard expression string
 * @param buf buffer which receives the regular expression
 */
static public void wildcardToRegexp(FastStringBuffer wildcardExp, FastStringBuffer buf) {
    final int len = wildcardExp.size();
    buf.clear();
    for (int i = 0; i < len; i++) {
        char c = wildcardExp.charAt(i);
        switch (c) {
        case '*':
            buf.append('.');
            buf.append('*');
            break;
        case '?':
            buf.append('.');
            break;
        // escape special regexp-characters

        case '(':
        case ')':
        case '[':
        case ']':
        case '$':
        case '^':
        case '.':
        case '{':
        case '}':
        case '|':
        case '\\':
        case '+':
            buf.append('\\');
            buf.append(c);
            break;
        default:
            buf.append(c);
            break;
        }
    }
}

查看Java Grep库它接近您的任务,但没有通配符。

Apache提供带通配符的类: http : //cleanjava.wordpress.com/2012/03/21/wildcard-file-filter-in-java/

万一这对某人不明显,因为起初对我来说不是,如果文件是本地文件,则可以让Posix为您进行解析,然后文件将传递给main(String[] args)作为参数。 就我而言,我还有其他一些参数,因此只需将通配符作为最后一个参数即可。

// USAGE: java MyProcessor arg1 arg2 myfiles*.txt

public static void main(String[] args) throws Exception {
  String arg1 = args[0];
  String arg2 = args[1];

  // looping over all input files
  for (int i = 2; i < args.length; i++) {
    File inputFile = new File(args[i]).getCanonicalFile();
    BufferedReader in = new BufferedReader(new FileReader(inputFile)); 
    // ...
  }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM