[英]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.