java之20天 File对象(二)

过滤获取指定后缀的文件
输出文件目录列表
递归
删除文件

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * File 获取
 * String[] list():获取指定目录中的所有文件和目录的名称
 * String[] list(FileNameFilter fnf): 获取指定目录中,过滤后的文件 或目录名称
 * File[] listFiles():获取指定目录下的所有文件 和 目录对象  
 * 
 * --递归---
 * 需求:
 * 列出制定目录下的文件或者文件夹,包含子目录中的内容,也就是列出指定目录下的所有内容.
 * 
 * 因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可.函数 中 还需要调用自己,这样我们就称为 "递归"
 * 递归要注意点的是 
 *  1.限定条件
 *  2.注意递归的次数,尽量避免内存溢出
 *  
 * ---删除一个带内容的目录--- java删除是不走回收站,注意确定
 * 删除的原理
 * 在window中,删除目录从里面往外删除.
 * 既然是从里往外删除,就需要用到递归了.  
 * 
 * ---建立指定目录下的java文件的绝对路径,存储到一个文本文件
 * 建议一个java文件列表文件
 * 
 * 思路:
 *   1.对指定的目录进行递归
 *   2.获取递归过程素有的java文件路径
 *   3.将这些路径存储的到指定的集合中
 *   4.将集合中的数据写入如到一个文件中.
 *
 */
public class FileDemo2 {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		System.out.println("========过滤查找===========");
		//acceptFile();
		//listFile();
		System.out.println("========遍历所有文件和目录===========");
		/*File dir=new File("D:\\明天");
		showDir(dir,0);*/
		System.out.println("========递归===========");
		//toBin(6);   还需要逆转 输出
		//toBin_1(6);
		//getSum(3);  //6
		
		/*System.out.println("========删除文件===========");
		File dir=new File("E:\\kankan");
		removeDir(dir);*/
		
		File dir=new File("D:\\me");
		List<File> list=new ArrayList<File>();
		fileToList(dir,list);
		System.out.println(list.size());
		File file=new File(dir,"javaList.txt");
		writeToFile(list,file.toString());
	}
	public static void fileToList(File dir,List<File> list){
		File [] files=dir.listFiles();
		for(File file:files){
			if(file.isDirectory())
				fileToList(file,list);
			else{
				if(file.getName().endsWith(".txt"))
					list.add(file);
			}
				
		}
	}
	
	public static void writeToFile(List<File> list,String javaListFile) throws IOException{
		BufferedWriter bufw=null;
		try{
			bufw=new BufferedWriter(new FileWriter(javaListFile));
			for(File f:list){
				String abspath=f.getAbsolutePath();
				bufw.write(abspath);
				bufw.newLine();
				bufw.flush();
			}
		}catch(IOException e){
			throw e;
		}finally{
			try{
				if(bufw!=null)
					bufw.close();
			}catch(IOException e){
				throw e;
			}
		}
		
	}
	
	//删除文件
	public static void removeDir(File dir){
		File[] files=dir.listFiles();
		for (File file : files) {
			//不是隐藏 并且还是目录
			if(!file.isHidden()&&file.isDirectory())
				removeDir(file);
			else
				System.out.println(file.getName()+"::"+file.delete());
		}
		System.out.println(dir.getName()+"::dir::"+dir.delete());
	}
	
	
	//求和 
	public static int getSum(int n){
		if(n==1)
			return 1;
		return n+getSum(n-1);
	}
	//现在 采用 递归
	public static void toBin_1(int num){
		if(num>0){
			toBin_1(num/2);
			System.out.print(num%2);
			
		}
	}
	
	//以前转二进制 
	public static void toBin(int num){
		while(num>0){
			System.out.print(num%2);
			num=num/2;
		}
	}
	
	
	/**
	 * 列出所有目录结构
	 */
	public static void showDir(File dir,int space){
		getLever(space);
		System.out.println(dir);
		space++;
		File[] file=dir.listFiles();
		for(File f:file){
			if(f.isDirectory())
				showDir(f,space);
			else{
				getLever(space);
				System.out.println(f.getName());
			}
			
		}
	}
	
	private static void getLever(int space){
		for (int i = 0; i < space; i++) {
			System.out.print("  ");
		}
		System.out.print("|--");
	}
	

	/**
	 * 获取目录下的所有文件对象 ,这样可以进行其他的操作
	 * 如果使用list() 只能获取文件和目录的名称
	 */
	public static void listFile(){
		File dir=new File("c:\\");
		File[] files=dir.listFiles();
		for(File f:files){
			System.out.println(f.getName()+"::"+f.length());
		}
	}
	
	/**
	 * 过滤制定文件夹中的 指定的后缀名的文件
	 */
	public static void acceptFile(){
		File dir=new File("C:\\");
		String[] arr=dir.list(new FilenameFilter() {
			
			@Override
			public boolean accept(File dir, String name) {
				// TODO Auto-generated method stub
				return name.endsWith(".jpg");
			}
		});
		
		System.out.println(arr.length);
		for(String name:arr){
			System.out.println(name);
		}
		
		
	}
	
	
}



