1.Properties

 

Properties不是一个流,而是作为Map双列集合使用。由于以后用它固定的作用:作为作配置文件,会和流有关联,所以这里说一下。值得注意的是:虽然是个双列集合,但是没有泛型,属性列表中的每一个键和其对应值都是一个字符串。

Properties是Hashtable的子类。Properties类表示了一个持久的属性集;可保存在流中或从流中加载。

Properties的特殊功能:

 

public Object setProperty(String key,String value)---设置键和值

public String getProperty(String key)---根据键获取值

public Enumeration<String> stringPropertyNames()---拿到所有键存到枚举中,用于遍历

 

public static void main(String[] args) {
	Properties prop = new Properties();
	prop.setProperty("name", "小明");
	prop.setProperty("tel", "13312341234");
	
	Enumeration<String> en = (Enumeration<String>) prop.propertyNames();
	
	while(en.hasMoreElements()) {
		String key = en.nextElement();	//获取Properties中的每一个键
		String value = prop.getProperty(key);	//根据键获取值
		System.out.println(key+"="+value);
	}
}

        上面的操作都是在内存中进行的,而Properties是配合着配置文件使用的。但是实际上配置文件都是在硬盘中,所以两者的交互就和IO流有了关联,用到了Properties的load()和store()方法

 

常用的重载load()方法有:load(InputStream inStream)        load(Reader reader)

常用的store()方法:store(OutputStream out,String comments)        store(Writer writer,String comments)

 

public static void main(String[] args) throws FileNotFoundException, IOException {
	
	Properties prop = new Properties();
	System.out.println("读取前"+prop);
	
	prop.load(new FileInputStream("config.properties"));//加载配置文件
	
	prop.setProperty("tel", "18888888888");//修改配置文件中的tel键的键值对,现在只是在内存中修改
	
	prop.store(new FileOutputStream("config.properties"), null);//把硬盘中的配置文件也修改,相当于更新同步一下啊
								   //第二个参数是用来描述文件列表的,如果不描述可以传null
		
		
}

2.File递归练习

 

(1)统计文件夹的大小

public static long getFileLength(File dir) {
	//1.定义一个求和变量
	long len  = 0 ;
	//2.获取文件夹下所有文件和文件夹
	File [] subFiles = dir.listFiles();
	//3.遍历数组
	for (File file : subFiles) {
		//4.判断是文件,就累加
		if(file.isFile()) {
			len = len + file.length();
		}else {
			//5.判断是文件夹,就递归调用
			len  = len + getFileLength(file);
		}
	}	
	return len;
}

文件夹路径调用length()方法会返回0,所以不能直接用文件夹路径调用该方法统计大小

 

(2)删除文件夹

public static void deleteFile(File dir) {
	//获取文件夹下所有文件和文件夹
	File [] subFiles = dir.listFiles();
	//遍历数组
	for (File file : subFiles) {
		//判断是文件,就删除
		if(file.isFile()) {
			file.delete();
		}else {
			//判断是文件夹,就递归调用
			deleteFile(file);
		}
	}
	//循环结束后,删除空的文件加
	dir.delete();	
}

 (3)把路径下的所有文件和文件夹按层级打印

public static void printFile(File dir,int lev) {
	//获取文件夹下所有文件和文件夹
	File [] subFiles = dir.listFiles();
	//遍历数组
	for (File file : subFiles) {
		for(int i = 0;i<=lev;i++) {
			System.out.print("\t");
		}
		//首先都要打印当前路径
		System.out.println(file);
		//如果是文件加就递归调用
		if(file.isDirectory()) {
			printFile(file,lev+1);
		}
	}