FileSystemクラスのgetPathMatcherメソッドをチェックしています。メソッドのドキュメントには次のように書かれています。
glob 構文と regex 構文の両方について、照合で大文字と小文字が区別されるかどうかなどの照合の詳細は実装に依存するため、指定されていません。
これをテストしたところ、デフォルトでは大文字と小文字が区別されないことがわかりました。大文字と小文字を区別する方法は?
Windows7でJDK7u25を使用しています。
FileSystemクラスのgetPathMatcherメソッドをチェックしています。メソッドのドキュメントには次のように書かれています。
glob 構文と regex 構文の両方について、照合で大文字と小文字が区別されるかどうかなどの照合の詳細は実装に依存するため、指定されていません。
これをテストしたところ、デフォルトでは大文字と小文字が区別されないことがわかりました。大文字と小文字を区別する方法は?
Windows7でJDK7u25を使用しています。
いいえ、デフォルトでは大文字と小文字が区別されません。ドキュメントが言うように、大文字と小文字の区別は実装に依存します。
また、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"
}