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 に答える