属性文件的读取和输出
/**
 * Properties是hashTable的子类
 * 也就是说他是具备Map集合的特点,而且他里面存储的都是字符串.
 * 
 * 是集合中和IO技术相结合的集合容器
 * 该对象的特点是:可以使用键值对形式的配置文件.
 * 
 * 
 * 需求:
 *   用于记录应用程序运行的次数
 *   如果使用次数已到,那么给出注册提示
 *   
 *   很容易想到计数器:
 *   可是该计数器定义在应用程序中,随着程序的运行而在内存中存在,并进行自增.
 *   可是随着该应用程序的退出,该计数器也在内存中消失了,程序下次启动又重新开始从0计数了.
 *   
 *   
 *   
 */
public class PropertiesDemo {
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		//setAndGet();
		System.out.println("========自定义方法加载文件到properites中===========");
		//method_1();
		System.out.println("========使用字节流加载数据到===========");
		//loadDemo();
		
		System.out.println("========注册使用次数的控制============");
		useTimes();
	}
	//模拟 注册
	public static void useTimes() throws IOException{
		Properties prop=new Properties();
	
		File file=new File("E:\\count.ini");
		if(!file.exists())
			file.createNewFile();
		FileInputStream fis=new FileInputStream(file);
		prop.load(fis);
		String value=prop.getProperty("time");
		int count=0;
		if(value!=null){
			count=Integer.parseInt(value);
			if(count>=5){
				System.out.println("您好,使用次数已到,拿钱!");
				return;
			}
		}
		count++;
		prop.setProperty("time", count+"");
		
		FileOutputStream fos=new FileOutputStream(file);
		prop.store(fos, "");
		fos.close();
		fis.close();
	}
	
	
	//loadDemo
	// 加载 字节流 都是早期的,加载 字符流 1.6 才开始.
	public static void loadDemo() throws IOException{
		Properties prop=new Properties();
		FileInputStream fis=new FileInputStream("E:\\info.txt");
		prop.load(fis);
		fis.close();
		System.out.println(prop);
		prop.list(System.out);
		prop.setProperty("wangwu", "39");
		
		FileOutputStream fos=new FileOutputStream("E:\\info.txt");
		prop.store(fos, "author");
		fos.close();
		
	}
	
   /**
    * 演示,如果将流中的数据存储到集合中.
    * 将要将Info.txt中的键值对数据存储到集合中进行操作.
    * @throws IOException 
    */
	public static void method_1() throws IOException{
		BufferedReader bufr=new BufferedReader(new FileReader("E:\\info.txt"));
		
		Properties prop=new Properties();
		String line=null;
		while((line=bufr.readLine())!=null){
			String[] arr=line.split("=");
			//System.out.println(arr[0]+"..."+arr[1]);
			prop.setProperty(arr[0], arr[1]);
		}
		bufr.close();
		System.out.println(prop);
	}
	
	
	//设置和获取元素
	public static void setAndGet(){
		Properties prop=new Properties();
		
		prop.setProperty("zhangsan", "30");
		prop.setProperty("lisi", "39");
		
		System.out.println(prop);
		prop.setProperty("lisi", "89");
		String value=prop.getProperty("lisi");
		System.out.println(value);
		
		Set<String> names=prop.stringPropertyNames();
		for(String s:names){
			System.out.println(s+":"+prop.getProperty(s));
			
		}
		
		
		
		
	}
}

你可能感兴趣的:(递归,FilenameFilter)