`

请您先登录,才能继续操作

文件迭代器

 
阅读更多
我们在开发中,经常需要遍历一个目录下的所有文件,常用的办法就是使用一个函数递归遍历是常用的办法。例如:
public static void iterateFile(File file) {
    if (file.isDirectory()) {
        if (file.getName().startsWith(".")) return;

        for (File item : file.listFiles()) {
            iterateFile(item);
        }
        return;
    }

    // do something
}
但是递归函数的缺点就是扩展不方便,当然你对这个函数加入一个参数FileHandler,这样扩展性稍好一些,但是仍然不够好,比如说,不能根据遍历的需要中途停止遍历,加入Filter等等。我实现了一个FileIterator,使得遍历一个目录下的文件如何遍历一个集合中的元素一般操作。

废话少说,代码如下:

package com.apusic.io;

import java.io.File;
import java.util.Iterator;
import java.util.NoSuchElementException;

public class FileIterator implements Iterator {
	private static class State{
		final State parent;
		final File[] files;
		
		int index = 0;
		public State(State parent, File dir){
			this.parent = parent;
			this.files = dir.listFiles();
		}
	}

	private File current;
	private State state;
	
	public FileIterator(File file) {
        if (file.isDirectory()) {
            state = new State(null, file);
            nextInternal();
        } else {
            this.current = file;
            state = null;
        }
    }

    @Override
    public boolean hasNext() {
        return current != null;
    }

    @Override
    public File next() {
        File rtValue = current;

        if (rtValue == null) throw new NoSuchElementException();

        nextInternal();

        return rtValue;
    }

    private void nextInternal() {
        current = null;

        if (this.state == null) return;

        for (;;) {
            if (state.index >= state.files.length) {
                state = state.parent;
                if (state == null)  return;

                state.index++;
                continue;
            }

            File file = state.files[state.index];
            
            // 可以在此处加入Filters处理代码
            
            if (file.isDirectory()) {
                state = new State(state, file);
                continue;
            }

            current = file;
            state.index++;
            break;
        }
    }

    @Override
    public void remove() {
        throw new UnsupportedOperationException();
    }


}


使用FileIterator的例子:
File dir = new File("/home/wenshao/workspace");

Iterator<File> iter = new FileIterator(dir);
while (iter.hasNext()) {
    File file = iter.next();
    System.out.println(file.getPath());
}

  转载自网友的... ...
分享到:
评论

相关推荐

    迭代器Iterator.txt

    根据提供的文件信息,我们可以深入探讨迭代器(Iterator)这一设计模式在Java中的应用与实现细节。迭代器模式是一种常用的设计模式,它允许我们以一种顺序访问集合对象的方式遍历其元素,而无需暴露该对象的内部表示...

    23钟设计模式之迭代器模式模式

    - **文件处理**:处理文件时,可能需要遍历文件的每一行或每一个记录,迭代器模式可以使得这种遍历更加方便和直观。 - **网络协议**:在分析或处理网络数据包时,使用迭代器模式可以方便地遍历数据包的不同部分。 #...

    迭代器模式demo

    迭代器模式是一种行为设计模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在Java、C#等面向对象编程语言中,迭代器模式被广泛应用于集合类库,如ArrayList、LinkedList等。这个"迭代器模式demo...

    设计模式C++学习之迭代器模式(Iterator)

    这些迭代器符合C++的输入/输出迭代器、向前迭代器、双向迭代器和随机访问迭代器的分类,根据它们支持的操作类型和性能特性进行区分。 在实际编程中,合理运用迭代器模式可以帮助我们编写更加模块化和易于维护的代码...

    CORBA实现迭代器

    在本主题中,我们将深入探讨如何使用CORBA实现迭代器,以及涉及的两种方法:通过IOR文件和命名服务。 首先,我们来看`goldmine.idl`文件。IDL(Interface Definition Language)是CORBA中的一个关键部分,用于定义...

    matlab开发-设计模式迭代器行为

    `CellArrayListIterator.m` 文件则可能是一个特化的迭代器类,专门为`CellArrayList`类设计,它可能包含了遍历细胞数组特定逻辑的实现。 `testCellArrayListIterator.m` 是测试文件,用于验证`...

    迭代器实例

    在C++编程语言中,迭代器(Iterator)是一种设计模式,它提供了一种方法来顺序访问容器(如数组、向量、链表等)中的元素,而无需暴露其底层的表示方式。迭代器充当了容器对象和它们所包含元素之间的桥梁,允许...

    C#设计模式迭代器示例

    迭代器模式是软件设计模式中的一种行为模式,它允许我们顺序访问聚合对象的元素,而无需暴露其底层表示。在C#中,迭代器模式的应用非常广泛,尤其是在处理集合类库时。本教程将深入讲解如何在C#中实现迭代器模式。 ...

    基于迭代器的一元多项式计算

    项目的`calculator`文件可能是实现这些功能的主要源代码文件,可能包含多项式类的定义、迭代器函数的实现以及用户交互逻辑。通过阅读和理解这部分代码,我们可以深入学习如何在C语言中利用迭代器和分层结构来处理...

    迭代器、分部类、索引器.

    迭代器、分部类和索引器是编程中常见的概念,尤其在面向对象的语言中扮演着重要的角色。这里我们将深入探讨这些主题,并结合C#语言的特性进行详细讲解。 首先,我们来了解一下**迭代器**。迭代器是访问集合元素的一...

    组合模式二叉树,前序、中序、后续,迭代器模式访问遍历

    在这个主题中,我们主要探讨了如何利用组合模式(Composite Pattern)构建二叉树,并通过迭代器模式(Iterator Pattern)来实现对树的遍历,包括前序、中序和后序遍历。这些是设计模式中的经典应用,对于理解和掌握...

    python迭代器与生成器示例代码之文件行迭代器

    python 迭代器与生成器

    文件检索器 递归迭代搜索

    文件检索器是一个强大的工具,它使用递归迭代搜索技术来帮助用户快速找到计算机中的特定文件或文件夹。这种技术在IT行业中是相当普遍且实用的,尤其对于处理大量数据和多层级目录结构的情况。让我们深入了解一下这个...

    学学Python_47类的成员06 实现迭代器

    在Python编程语言中,迭代器是一个非常重要的概念,它允许我们遍历集合对象中的所有元素,而无需显式地调用`next()`方法或使用索引。本篇将重点讲解如何在Python中实现一个自定义迭代器,以及相关类的成员操作。 ...

    学学Python_26语句_条件语句7(迭代器01并行迭代)

    在Python编程语言中,迭代是遍历数据结构(如列表、元组或字典)中的元素的过程,而迭代器是一种可以记住遍历位置的对象。在本主题“学学Python_26语句_条件语句7(迭代器01并行迭代)”中,我们将深入探讨如何使用...

    java Iterator迭代器的使用

    迭代器的主要方法包括`hasNext()`(检查集合中是否存在下一个元素)、`next()`(返回当前元素并移动到下一个)和`remove()`(删除当前元素)。 2. **获取迭代器** 要使用`Iterator`,首先需要通过调用集合类的`...

    joomla迭代器的用法

    标题中提到的"joomla迭代器的用法"主要关注于DirectoryIterator和RecursiveIteratorIterator在文件系统操作中的应用。以下是一些示例代码: 1. **非递归文件遍历**(任务1) 传统方法(normalScan)使用`scandir()...

    Head First 设计模式 (九) 迭代器与组合模式(Iterator & Composite pattern) C++实现

    在实际编程中,迭代器模式常用于STL(Standard Template Library)容器如vector、list、set等,而组合模式则常见于UI设计、文件系统、组织结构的建模等场景。这两种模式的结合使用,可以使代码更加灵活,易于理解和...

    Java设计模式课件迭代器模式.pptx

    迭代器模式的应用场景包括:遍历数据库表、遍历文件系统、遍历XML文档等。在Java中,迭代器模式广泛应用于集合框架,例如ArrayList、LinkedList等。 在Java中实现迭代器模式,需要定义抽象迭代器和具体迭代器,抽象...

    Python 迭代器 iteraor

    压缩包内的文件“Python 高级编程-[0001]-[Python 迭代器 iteraor].docx”可能是一个详细的教程,涵盖了迭代器的高级用法,可能包括生成器(generator)——这是Python特有的迭代器实现,它们允许我们创建惰性计算的...

Global site tag (gtag.js) - Google Analytics