67,512
社区成员
发帖
与我相关
我的任务
分享
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;
}
}
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);
到这边就可以结束了,下面只是根据对应的过滤条件过滤就行了,没必要写那么多