【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();
}
}
效果图:
或者存储到工程下的文件:
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("存储成功");//提示一下
}
}
效果:
关于算法,有更优的,欢迎指点!