【java】逐层打印指定目录(文件夹)里所有文件名(完整代码)

解决:

    如何形象地输出指定目录(文件夹)里的文件名?

 

主类:

public class Main {
	public static void main(String[] args) {
		PrintDirectory pd = new PrintDirectory("C:\\Users\\HG\\Desktop\\day19");
		pd.doThings();
	}
}

工具类:

package com.fileSet;
import java.io.File;
import java.util.ArrayList;

/*
 * @describe: 
 * 		功能:逐层打印指定目录(文件夹)里所有文件名
 * 		思路:递归打印,采用ArrayList记录目录里的子文件是不是只有一个,来确定|的个数。其中,doThings()为入口。
 * 
 * @author:	winrh
 * 
 */
public class PrintDirectory {
	File f = null;
	ArrayList<Boolean> arrayList = new ArrayList<>();//存每一层是否多个文件或目录,true为有多个文件或目录
	
	public PrintDirectory(String path) {//设置要输出的目录路径
		f = new File(path);
	}
	
	public void doThings() {//入口
		arrayList.add(false);//刚开始是单个目录
		printFile(f);
	}
	
	public void printFile(File dirc) {
		printChars(dirc);//先打印前面的字符
		if (testDir()) {//是不是个目录?
			File[] list = dirc.listFiles();//列出子文件
			if(list.length==1){//只有一个子文件
				arrayList.add(false);//false为单个文件或目录
				f = list[0];
				printFile(f);
				arrayList.remove(arrayList.size()-1);//为了省略多余字符
			}
			else{
				arrayList.add(true);
				for (File file : list) {
					f = file;
					if(f == list[list.length-1]){
						arrayList.set(arrayList.size()-1, false);//为了省略多余字符
					}
					printFile(f);
				}
				arrayList.remove(arrayList.size()-1);//为了省略多余字符
			}
		}
	}

	public void printChars(File dirc) {//让输出形象一些
		for(Boolean arr:arrayList){//根据集合打印,省略多余的符号
			System.out.print("\t");
			if(arr){//如果是多个文件或目录
				System.out.print("|");
			}
		}
		if(!arrayList.get(arrayList.size()-1))//最里面的文件也要|的符号
			System.out.print("|");
		System.out.print("-->");
		System.out.println(dirc.getName());
	}

	public boolean testDir() {//是不是个目录?
		return f.isDirectory();
	}

}

效果图:

【java】逐层打印指定目录(文件夹)里所有文件名(完整代码)

或者存储到工程下的文件:

package com.fileSet;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.ArrayList;

/*
 * @describe: 
 * 		功能:逐层打印指定目录(文件夹)里所有文件名
 * 		思路:递归打印,采用ArrayList记录目录里的子文件是不是只有一个,来确定|的个数。其中,doThings()为入口。
 * 
 * @author:	winrh
 * 
 */
public class PrintDirectory {
	File f = null;
	ArrayList<Boolean> arrayList = new ArrayList<>();//存每一层是否多个文件或目录,true为有多个文件或目录
	PrintStream ps = null;
	public PrintDirectory(String path) {//设置要输出的目录路径
		f = new File(path);
	}
	
	public void doThings() {//入口
		arrayList.add(false);//刚开始是单个目录
		writeTxt();//将输出在控制台的内容存储到指定文件中。
	}
	
	public void printFile(File dirc) {
		printChars(dirc);//先打印前面的字符
		if (testDir()) {//是不是个目录?
			File[] list = dirc.listFiles();//列出子文件
			if(list.length==1){//只有一个子文件
				arrayList.add(false);//false为单个文件或目录
				f = list[0];
				printFile(f);
				arrayList.remove(arrayList.size()-1);//为了省略多余字符
			}
			else{
				arrayList.add(true);
				for (File file : list) {
					f = file;
					if(f == list[list.length-1]){
						arrayList.set(arrayList.size()-1, false);//为了省略多余字符
					}
					printFile(f);
				}
				arrayList.remove(arrayList.size()-1);//为了省略多余字符
			}
		}
	}

	public void printChars(File dirc) {//让输出形象一些
		for(Boolean arr:arrayList){//根据集合打印,省略多余的符号
			System.out.print("\t");
			if(arr){//如果是多个文件或目录
				System.out.print("|");
			}
		}
		if(!arrayList.get(arrayList.size()-1))//最里面的文件也要|的符号
			System.out.print("|");
		System.out.print("-->");
		System.out.println(dirc.getName());
	}

	public boolean testDir() {//是不是个目录?
		return f.isDirectory();
	}

	public void writeTxt(){
		PrintStream oldStream = System.out;
		try {
			ps = new PrintStream(new FileOutputStream("printDirectory.txt"),true);
			//采用IO里面的打印流,自动刷新模式
			if(ps!=null)//将标准输出流(控制台输出)改成文件
				System.setOut(ps);
			printFile(f);//在writeTxt下输出
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}finally{
			if(ps!=null){
				try{
					ps.close();
				}catch(Exception e){
					e.printStackTrace();
				}
			}
		}
		System.setOut(oldStream);//设置回去
		System.out.println("存储成功");//提示一下
	}
}

效果:

【java】逐层打印指定目录(文件夹)里所有文件名(完整代码)

关于算法,有更优的,欢迎指点!