?? filenameutils.java
字號:
/**
* Checks whether two filenames are equal after both have been normalized
* and using the case rules of the system.
* <p>
* Both filenames are first passed to {@link #normalize(String)}.
* The check is then performed case-sensitive on Unix and
* case-insensitive on Windows.
*
* @param filename1 the first filename to query, may be null
* @param filename2 the second filename to query, may be null
* @return true if the filenames are equal, null equals null
*/
public static boolean equalsNormalizedOnSystem(String filename1, String filename2) {
return equals(filename1, filename2, true, true);
}
/**
* Checks whether two filenames are equal after both have been normalized
* and optionally using the case rules of the system.
* <p>
* Both filenames are first passed to {@link #normalize(String)}.
*
* @param filename1 the first filename to query, may be null
* @param filename2 the second filename to query, may be null
* @param system whether to use the system (windows or unix)
* @param normalized whether to normalize the filenames
* @return true if the filenames are equal, null equals null
*/
private static boolean equals(
String filename1, String filename2,
boolean system, boolean normalized) {
if (filename1 == filename2) {
return true;
}
if (filename1 == null || filename2 == null) {
return false;
}
if (normalized) {
filename1 = normalize(filename1);
filename2 = normalize(filename2);
}
if (system && (SYSTEM_SEPARATOR == WINDOWS_SEPARATOR)) {
return filename1.equalsIgnoreCase(filename2);
} else {
return filename1.equals(filename2);
}
}
//-----------------------------------------------------------------------
/**
* Checks whether the extension of the filename is that specified.
* <p>
* This method obtains the extension as the textual part of the filename
* after the last dot. There must be no directory separator after the dot.
* The extension check is case-sensitive on all platforms.
*
* @param filename the filename to query, null returns false
* @param extension the extension to check for, null or empty checks for no extension
* @return true if the filename has the specified extension
*/
public static boolean isExtension(String filename, String extension) {
if (filename == null) {
return false;
}
if (extension == null || extension.length() == 0) {
return (indexOfExtension(filename) == -1);
}
String fileExt = getExtension(filename);
return fileExt.equals(extension);
}
/**
* Checks whether the extension of the filename is one of those specified.
* <p>
* This method obtains the extension as the textual part of the filename
* after the last dot. There must be no directory separator after the dot.
* The extension check is case-sensitive on all platforms.
*
* @param filename the filename to query, null returns false
* @param extensions the extensions to check for, null checks for no extension
* @return true if the filename is one of the extensions
*/
public static boolean isExtension(String filename, String[] extensions) {
if (filename == null) {
return false;
}
if (extensions == null || extensions.length == 0) {
return (indexOfExtension(filename) == -1);
}
String fileExt = getExtension(filename);
for (int i = 0; i < extensions.length; i++) {
if (fileExt.equals(extensions[i])) {
return true;
}
}
return false;
}
/**
* Checks whether the extension of the filename is one of those specified.
* <p>
* This method obtains the extension as the textual part of the filename
* after the last dot. There must be no directory separator after the dot.
* The extension check is case-sensitive on all platforms.
*
* @param filename the filename to query, null returns false
* @param extensions the extensions to check for, null checks for no extension
* @return true if the filename is one of the extensions
*/
public static boolean isExtension(String filename, Collection extensions) {
if (filename == null) {
return false;
}
if (extensions == null || extensions.isEmpty()) {
return (indexOfExtension(filename) == -1);
}
String fileExt = getExtension(filename);
for (Iterator it = extensions.iterator(); it.hasNext();) {
if (fileExt.equals(it.next())) {
return true;
}
}
return false;
}
//-----------------------------------------------------------------------
/**
* Checks a filename to see if it matches the specified wildcard matcher,
* always testing case-sensitive.
* <p>
* The wildcard matcher uses the characters '?' and '*' to represent a
* single or multiple wildcard characters.
* This is the same as often found on Dos/Unix command lines.
* The extension check is case-sensitive.
* <pre>
* wildcardMatch("c.txt", "*.txt") --> true
* wildcardMatch("c.txt", "*.jpg") --> false
* wildcardMatch("a/b/c.txt", "a/b/*") --> true
* wildcardMatch("c.txt", "*.???") --> true
* wildcardMatch("c.txt", "*.????") --> false
* </pre>
*
* @param filename the filename to match on
* @param wildcardMatcher the wildcard string to match against
* @return true if the filename matches the wilcard string
*/
public static boolean wildcardMatch(String filename, String wildcardMatcher) {
return wildcardMatch(filename, wildcardMatcher, false);
}
/**
* Checks a filename to see if it matches the specified wildcard matcher
* using the case rules of the system.
* <p>
* The wildcard matcher uses the characters '?' and '*' to represent a
* single or multiple wildcard characters.
* This is the same as often found on Dos/Unix command lines.
* The check is case-sensitive on Unix and case-insensitive on Windows.
* <pre>
* wildcardMatch("c.txt", "*.txt") --> true
* wildcardMatch("c.txt", "*.jpg") --> false
* wildcardMatch("a/b/c.txt", "a/b/*") --> true
* wildcardMatch("c.txt", "*.???") --> true
* wildcardMatch("c.txt", "*.????") --> false
* </pre>
*
* @param filename the filename to match on
* @param wildcardMatcher the wildcard string to match against
* @return true if the filename matches the wilcard string
*/
public static boolean wildcardMatchOnSystem(String filename, String wildcardMatcher) {
return wildcardMatch(filename, wildcardMatcher, true);
}
/**
* Checks a filename to see if it matches the specified wildcard matcher.
* <p>
* The wildcard matcher uses the characters '?' and '*' to represent a
* single or multiple wildcard characters.
*
* @param filename the filename to match on
* @param wildcardMatcher the wildcard string to match against
* @param system whether to use the system (windows or unix)
* @return true if the filename matches the wilcard string
*/
private static boolean wildcardMatch(String filename, String wildcardMatcher, boolean system) {
if (filename == null && wildcardMatcher == null) {
return true;
}
if (filename == null || wildcardMatcher == null) {
return false;
}
if (system && (SYSTEM_SEPARATOR == WINDOWS_SEPARATOR)) {
filename = filename.toLowerCase();
wildcardMatcher = wildcardMatcher.toLowerCase();
}
String[] wcs = splitOnTokens(wildcardMatcher);
boolean anyChars = false;
int textIdx = 0;
int wcsIdx = 0;
Stack backtrack = new Stack();
// loop around a backtrack stack, to handle complex * matching
do {
if (backtrack.size() > 0) {
int[] array = (int[]) backtrack.pop();
wcsIdx = array[0];
textIdx = array[1];
anyChars = true;
}
// loop whilst tokens and text left to process
while (wcsIdx < wcs.length) {
if (wcs[wcsIdx].equals("?")) {
// ? so move to next text char
textIdx++;
anyChars = false;
} else if (wcs[wcsIdx].equals("*")) {
// set any chars status
anyChars = true;
if (wcsIdx == wcs.length - 1) {
textIdx = filename.length();
}
} else {
// matching text token
if (anyChars) {
// any chars then try to locate text token
textIdx = filename.indexOf(wcs[wcsIdx], textIdx);
if (textIdx == -1) {
// token not found
break;
}
int repeat = filename.indexOf(wcs[wcsIdx], textIdx + 1);
if (repeat >= 0) {
backtrack.push(new int[] {wcsIdx, repeat});
}
} else {
// matching from current position
if (!filename.startsWith(wcs[wcsIdx], textIdx)) {
// couldnt match token
break;
}
}
// matched text token, move text index to end of matched token
textIdx += wcs[wcsIdx].length();
anyChars = false;
}
wcsIdx++;
}
// full match
if (wcsIdx == wcs.length && textIdx == filename.length()) {
return true;
}
} while (backtrack.size() > 0);
return false;
}
/**
* Splits a string into a number of tokens.
*
* @param text the text to split
* @return the tokens, never null
*/
static String[] splitOnTokens(String text) {
// used by wildcardMatch
// package level so a unit test may run on this
if (text.indexOf("?") == -1 && text.indexOf("*") == -1) {
return new String[] { text };
}
char[] array = text.toCharArray();
ArrayList list = new ArrayList();
StringBuffer buffer = new StringBuffer();
for (int i = 0; i < array.length; i++) {
if (array[i] == '?' || array[i] == '*') {
if (buffer.length() != 0) {
list.add(buffer.toString());
buffer.setLength(0);
}
if (array[i] == '?') {
list.add("?");
} else if (list.size() == 0 ||
(i > 0 && list.get(list.size() - 1).equals("*") == false)) {
list.add("*");
}
} else {
buffer.append(array[i]);
}
}
if (buffer.length() != 0) {
list.add(buffer.toString());
}
return (String[]) list.toArray(new String[0]);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -