Java中IO流-33-File类递归练习-文件夹下文件和文件夹按层级打印

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011541946/article/details/81814077

继续做一个File类相关的递归练习题,需求是,键盘给定一个文件夹路径,按照层级打印该文件夹下文件和文件夹。

1. 分析

前面我们练习了很多次获取文件夹路径的方法,下面重点分析打印的思路。

     * 1.获取所有文件夹和文件,存储在File数组中
     * 2.遍历数组
     * 3.无论是文件还是文件夹都需要打印
     * 4.如果是文件夹,递归调用

2.打印初步代码实现

package io;

import java.io.File;
import java.util.Scanner;

public class Test8 {
	
	/**
	 * 题目:把文件夹下文件和文件夹按层级打印(linux中树形打印)
	 * 分析
	 * @param args
	 * 1.获取所有文件夹和文件,存储在File数组中
	 * 2.遍历数组
	 * 3.无论是文件还是文件夹都需要打印
	 * 4.如果是文件夹,递归调用
	 */

	public static void main(String[] args) {
		File dir = getDir();
		printDir(dir);
	}
	
	public static void printDir(File dir) {
		//1.获取所有文件夹和文件,存储在File数组中
		File[] subFiles = dir.listFiles();
		//2.遍历数组
		for (File subfile : subFiles) {
			//3.无论是文件还是文件夹都需要打印
			System.out.println(subfile);
			//4.如果是文件夹,递归调用
			if(subfile.isDirectory()) {
				printDir(subfile);
			}
		}
		
	}
	
	
	/**
	 * 获取文件夹路径
	 * @return
	 */
	public static File getDir () {
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个文件路径。");
		
		while(true) {
			String line = sc.nextLine();          //键盘录入文件夹路径存储
			File dir = new File(line);            //封装file对象
			
			//判断
			if( !dir.exists()) {
				System.out.println("你输入的文件夹路径不存在,请重新输入。");
			}else if(dir.isFile()) {
				System.out.println("你输入的是一个文件的路径,请换成文件夹路径");
			}else {
				return dir;
			}
		}
	}
	
}

运行,给出本地maven地址,打印效果没有层级打印,但是打印出来了。

