3

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

对于 glob 和 regex 语法,匹配细节(例如匹配是否区分大小写)取决于实现,因此未指定。

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

我在 Windows7 上使用 JDK7u25。

4

1 回答 1

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"
}
于 2013-07-09T09:48:41.697 回答