106.文件夹操作实例

递归打印文件及绝对路径
package cn.yzy.IO;

import java.io.File;

public class recursionPrintDiectory {
	public static void main(String[] args) {
		File dir = new File("E:/源库/源代码/Java/IO_test/src");
//		recursionPrintDirect(dir);
		recursionPrintName(dir, 0);
	}
	
	//打印绝对路径
	public static void recursionPrintDirect(File dir){
		System.out.println(dir.getAbsolutePath());
		//列出下一级目录对象
		if(dir.isDirectory()) {
			File[] subFiles = dir.listFiles();
			if(subFiles.length == 0)
				return ;
			//打印名称
			for(File f: subFiles) {
				recursionPrintDirect(f);
			}
			System.out.println();
		}else {
			return;
		}
	}
	
	//打印名称及绝对路径
	public static void recursionPrintName(File dir, int deep){
		for(int i=deep; i>0; --i)
			System.out.print("-");
		System.out.println(dir.getName());
		System.out.println(dir.getAbsolutePath());
		if(dir.isDirectory()) {
			File[] subFiles = dir.listFiles();
			if(subFiles.length == 0)
				return ;
			//打印名称
			for(File f: subFiles) {
				recursionPrintName(f, deep+1);
			}
			System.out.println();
		}else {
			return;
		}
	}
}

打印结果(已验证结果正确):

设计一个类,使得在创建对象的同时计算文件夹大小以及文件夹的文件个数

package cn.yzy.IO;

import java.io.File;

public class OOrecursionGetFolderSizeAndFileNums {
private long len; //大小
	
	private String dirPathString; //路径
	
	private File src;
	
	private long fileNum;

	public OOrecursionGetFolderSizeAndFileNums(String dirPathString) {
		super();
		this.dirPathString = dirPathString;
		this.src = new File(dirPathString);
		count(this.src);
	}
	
	public void count(File src) {
		if(src == null)
			return;
		//获取大小
		if(src != null && src.exists()) {
			if(src.isFile()) {
				len+=src.length();
				fileNum++;
			}
			else
				for(File f: src.listFiles())
					count(f);
		}
	}

	public long getLen() {
		return len;
	}
	
	public long getNumOfFiles() {
		return fileNum;
	}
	
	public String getdirPathString() {
		return dirPathString;
	}
	
	public static void main(String[] args) {
		//创建对象的同时计算文件夹大小以及文件夹的文件个数
		OOrecursionGetFolderSizeAndFileNums dirCount = new OOrecursionGetFolderSizeAndFileNums("E:/源库/源代码/Java/IO_test/src");
		
		System.out.println("绝对路径:" + dirCount.getdirPathString());
		System.out.println("size: " + dirCount.getLen());
		System.out.println("文件个数:" + dirCount.getNumOfFiles());
	}
}

打印结果:

与电脑本地的文件夹对比发现文件夹的总大小和所包含的文件个数相同,符合预期



在以上类的基础上实现单例模式(属于单例模式的懒汉模式),通过设置路径不断获取新的路径下的子目录的文件夹和文件绝对路径和大小以及包含的文件个数的功能

package cn.yzy.IO;

import java.io.File;

/*
 * 面向对象:统计文件加大小
 */
public class OOrecursionCaculateFileSize {
	
	private long len; //大小
	
	private String dirPathString; //路径
	
	private File src;
	
	private long fileNum;

	public OOrecursionCaculateFileSize(String dirPathString) {
		super();
		this.dirPathString = dirPathString;
		this.src = new File(dirPathString);
		count(this.src);
	}
	
	public void count(File src) {
		if(src == null)
			return;
		//获取大小
		if(src != null && src.exists()) {
			if(src.isFile()) {
				len+=src.length();
				fileNum++;
			}
			else
				for(File f: src.listFiles())
					count(f);
		}
	}

	public long getLen() {
		return len;
	}
	
	public long getNumOfFiles() {
		return fileNum;
	}
	
	public String getdirPathString() {
		return dirPathString;
	}
	
	private static final OOrecursionCaculateFileSize ff = new OOrecursionCaculateFileSize("E:/源库");
	
	public void setSrc(File f) {
		fileNum = 0;
		len = 0;
		src = f;
		count(src);
		dirPathString = f.getAbsolutePath();
	}
	
	//递归获取所有文件绝对路径和大小
	public static void AllFiles(String str) {
		File file = new File(str);
		File[] subFile = file.listFiles();
		if(subFile == null)
			return ;
		
		for(int i = 0; i<subFile.length; ++i) {
			System.out.println();
			ff.setSrc(subFile[i]);
			System.out.println("绝对路径:" + ff.getdirPathString());
			System.out.println("size: " + ff.getLen());
			System.out.println("文件个数:" + ff.getNumOfFiles());
			
			String[] subStrings = subFile[i].list();
			if(subStrings != null)
				for(String s: subStrings)
					AllFiles(s);
		}
	}
	
	//打印文件夹或者文件的名称及绝对路径和大小
	public static void recursionPrintFolderAndFile(File dir, int deep){
		//打印文件夹或者文件的名称和绝对路径
		System.out.println();
		System.out.print("文件夹或文件名: ");
		for(int i=deep; i>0; --i)
			System.out.print("-");
		System.out.println(dir.getName());
		ff.setSrc(dir);
		System.out.println("绝对路径:" + ff.getdirPathString());
		
		//继续获取子路径
		if(dir.isDirectory()) {
			//打印文件夹大小
			System.out.println("大小: "+ ff.getLen());
			System.out.println("文件个数:" + ff.getNumOfFiles());
			
			File[] subFiles = dir.listFiles();
			if(subFiles.length == 0)
				return ;
			
			for(File f: subFiles)
				recursionPrintFolderAndFile(f, deep+1);
		}else {
			//打印文件大小
			System.out.println("size: "+dir.length());
			return;
		}
	}
	
	public static void main(String[] args) {
		//创建对象的同时计算文件夹大小以及文件夹的文件个数
		OOrecursionCaculateFileSize dirCount = new OOrecursionCaculateFileSize("E:/源库/源代码/Java/IO_test/src");
		System.out.println(dirCount.getLen());
		System.out.println("_____________________________________");
		
		//递归获取所有文件绝对路径和大小
		AllFiles("E:/源库/源代码/Java/IO_test");
		
		//打印文件夹或者文件的名称及绝对路径和大小
		System.out.println("_____________________________________");
		File dir = new File("E:/源库/源代码/Java/IO_test/src/cn");
		recursionPrintFolderAndFile(dir, 0);
	}
}

结果:

通过与本地文件对比发现符合预期,程序正确

猜你喜欢

转载自blog.csdn.net/qq_43808700/article/details/107495156