C:\apache-maven-3.5.0\bin
C:\apache-maven-3.5.0\bin\m2.conf
C:\apache-maven-3.5.0\bin\mvn
C:\apache-maven-3.5.0\bin\mvn.cmd
C:\apache-maven-3.5.0\bin\mvnDebug
C:\apache-maven-3.5.0\bin\mvnDebug.cmd
C:\apache-maven-3.5.0\bin\mvnyjp
C:\apache-maven-3.5.0\boot
C:\apache-maven-3.5.0\boot\plexus-classworlds-2.5.2.jar
C:\apache-maven-3.5.0\conf
C:\apache-maven-3.5.0\conf\logging
C:\apache-maven-3.5.0\conf\logging\simplelogger.properties
C:\apache-maven-3.5.0\conf\settings.xml
C:\apache-maven-3.5.0\conf\toolchains.xml
C:\apache-maven-3.5.0\lib
C:\apache-maven-3.5.0\lib\aopalliance-1.0.jar
C:\apache-maven-3.5.0\lib\cdi-api-1.0.jar
C:\apache-maven-3.5.0\lib\cdi-api.license
C:\apache-maven-3.5.0\lib\commons-cli-1.4.jar
C:\apache-maven-3.5.0\lib\commons-cli.license
C:\apache-maven-3.5.0\lib\commons-io-2.5.jar
C:\apache-maven-3.5.0\lib\commons-io.license
C:\apache-maven-3.5.0\lib\commons-lang3-3.5.jar
C:\apache-maven-3.5.0\lib\commons-lang3.license
C:\apache-maven-3.5.0\lib\ext
C:\apache-maven-3.5.0\lib\ext\README.txt
C:\apache-maven-3.5.0\lib\guava-20.0.jar
C:\apache-maven-3.5.0\lib\guice-4.0-no_aop.jar
C:\apache-maven-3.5.0\lib\jansi-1.13.jar
C:\apache-maven-3.5.0\lib\jansi-native
C:\apache-maven-3.5.0\lib\jansi-native\linux32
C:\apache-maven-3.5.0\lib\jansi-native\linux32\libjansi.so
C:\apache-maven-3.5.0\lib\jansi-native\linux64
C:\apache-maven-3.5.0\lib\jansi-native\linux64\libjansi.so
C:\apache-maven-3.5.0\lib\jansi-native\osx
C:\apache-maven-3.5.0\lib\jansi-native\osx\libjansi.jnilib
C:\apache-maven-3.5.0\lib\jansi-native\README.txt
C:\apache-maven-3.5.0\lib\jansi-native\windows32
C:\apache-maven-3.5.0\lib\jansi-native\windows32\jansi.dll
C:\apache-maven-3.5.0\lib\jansi-native\windows64
C:\apache-maven-3.5.0\lib\jansi-native\windows64\jansi.dll
C:\apache-maven-3.5.0\lib\javax.inject-1.jar
C:\apache-maven-3.5.0\lib\jcl-over-slf4j-1.7.22.jar
C:\apache-maven-3.5.0\lib\jcl-over-slf4j.license
C:\apache-maven-3.5.0\lib\jsr250-api-1.0.jar
C:\apache-maven-3.5.0\lib\jsr250-api.license
C:\apache-maven-3.5.0\lib\maven-artifact-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-artifact.license
C:\apache-maven-3.5.0\lib\maven-builder-support-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-builder-support.license
C:\apache-maven-3.5.0\lib\maven-compat-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-compat.license
C:\apache-maven-3.5.0\lib\maven-core-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-core.license
C:\apache-maven-3.5.0\lib\maven-embedder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-embedder.license
C:\apache-maven-3.5.0\lib\maven-model-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-model-builder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-model-builder.license
C:\apache-maven-3.5.0\lib\maven-model.license
C:\apache-maven-3.5.0\lib\maven-plugin-api-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-plugin-api.license
C:\apache-maven-3.5.0\lib\maven-repository-metadata-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-repository-metadata.license
C:\apache-maven-3.5.0\lib\maven-resolver-api-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-api.license
C:\apache-maven-3.5.0\lib\maven-resolver-connector-basic-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-connector-basic.license
C:\apache-maven-3.5.0\lib\maven-resolver-impl-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-impl.license
C:\apache-maven-3.5.0\lib\maven-resolver-provider-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-resolver-provider.license
C:\apache-maven-3.5.0\lib\maven-resolver-spi-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-spi.license
C:\apache-maven-3.5.0\lib\maven-resolver-transport-wagon-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-transport-wagon.license
C:\apache-maven-3.5.0\lib\maven-resolver-util-1.0.3.jar
C:\apache-maven-3.5.0\lib\maven-resolver-util.license
C:\apache-maven-3.5.0\lib\maven-settings-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-settings-builder-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-settings-builder.license
C:\apache-maven-3.5.0\lib\maven-settings.license
C:\apache-maven-3.5.0\lib\maven-shared-utils-3.1.0.jar
C:\apache-maven-3.5.0\lib\maven-shared-utils.license
C:\apache-maven-3.5.0\lib\maven-slf4j-provider-3.5.0.jar
C:\apache-maven-3.5.0\lib\maven-slf4j-provider.license
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.inject-0.3.3.jar
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.inject.license
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.plexus-0.3.3.jar
C:\apache-maven-3.5.0\lib\org.eclipse.sisu.plexus.license
C:\apache-maven-3.5.0\lib\plexus-cipher-1.7.jar
C:\apache-maven-3.5.0\lib\plexus-cipher.license
C:\apache-maven-3.5.0\lib\plexus-component-annotations-1.7.1.jar
C:\apache-maven-3.5.0\lib\plexus-component-annotations.license
C:\apache-maven-3.5.0\lib\plexus-interpolation-1.24.jar
C:\apache-maven-3.5.0\lib\plexus-interpolation.license
C:\apache-maven-3.5.0\lib\plexus-sec-dispatcher-1.4.jar
C:\apache-maven-3.5.0\lib\plexus-sec-dispatcher.license
C:\apache-maven-3.5.0\lib\plexus-utils-3.0.24.jar
C:\apache-maven-3.5.0\lib\plexus-utils.license
C:\apache-maven-3.5.0\lib\slf4j-api-1.7.22.jar
C:\apache-maven-3.5.0\lib\slf4j-api.license
C:\apache-maven-3.5.0\lib\wagon-file-2.12.jar
C:\apache-maven-3.5.0\lib\wagon-file.license
C:\apache-maven-3.5.0\lib\wagon-http-2.12-shaded.jar
C:\apache-maven-3.5.0\lib\wagon-http.license
C:\apache-maven-3.5.0\lib\wagon-provider-api-2.12.jar
C:\apache-maven-3.5.0\lib\wagon-provider-api.license
C:\apache-maven-3.5.0\LICENSE
C:\apache-maven-3.5.0\NOTICE
C:\apache-maven-3.5.0\README.txt

3.代码优化

下面,修改代码,实现层级打印,其实就是利用制表符实现。

package io;

import java.io.File;
import java.util.Scanner;

public class Test8 {
	
	/**
	 * 题目:把文件夹下文件和文件夹按层级打印(linux中树形打印)
	 * 分析
	 * @param args
	 * 1.获取所有文件夹和文件,存储在File数组中
	 * 2.遍历数组
	 * 3.无论是文件还是文件夹都需要打印
	 * 4.如果是文件夹,递归调用
	 */

