Сравнение кода смешивания Poly-SO и FileUtils Apache Commons: iterateFiles и listFiles
Apache commons-io имеет аналогичные методы iterateFiles и listFiles в FileUtils, предложенные Bozho .
Проверка параметров выполняется разными способами, но никогда не "System.exit (9)"!
Они сравнивают с нулем, проверяют его существование с помощью File-type (доступный для него метод),
Они используют static, relatedList в реализации listFiles - предложено в книге poly .
Они повторно используют поле, чтобы найти все каталоги:
TrueFileFilter.INSTANCE
Синглтонный экземпляр истинного фильтра (из API Apache, синглтон?)
Эти два метода являются единственными, которые используют IOFileFilter в качестве параметра.
Я не уверен в его последствиях. Они наверняка могут повторно использовать свой код.
Есть несколько очень кратких - я думаю, хороших - оценочных баллов, никаких размытых пустышек.
Пожалуйста, посмотрите оценку (a? B: c), сохраните глупые суммы и предложения if.
return listFiles(directory, filter,
(recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE));
Класс FileUtils, в котором находятся методы, имеет только 4 значения поля - около 2,5 методов на поле!
Теперь мне стыдно за мой класс.
Разительная разница заключается в использовании исключений.
Они используют их, но - очевидно, из-за другой цели класса FileUtils - они позволяют пользователю обрабатывать их, нет централизованной коллекции в списке.
Никаких дополнительных объявлений.
Основная информация
- Схожесть: связанный список и список
- Различия: меньше единиц, меньше разрядов, меньшая плотность полей для методов - краткость
- Различные цели: пример класса SO для конечного пользователя, FileUtils более бэкэнд
- Различие (естественное): обработка исключений в SO, но не в FileUtils (возможно, поэтому она так чиста)
Мне понравились комментарии и, в частности, источник 1039 * - я считаю, что он гораздо лучше в образовательных целях, чем чтение простых API. Надеюсь, вы тоже:)
Apache Commons: FileUtils.java, listFiles, iterateFiles - фрагменты кода
/**
* Finds files within a given directory (and optionally its
* subdirectories). All files found are filtered by an IOFileFilter.
* <p>
* If your search should recurse into subdirectories you can pass in
* an IOFileFilter for directories. You don't need to bind a
* DirectoryFileFilter (via logical AND) to this filter. This method does
* that for you.
* <p>
* An example: If you want to search through all directories called
* "temp" you pass in <code>FileFilterUtils.NameFileFilter("temp")</code>
* <p>
* Another common usage of this method is find files in a directory
* tree but ignoring the directories generated CVS. You can simply pass
* in <code>FileFilterUtils.makeCVSAware(null)</code>.
*
* @param directory the directory to search in
* @param fileFilter filter to apply when finding files.
* @param dirFilter optional filter to apply when finding subdirectories.
* If this parameter is <code>null</code>, subdirectories will not be included in the
* search. Use TrueFileFilter.INSTANCE to match all directories.
* @return an collection of java.io.File with the matching files
* @see org.apache.commons.io.filefilter.FileFilterUtils
* @see org.apache.commons.io.filefilter.NameFileFilter
*/
public static Collection listFiles(
File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) {
if (!directory.isDirectory()) {
throw new IllegalArgumentException(
"Parameter 'directory' is not a directory");
}
if (fileFilter == null) {
throw new NullPointerException("Parameter 'fileFilter' is null");
}
//Setup effective file filter
IOFileFilter effFileFilter = FileFilterUtils.andFileFilter(fileFilter,
FileFilterUtils.notFileFilter(DirectoryFileFilter.INSTANCE));
//Setup effective directory filter
IOFileFilter effDirFilter;
if (dirFilter == null) {
effDirFilter = FalseFileFilter.INSTANCE;
} else {
effDirFilter = FileFilterUtils.andFileFilter(dirFilter,
DirectoryFileFilter.INSTANCE);
}
//Find files
Collection files = new java.util.LinkedList();
innerListFiles(files, directory,
FileFilterUtils.orFileFilter(effFileFilter, effDirFilter));
return files;
}
/**
* Allows iteration over the files in given directory (and optionally
* its subdirectories).
* <p>
* All files found are filtered by an IOFileFilter. This method is
* based on {@link #listFiles(File, IOFileFilter, IOFileFilter)}.
*
* @param directory the directory to search in
* @param fileFilter filter to apply when finding files.
* @param dirFilter optional filter to apply when finding subdirectories.
* If this parameter is <code>null</code>, subdirectories will not be included in the
* search. Use TrueFileFilter.INSTANCE to match all directories.
* @return an iterator of java.io.File for the matching files
* @see org.apache.commons.io.filefilter.FileFilterUtils
* @see org.apache.commons.io.filefilter.NameFileFilter
* @since Commons IO 1.2
*/
public static Iterator iterateFiles(
File directory, IOFileFilter fileFilter, IOFileFilter dirFilter) {
return listFiles(directory, fileFilter, dirFilter).iterator();
}
// **** Вырежьте деталь ****** //
/**
* Finds files within a given directory (and optionally its subdirectories)
* which match an array of extensions.
*
* @param directory the directory to search in
* @param extensions an array of extensions, ex. {"java","xml"}. If this
* parameter is <code>null</code>, all files are returned.
* @param recursive if true all subdirectories are searched as well
* @return an collection of java.io.File with the matching files
*/
public static Collection listFiles(
File directory, String[] extensions, boolean recursive) {
IOFileFilter filter;
if (extensions == null) {
filter = TrueFileFilter.INSTANCE;
} else {
String[] suffixes = toSuffixes(extensions);
filter = new SuffixFileFilter(suffixes);
}
return listFiles(directory, filter,
(recursive ? TrueFileFilter.INSTANCE : FalseFileFilter.INSTANCE));
}
/**
* Allows iteration over the files in a given directory (and optionally
* its subdirectories) which match an array of extensions. This method
* is based on {@link #listFiles(File, String[], boolean)}.
*
* @param directory the directory to search in
* @param extensions an array of extensions, ex. {"java","xml"}. If this
* parameter is <code>null</code>, all files are returned.
* @param recursive if true all subdirectories are searched as well
* @return an iterator of java.io.File with the matching files
* @since Commons IO 1.2
*/
public static Iterator iterateFiles(
File directory, String[] extensions, boolean recursive) {
return listFiles(directory, extensions, recursive).iterator();
}