如何使用Java glob模式搜索(区分大小写)文件?

时间:2013-07-09 09:45:50

标签: java glob

我正在检查getPathMatcher课程的FileSystem方法。该方法的文档说:

  

对于glob和regex语法,匹配的细节,例如   匹配是否区分大小写,取决于实现   因此没有具体说明。

我对此进行了测试,并且知道默认情况下它不区分大小写。如何使其区分大小写?

我在Windows7上使用JDK7u25。

1 个答案:

答案 0 :(得分:3)

不,默认情况下不区分大小写。正如文档所说,区分大小写取决于实现。

NTFS是案例保留不区分大小写。也就是说,名为README.txt的文件将保留其大小写(保留大小写);但是尝试通过名称Readme.TXT找到它,比如说,工作(不区分大小写)。

在Unix系统上并非如此,其文件系统 区分大小写。

不幸的是,没有办法解决这个问题!除了创建自己的Filesystem实现包装默认值并使其区分大小写。

以下是一个非常有限的目的FileSystem的示例,它将能够生成文件扩展名的“区分大小写的匹配”:

public final class CaseSensitiveNTFSFileSystem
    extends FileSystem
{
    private static final Pattern MYSYNTAX = Pattern.compile("glob:\\*(\\..*)");

    private final FileSystem fs;

    // "fs" is the "genuine" FileSystem provided by the JVM
    public CaseSensitiveNTFSFileSystem(final FileSystem fs)
    {
        this.fs = fs;
    }

    @Override
    public PathMatcher getPathMatcher(final String syntaxAndPattern)
    {
        final Matcher matcher = MYSYNTAX.matcher(syntaxAndPattern);
        if (!matcher.matches())
            throw new UnsupportedOperationException();
        final String suffix = matcher.group(1);
        final PathMatcher orig = fs.getPathMatcher(syntaxAndPattern);

        return new PathMatcher()
        {
            @Override
            public boolean matches(final Path path)
            {
                return orig.matches(path)
                    && path.getFileName().endsWith(suffix);
            }
        };
    }

    // Delegate all other methods of FileSystem to "fs"
}