目前,我有一个循环在System.in上进行数据处理的脚本。我正在使用cat
从多个文件向其传递数据。
cat myfiles*.txt | java MyDataProcessor
基于cat
与Java直接打开文件相比效率低下的想法,我想将其优化到Java直接打开文件的地方:
java MyDataProcessor myfiles*.txt
是否有任何Java库使这相当容易(即处理posix通配符到文件处理程序的转换)?
答案 0 :(得分:2)
Java 7添加了一个PathMatcher类,可用于根据glob验证路径名(类似于shell完成的匹配)
PathMatcher matcher = FileSystems.getDefault().getPathMatcher("glob:myfiles*.txt");
matcher.matches(filename);
可以在Oracle Java教程here
中找到基于globs遍历文件树和搜索文件的示例。答案 1 :(得分:1)
最好传递目录名,并通过目录树进行Java解析,而不是依赖于特定于shell的“通配符”。
答案 2 :(得分:1)
我会使用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;
}
}
}
答案 3 :(得分:1)
看看Java Grep Library它接近你的任务,但没有通配符。
Apache为类提供了通配符:http://cleanjava.wordpress.com/2012/03/21/wildcard-file-filter-in-java/
答案 4 :(得分:0)
如果这对某些人来说并不明显,因为一开始我并不是这样,如果这些文件是本地文件,那么你可以让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));
// ...
}
}