	public static void main(String[] args) {
		File dir = getDir();
		printDir(dir,0);
	}
	
	public static void printDir(File dir,int level) {
		//1.获取所有文件夹和文件,存储在File数组中
		File[] subFiles = dir.listFiles();
		//2.遍历数组
		for (File subfile : subFiles) {
			//3.无论是文件还是文件夹都需要打印
			for (int i = 0; i <= level; i++) {
				System.out.print("\t");
			}
			System.out.println(subfile);
			//4.如果是文件夹,递归调用
			if(subfile.isDirectory()) {
				printDir(subfile,level + 1);
			}
		}
		
	}
	
	
	/**
	 * 获取文件夹路径
	 * @return
	 */
	public static File getDir () {
		//创建键盘录入对象
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个文件路径。");
		
		while(true) {
			String line = sc.nextLine();          //键盘录入文件夹路径存储
			File dir = new File(line);            //封装file对象
			
			//判断
			if( !dir.exists()) {
				System.out.println("你输入的文件夹路径不存在,请重新输入。");
			}else if(dir.isFile()) {
				System.out.println("你输入的是一个文件的路径,请换成文件夹路径");
			}else {
				return dir;
			}
		}
	}
	
}

继续测试打印maven层级效果。

请输入一个文件路径。
C:\apache-maven-3.5.0
	C:\apache-maven-3.5.0\bin
		C:\apache-maven-3.5.0\bin\m2.conf
		C:\apache-maven-3.5.0\bin\mvn
		C:\apache-maven-3.5.0\bin\mvn.cmd
		C:\apache-maven-3.5.0\bin\mvnDebug
		C:\apache-maven-3.5.0\bin\mvnDebug.cmd
		C:\apache-maven-3.5.0\bin\mvnyjp
	C:\apache-maven-3.5.0\boot
		C:\apache-maven-3.5.0\boot\plexus-classworlds-2.5.2.jar
	C:\apache-maven-3.5.0\conf
		C:\apache-maven-3.5.0\conf\logging
			C:\apache-maven-3.5.0\conf\logging\simplelogger.properties
		C:\apache-maven-3.5.0\conf\settings.xml
		C:\apache-maven-3.5.0\conf\toolchains.xml
	C:\apache-maven-3.5.0\lib
		C:\apache-maven-3.5.0\lib\aopalliance-1.0.jar
		C:\apache-maven-3.5.0\lib\cdi-api-1.0.jar
		C:\apache-maven-3.5.0\lib\cdi-api.license
		C:\apache-maven-3.5.0\lib\commons-cli-1.4.jar
		C:\apache-maven-3.5.0\lib\commons-cli.license
		C:\apache-maven-3.5.0\lib\commons-io-2.5.jar
		C:\apache-maven-3.5.0\lib\commons-io.license
		C:\apache-maven-3.5.0\lib\commons-lang3-3.5.jar
		C:\apache-maven-3.5.0\lib\commons-lang3.license
		C:\apache-maven-3.5.0\lib\ext
			C:\apache-maven-3.5.0\lib\ext\README.txt
		C:\apache-maven-3.5.0\lib\guava-20.0.jar
		C:\apache-maven-3.5.0\lib\guice-4.0-no_aop.jar
		C:\apache-maven-3.5.0\lib\jansi-1.13.jar
		C:\apache-maven-3.5.0\lib\jansi-native
			C:\apache-maven-3.5.0\lib\jansi-native\linux32
				C:\apache-maven-3.5.0\lib\jansi-native\linux32\libjansi.so
			C:\apache-maven-3.5.0\lib\jansi-native\linux64
				C:\apache-maven-3.5.0\lib\jansi-native\linux64\libjansi.so
			C:\apache-maven-3.5.0\lib\jansi-native\osx
				C:\apache-maven-3.5.0\lib\jansi-native\osx\libjansi.jnilib
			C:\apache-maven-3.5.0\lib\jansi-native\README.txt
			C:\apache-maven-3.5.0\lib\jansi-native\windows32
				C:\apache-maven-3.5.0\lib\jansi-native\windows32\jansi.dll
			C:\apache-maven-3.5.0\lib\jansi-native\windows64
				C:\apache-maven-3.5.0\lib\jansi-native\windows64\jansi.dll
		C:\apache-maven-3.5.0\lib\javax.inject-1.jar
		C:\apache-maven-3.5.0\lib\jcl-over-slf4j-1.7.22.jar
		C:\apache-maven-3.5.0\lib\jcl-over-slf4j.license
		C:\apache-maven-3.5.0\lib\jsr250-api-1.0.jar
		C:\apache-maven-3.5.0\lib\jsr250-api.license
		C:\apache-maven-3.5.0\lib\maven-artifact-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-artifact.license
		C:\apache-maven-3.5.0\lib\maven-builder-support-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-builder-support.license
		C:\apache-maven-3.5.0\lib\maven-compat-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-compat.license
		C:\apache-maven-3.5.0\lib\maven-core-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-core.license
		C:\apache-maven-3.5.0\lib\maven-embedder-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-embedder.license
		C:\apache-maven-3.5.0\lib\maven-model-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-model-builder-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-model-builder.license
		C:\apache-maven-3.5.0\lib\maven-model.license
		C:\apache-maven-3.5.0\lib\maven-plugin-api-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-plugin-api.license
		C:\apache-maven-3.5.0\lib\maven-repository-metadata-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-repository-metadata.license
		C:\apache-maven-3.5.0\lib\maven-resolver-api-1.0.3.jar
		C:\apache-maven-3.5.0\lib\maven-resolver-api.license
		C:\apache-maven-3.5.0\lib\maven-resolver-connector-basic-1.0.3.jar
		C:\apache-maven-3.5.0\lib\maven-resolver-connector-basic.license
		C:\apache-maven-3.5.0\lib\maven-resolver-impl-1.0.3.jar
		C:\apache-maven-3.5.0\lib\maven-resolver-impl.license
		C:\apache-maven-3.5.0\lib\maven-resolver-provider-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-resolver-provider.license
		C:\apache-maven-3.5.0\lib\maven-resolver-spi-1.0.3.jar
		C:\apache-maven-3.5.0\lib\maven-resolver-spi.license
		C:\apache-maven-3.5.0\lib\maven-resolver-transport-wagon-1.0.3.jar
		C:\apache-maven-3.5.0\lib\maven-resolver-transport-wagon.license
		C:\apache-maven-3.5.0\lib\maven-resolver-util-1.0.3.jar
		C:\apache-maven-3.5.0\lib\maven-resolver-util.license
		C:\apache-maven-3.5.0\lib\maven-settings-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-settings-builder-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-settings-builder.license
		C:\apache-maven-3.5.0\lib\maven-settings.license
		C:\apache-maven-3.5.0\lib\maven-shared-utils-3.1.0.jar
		C:\apache-maven-3.5.0\lib\maven-shared-utils.license
		C:\apache-maven-3.5.0\lib\maven-slf4j-provider-3.5.0.jar
		C:\apache-maven-3.5.0\lib\maven-slf4j-provider.license
		C:\apache-maven-3.5.0\lib\org.eclipse.sisu.inject-0.3.3.jar
		C:\apache-maven-3.5.0\lib\org.eclipse.sisu.inject.license
		C:\apache-maven-3.5.0\lib\org.eclipse.sisu.plexus-0.3.3.jar
		C:\apache-maven-3.5.0\lib\org.eclipse.sisu.plexus.license
		C:\apache-maven-3.5.0\lib\plexus-cipher-1.7.jar
		C:\apache-maven-3.5.0\lib\plexus-cipher.license
		C:\apache-maven-3.5.0\lib\plexus-component-annotations-1.7.1.jar
		C:\apache-maven-3.5.0\lib\plexus-component-annotations.license
		C:\apache-maven-3.5.0\lib\plexus-interpolation-1.24.jar
		C:\apache-maven-3.5.0\lib\plexus-interpolation.license
		C:\apache-maven-3.5.0\lib\plexus-sec-dispatcher-1.4.jar
		C:\apache-maven-3.5.0\lib\plexus-sec-dispatcher.license
		C:\apache-maven-3.5.0\lib\plexus-utils-3.0.24.jar
		C:\apache-maven-3.5.0\lib\plexus-utils.license
		C:\apache-maven-3.5.0\lib\slf4j-api-1.7.22.jar
		C:\apache-maven-3.5.0\lib\slf4j-api.license
		C:\apache-maven-3.5.0\lib\wagon-file-2.12.jar
		C:\apache-maven-3.5.0\lib\wagon-file.license
		C:\apache-maven-3.5.0\lib\wagon-http-2.12-shaded.jar
		C:\apache-maven-3.5.0\lib\wagon-http.license
		C:\apache-maven-3.5.0\lib\wagon-provider-api-2.12.jar
		C:\apache-maven-3.5.0\lib\wagon-provider-api.license
	C:\apache-maven-3.5.0\LICENSE
	C:\apache-maven-3.5.0\NOTICE
	C:\apache-maven-3.5.0\README.txt

上面需要注意每一个子文件夹调用层级打印方法,里面参数的level是不一样,这个值决定了打印几个制表符。我们调用输入参数0,表示第一层目录只打印一个制表符。

猜你喜欢

转载自blog.csdn.net/u011541946/article/details/81814077