求教遍历文件夹stack递归的问题

mixturer 2016-01-18 11:35:15
大神,我自己调了2天了,还是不能解决问题,求各位帮我看看这个应该怎么改?
我写了一个遍历文件夹的程序,使用了iterator来遍历,将数据加到stack中去,但是每次遍历文件夹时,里面符合条件的文件都会被重发打印,比如一个doc文档,D:\123\456\789\*.doc的word文档会被重复答应两次,目录越深,重复次数越多,我的本意是把目录下有doc文件的话,答应出来,这个怎么解决重复问题呀?
我的源代码:
package com.alex.component;

import java.util.Iterator;

public abstract class AbstractFile{

public String getFileName() {
throw new UnsupportedOperationException();
}

public String getFileType() {
throw new UnsupportedOperationException();
}

public void add(AbstractFile abstractFile){
throw new UnsupportedOperationException();
}

public void remove(AbstractFile abstractFile){
throw new UnsupportedOperationException();
}

public AbstractFile getChild(int i){
throw new UnsupportedOperationException();
}

public void print(){
throw new UnsupportedOperationException();
}

public boolean isSelectedFile(String[] configs,String suffix){
throw new UnsupportedOperationException();
}

public abstract Iterator createIterator();
}


package com.alex.component;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import com.alex.iterator.DirectoryCompositeIterator;

public class DirectoryComposite extends AbstractFile {

private List<AbstractFile> list = new ArrayList<AbstractFile>();
private String fileName;
private String fileType;

public DirectoryComposite(String fileName,String fileType) {
this.fileName=fileName;
this.fileType=fileType;
}

@Override
public String getFileName() {
return fileName;
}

@Override
public String getFileType() {
return fileType;
}

@Override
public void add(AbstractFile abstractFile) {
list.add(abstractFile);
}

@Override
public void remove(AbstractFile abstractFile) {
super.remove(abstractFile);
}

@Override
public AbstractFile getChild(int i) {
return (AbstractFile)list.get(i);
}

@Override
public void print() {
System.out.println(getFileName());
System.out.print(","+getFileType());
System.out.println("-------------------------");

Iterator iterator=list.iterator();
while(iterator.hasNext()){
AbstractFile abstractFile=(AbstractFile)iterator.next();
abstractFile.print();
}
}

@Override
public Iterator createIterator() {
return new DirectoryCompositeIterator(list.iterator());
}

@Override
public boolean isSelectedFile(String[] configs,String suffix){
return false;
}
}


package com.alex.component;

import java.util.Iterator;

import com.alex.iterator.FileLeafIterator;


public class FileLeaf extends AbstractFile{

private String fileName;
private String fileType;

public FileLeaf(String fileName, String fileType) {
super();
this.fileName = fileName;
this.fileType = fileType;
}

@Override
public String getFileName() {
return fileName;
}

@Override
public String getFileType() {
return fileType;
}

@Override
public void print() {
System.out.println(" "+getFileName());
System.out.println(" --"+getFileType());
}

@Override
public Iterator createIterator() {
return new FileLeafIterator();
}

@Override
public boolean isSelectedFile(String[] configs,String suffix){
for(String config:configs){
if(suffix.equalsIgnoreCase(config)){
return true;
}
}
return false;
}

}


package com.alex.iterator;

import java.util.Iterator;
import java.util.Stack;

import com.alex.component.AbstractFile;
import com.alex.component.DirectoryComposite;

@SuppressWarnings("unchecked")
public class DirectoryCompositeIterator implements Iterator {

Stack stack=new Stack();

public DirectoryCompositeIterator(){
}

public DirectoryCompositeIterator(Iterator<AbstractFile> iterator){
stack.push(iterator);
}

@Override
public boolean hasNext() {
if(stack.empty()){
return false;
}else{
Iterator iterator=(Iterator)stack.peek();
if(!iterator.hasNext()){
stack.pop();
return hasNext();
}else{
return true;
}
}
}

@Override
public Object next() {
if(hasNext()){
Iterator iterator = (Iterator)stack.peek();
AbstractFile abstractFile = (AbstractFile)iterator.next();
if(abstractFile instanceof DirectoryComposite){
stack.push(abstractFile.createIterator());
}
return abstractFile;
}else{
return null;
}
}

}


package com.alex.iterator;

import java.util.Iterator;

public class FileLeafIterator implements Iterator{

@Override
public boolean hasNext() {
return false;
}

@Override
public Object next() {
return null;
}

}


package com.alex.print;

import java.util.Iterator;

import com.alex.component.AbstractFile;

public class PrintToExcel {
private AbstractFile abstractFile;

public PrintToExcel(AbstractFile abstractFile) {
super();
this.abstractFile = abstractFile;
}

public void print(){
Iterator iterator=abstractFile.createIterator();
while(iterator.hasNext()){
AbstractFile absFile=(AbstractFile)iterator.next();
try {
if(absFile.isSelectedFile(new String[]{"docx","xlsx","doc","xls"}, absFile.getFileType())){
absFile.print();
}
} catch (UnsupportedOperationException e) {
}
}
}
}


package com.alex.test;


import java.io.File;
import java.util.Arrays;
import java.util.List;

import com.alex.component.AbstractFile;
import com.alex.component.DirectoryComposite;
import com.alex.component.FileLeaf;
import com.alex.print.PrintToExcel;
import com.alex.util.FileUtils;

public class TestFile {
public static void main(String[] args) {
String path="D:/123";
File file=new File(path);
AbstractFile abstractFile=FileUtils.listFiles(file);
PrintToExcel pte=new PrintToExcel(abstractFile);
pte.print();
}
}


package com.alex.util;

import java.io.File;
import java.util.Arrays;
import java.util.List;

import com.alex.component.AbstractFile;
import com.alex.component.DirectoryComposite;
import com.alex.component.FileLeaf;

public class FileUtils {

public static String getFileType(File file){
if(file.isDirectory()){
return "";
}

int dot=file.getName().lastIndexOf(".")+1;
String type=file.getName().substring(dot);
return type;
}

public static String getAbstractFilePath(File file){
return file.getAbsolutePath();
}

public static void validateIsDirectory(File file){
if(!file.isDirectory()){
throw new IllegalArgumentException("Parameter 'directory' is not a directory");
}
}

public static AbstractFile innerListFiles(File directory,AbstractFile abstractFile){
if(directory.listFiles()!=null){
List<File> founds = Arrays.asList(directory.listFiles());
if(founds!=null){
for(File found:founds){
if(found.exists()){
if(found.isDirectory()){
AbstractFile dirFile=new DirectoryComposite(getAbstractFilePath(found),getFileType(found));
abstractFile.add(dirFile);
innerListFiles(found,dirFile);
}else{
AbstractFile fileLeaf=new FileLeaf(getAbstractFilePath(found),getFileType(found));
abstractFile.add(fileLeaf);
}
}
}
}
}
return abstractFile;
}

public static AbstractFile listFiles(File directory){
validateIsDirectory(directory);

String fileName=getAbstractFilePath(directory);
String fileType=getFileType(directory);

AbstractFile topPath=new DirectoryComposite(fileName, fileType);

//1.listFile
innerListFiles(directory,topPath);

return topPath;
}

}


各位如果能帮帮我的话求帮我看看吧。
...全文
149 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mixturer 2016-01-21
  • 打赏
  • 举报
回复
引用 4 楼 shixitong 的回复:
DirectoryCompositeIterator 这个类的next有递归调用,会重复添加到stack中,push完可以return null
public Object next() {
		if(hasNext()){
			Iterator iterator = (Iterator)stack.peek();
			AbstractFile abstractFile = (AbstractFile)iterator.next();
			if(abstractFile instanceof DirectoryComposite){
				stack.push(abstractFile.createIterator());
				return null;
			}
			return abstractFile;
		}else{
			return null;
		}
	}
对应调用的地方要判断为不为null
if(absFile!=null){
					if(absFile.isSelectedFile(new String[]{"docx","xlsx","doc","xls"}, absFile.getFileType())){
						absFile.print();
					}
				}
ps:不过你这个功能写的也太复杂了,如果想得到符合要求的文件
AbstractFile abstractFile=FileUtils.listFiles(file);
到这边就可以结束了,下面只是根据对应的过滤条件过滤就行了,没必要写那么多
谢谢楼主了,我自己调试的时候大概也看出问题了,只是怎么解决老是想不通,我老是想着把递归的DirectoryCompositeIterator怎么pop掉,或者把游标修改掉,老是想不通,您一说我大概明白了,估计的好好再想想,其实我写这么复杂也是想试试多个模式复合在一起怎么处理的~~~结果递归把自己搞死了,谢谢版主了~~~
mixturer 2016-01-20
  • 打赏
  • 举报
回复
没人呀~~~
mixturer 2016-01-20
  • 打赏
  • 举报
回复
谢谢,我试试
shixitong 2016-01-20
  • 打赏
  • 举报
回复
DirectoryCompositeIterator 这个类的next有递归调用,会重复添加到stack中,push完可以return null
public Object next() {
		if(hasNext()){
			Iterator iterator = (Iterator)stack.peek();
			AbstractFile abstractFile = (AbstractFile)iterator.next();
			if(abstractFile instanceof DirectoryComposite){
				stack.push(abstractFile.createIterator());
				return null;
			}
			return abstractFile;
		}else{
			return null;
		}
	}
对应调用的地方要判断为不为null
if(absFile!=null){
					if(absFile.isSelectedFile(new String[]{"docx","xlsx","doc","xls"}, absFile.getFileType())){
						absFile.print();
					}
				}
ps:不过你这个功能写的也太复杂了,如果想得到符合要求的文件
AbstractFile abstractFile=FileUtils.listFiles(file);
到这边就可以结束了,下面只是根据对应的过滤条件过滤就行了,没必要写那么多
mixturer 2016-01-19
  • 打赏
  • 举报
回复
DDDDDDDDDDDDDDD的
mixturer 2016-01-19
  • 打赏
  • 举报
回复
自己顶,求指教

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