⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directoryiterator.java

📁 Use the links below to download a source distribution of Ant from one of our mirrors. It is good pra
💻 JAVA
字号:
/* *  Licensed to the Apache Software Foundation (ASF) under one or more *  contributor license agreements.  See the NOTICE file distributed with *  this work for additional information regarding copyright ownership. *  The ASF licenses this file to You under the Apache License, Version 2.0 *  (the "License"); you may not use this file except in compliance with *  the License.  You may obtain a copy of the License at * *      http://www.apache.org/licenses/LICENSE-2.0 * *  Unless required by applicable law or agreed to in writing, software *  distributed under the License is distributed on an "AS IS" BASIS, *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. *  See the License for the specific language governing permissions and *  limitations under the License. * */package org.apache.tools.ant.taskdefs.optional.depend;import java.io.File;import java.io.FileInputStream;import java.io.IOException;import java.util.Enumeration;import java.util.Stack;import java.util.Vector;/** * An iterator which iterates through the contents of a java directory. The * iterator should be created with the directory at the root of the Java * namespace. * */public class DirectoryIterator implements ClassFileIterator {    /**     * This is a stack of current iterators supporting the depth first     * traversal of the directory tree.     */    private Stack enumStack;    /**     * The current directory iterator. As directories encounter lower level     * directories, the current iterator is pushed onto the iterator stack     * and a new iterator over the sub directory becomes the current     * directory. This implements a depth first traversal of the directory     * namespace.     */    private Enumeration currentEnum;    /**     * Creates a directory iterator. The directory iterator is created to     * scan the root directory. If the changeInto flag is given, then the     * entries returned will be relative to this directory and not the     * current directory.     *     * @param rootDirectory the root if the directory namespace which is to     *      be iterated over     * @param changeInto if true then the returned entries will be relative     *      to the rootDirectory and not the current directory.     * @exception IOException if there is a problem reading the directory     *      information.     */    public DirectoryIterator(File rootDirectory, boolean changeInto)         throws IOException {        super();        enumStack = new Stack();        Vector filesInRoot = getDirectoryEntries(rootDirectory);        currentEnum = filesInRoot.elements();    }    /**     * Get a vector covering all the entries (files and subdirectories in a     * directory).     *     * @param directory the directory to be scanned.     * @return a vector containing File objects for each entry in the     *      directory.     */    private Vector getDirectoryEntries(File directory) {        Vector files = new Vector();        // File[] filesInDir = directory.listFiles();        String[] filesInDir = directory.list();        if (filesInDir != null) {            int length = filesInDir.length;            for (int i = 0; i < length; ++i) {                files.addElement(new File(directory, filesInDir[i]));            }        }        return files;    }    /**     * Template method to allow subclasses to supply elements for the     * iteration. The directory iterator maintains a stack of iterators     * covering each level in the directory hierarchy. The current iterator     * covers the current directory being scanned. If the next entry in that     * directory is a subdirectory, the current iterator is pushed onto the     * stack and a new iterator is created for the subdirectory. If the     * entry is a file, it is returned as the next element and the iterator     * remains valid. If there are no more entries in the current directory,     * the topmost iterator on the stack is popped off to become the     * current iterator.     *     * @return the next ClassFile in the iteration.     */    public ClassFile getNextClassFile() {        ClassFile nextElement = null;        try {            while (nextElement == null) {                if (currentEnum.hasMoreElements()) {                    File element = (File) currentEnum.nextElement();                    if (element.isDirectory()) {                        // push the current iterator onto the stack and then                        // iterate through this directory.                        enumStack.push(currentEnum);                        Vector files = getDirectoryEntries(element);                        currentEnum = files.elements();                    } else {                        // we have a file. create a stream for it                        FileInputStream inFileStream                            = new FileInputStream(element);                        if (element.getName().endsWith(".class")) {                            // create a data input stream from the jar                            // input stream                            ClassFile javaClass = new ClassFile();                            javaClass.read(inFileStream);                            nextElement = javaClass;                        }                    }                } else {                    // this iterator is exhausted. Can we pop one off the stack                    if (enumStack.empty()) {                        break;                    } else {                        currentEnum = (Enumeration) enumStack.pop();                    }                }            }        } catch (IOException e) {            nextElement = null;        }        return nextElement;    }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -