使用组合模式与迭代器模式遍历文件夹中所有文件

来源:互联网 发布:市场份额数据 编辑:程序博客网 时间:2024/06/11 13:01

我写这个例子只是想练习组合模式和迭代器模式的使用,模仿了headfirst设计模式的写法,解决了里面的bug,自己mark一下,对于java初学者不是好理解,so~多看几遍总归有些收获,高手就轻拍吧...


package com.alex.component;import java.util.Iterator;@SuppressWarnings("rawtypes")public abstract class AbstractFile{public String getFileName() {throw new UnsupportedOperationException();}public String getFileType() {throw new UnsupportedOperationException();}public void setFileType(String fileType) {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){throw new UnsupportedOperationException();}public abstract Iterator createIterator();public boolean isNotTheSelectedFile(String[] configs){throw new UnsupportedOperationException();}}

package com.alex.component;import java.util.ArrayList;import java.util.Iterator;import java.util.List;import com.alex.iterator.DirectoryCompositeIterator;@SuppressWarnings("rawtypes")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;}@Overridepublic String getFileName() {return fileName;}@Overridepublic String getFileType() {return fileType;}@Overridepublic void add(AbstractFile abstractFile) {list.add(abstractFile);}@Overridepublic void remove(AbstractFile abstractFile) {list.remove(abstractFile);}@Overridepublic AbstractFile getChild(int i) {return (AbstractFile)list.get(i);}@Overridepublic void print() {System.out.println(getFileName()+","+getFileType());System.out.println("-------------------------");/*Iterator iterator=list.iterator();while(iterator.hasNext()){AbstractFile abstractFile=(AbstractFile)iterator.next();abstractFile.print();}*/}@Overridepublic Iterator createIterator() {//return new DirectoryCompositeIterator(list.iterator());return list.iterator();}@Overridepublic boolean isSelectedFile(String[] configs){for(String config:configs){if(getFileName().indexOf(config)!=-1){return true;}}return false;}}

package com.alex.component;import java.util.Iterator;import com.alex.iterator.FileLeafIterator;@SuppressWarnings("rawtypes")public class FileLeaf extends AbstractFile{private String fileName;private String fileType;public FileLeaf(String fileName, String fileType) {this.fileName = fileName;this.fileType = fileType;}@Overridepublic String getFileName() {return fileName;}@Overridepublic String getFileType() {return fileType;}@Overridepublic void remove(AbstractFile abstractFile) {super.remove(abstractFile);}@Overridepublic void setFileType(String fileType){this.fileType=fileType;}@Overridepublic void print() {System.out.println("  "+getFileName());System.out.println("     --"+getFileType());}@Overridepublic Iterator createIterator() {return new FileLeafIterator();}@Overridepublic boolean isSelectedFile(String[] configs){for (String config : configs) {if(getFileName().indexOf(config)!=-1){return true;}}return false;}@Overridepublic boolean isNotTheSelectedFile(String[] configs) {for (String config : configs) {if(getFileName().indexOf(config)!=-1){return false;}}return true;}}

package com.alex.iterator;import java.util.Iterator;import java.util.NoSuchElementException;import java.util.Stack;import com.alex.component.AbstractFile;import com.alex.component.DirectoryComposite;@SuppressWarnings("rawtypes")public class DirectoryCompositeIterator implements Iterator {private final Stack stack=new Stack();@SuppressWarnings("unchecked")public DirectoryCompositeIterator(Iterator iterator){stack.push(iterator);}@Overridepublic boolean hasNext() {if(stack.empty()){return false;}else{Iterator iterator=(Iterator)stack.peek();if(!iterator.hasNext()){stack.pop();return hasNext();}else{return true;}}}@SuppressWarnings("unchecked")@Overridepublic 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 new NoSuchElementException();}}@Overridepublic void remove() {throw new UnsupportedOperationException();}}

package com.alex.iterator;import java.util.Iterator;import java.util.Stack;@SuppressWarnings("rawtypes")public class FileLeafIterator implements Iterator{@Overridepublic boolean hasNext() {return false;}@Overridepublic Object next() {return null;}@Overridepublic void remove() {throw new UnsupportedOperationException();}}

package com.alex.print;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.util.List;import java.util.ArrayList;import java.util.Iterator;import java.util.Map;import java.util.Set;import org.apache.poi.hssf.usermodel.HSSFCell;import org.apache.poi.hssf.usermodel.HSSFRow;import org.apache.poi.hssf.usermodel.HSSFSheet;import org.apache.poi.hssf.usermodel.HSSFWorkbook;import com.alex.component.AbstractFile;import com.alex.component.DirectoryComposite;import com.alex.iterator.DirectoryCompositeIterator;import com.alex.util.FileUtils;import com.alex.util.SystemConstantValue;@SuppressWarnings("rawtypes")public class PrintToExcel {private AbstractFile abstractFile;public PrintToExcel(AbstractFile abstractFile) {this.abstractFile = abstractFile;}private List<AbstractFile> iteratorAbstractFile(AbstractFile abstractFile,Map<String,Object> filters) {//get filtersString[] dirFilters=getFilterString(filters, "dirFilters");String[] fileFilters=getFilterString(filters, "fileFilters");String[] keyFeathers=getFilterString(filters, "keyFeathers");Iterator iterator=new DirectoryCompositeIterator(abstractFile.createIterator());List<AbstractFile> absList=new ArrayList<AbstractFile>();while(iterator.hasNext()){AbstractFile absFile=(AbstractFile)iterator.next();try {if(absFile!=null){//1.获取pathString path=absFile.getFileName().substring(0,absFile.getFileName().lastIndexOf(File.separator));File tempFile=new File(path);AbstractFile dirFile=new DirectoryComposite(FileUtils.getAbstractFilePath(tempFile),FileUtils.getFileType(tempFile));if(dirFile.isSelectedFile(dirFilters)){if(absFile.isNotTheSelectedFile(fileFilters)){absList.add(FileUtils.changeTheFileType(absFile,keyFeathers));}}}} catch (UnsupportedOperationException e) {}}return absList;}public static String[] getFilterString(Map<String, Object> filtersMap,String key){validateParams(filtersMap,key);if(filtersMap.containsKey(key)){return (String[])filtersMap.get(key);}return null;}public void print(){Iterator iterator=new DirectoryCompositeIterator(abstractFile.createIterator());while(iterator.hasNext()){try {AbstractFile absFile=(AbstractFile)iterator.next();absFile.print();} catch (UnsupportedOperationException e) {}}}public void printToExcel(Map<String,Object> filters){List<AbstractFile> absList=iteratorAbstractFile(abstractFile,filters);HSSFWorkbook wb=new HSSFWorkbook();HSSFSheet sheet=wb.createSheet("文件数据");HSSFRow row0=sheet.createRow(0);HSSFCell cell0=row0.createCell(0);cell0.setCellValue(SystemConstantValue.CELL_FILE_NAME);cell0=row0.createCell(1);cell0.setCellValue(SystemConstantValue.CELL_FILE_TYPE);for(int i=1,j=0;i<absList.size()+1;i++){AbstractFile absFile=absList.get(i-1);HSSFRow row=sheet.createRow(i);HSSFCell cell=row.createCell(j);cell.setCellValue(absFile.getFileName());cell=row.createCell(j+1);cell.setCellValue(absFile.getFileType());}FileOutputStream fos;try {fos = new FileOutputStream(System.getProperty("user.dir")+File.separator+SystemConstantValue.FILE_PATH);wb.write(fos);fos.close();wb.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch(IOException e){e.printStackTrace();}}public static void validateParams(Map<String,Object> filtersMap,String key) {if(filtersMap.size()!=3){throw new IllegalArgumentException("the filtersMap's size must is 3");}for(String keyString:filtersMap.keySet()){if(filtersMap.get(keyString)==null){throw new NullPointerException("the filters is null");}}if(key==null){throw new NullPointerException("the key is null");}}}

package com.alex.test;import java.io.File;import java.util.HashMap;import java.util.Map;import com.alex.component.AbstractFile;import com.alex.print.PrintToExcel;import com.alex.util.FileUtils;public class TestFile {public static void main(String[] args) {//Map<String,Object> filtersMap<String,Object> filters=new HashMap<String, Object>();filters.put("dirFilters", new String[]{"netstat"});filters.put("fileFilters", new String[]{"txt"});filters.put("keyFeathers", new String[]{"doc"});String path="D:\\test";File file=new File(path);AbstractFile abstractFile=FileUtils.listFiles(file);PrintToExcel pte=new PrintToExcel(abstractFile);pte.printToExcel(filters);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 "Directory";}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 validateListFilesParameters(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){validateListFilesParameters(directory);String fileName=getAbstractFilePath(directory);String fileType=getFileType(directory);AbstractFile topPath=new DirectoryComposite(fileName, fileType);//1.listFileinnerListFiles(directory,topPath);return topPath;}public static AbstractFile changeTheFileType(AbstractFile abstractFile,String[] filters){if(abstractFile instanceof FileLeaf){if(abstractFile.isSelectedFile(filters)){abstractFile.setFileType(SystemConstantValue.FILE_DOC);}else{abstractFile.setFileType(SystemConstantValue.FILE_UPLOAD);}}return abstractFile;}}

package com.alex.util;public class SystemConstantValue {public static String CELL_FILE_NAME="文件名";public static String CELL_FILE_TYPE="介质形式";public static String FILE_PATH="output/output.xls";public static String FILE_DOC="文档";public static String FILE_UPLOAD="提交物";}



0 0
原创粉丝点击