IO流4(Properties集和)

对指定目录进行所有内容的列出(包含子目录中的内容)

/*
需求:对指定目录进行所有内容的列出(包含子目录中的内容)
也可以理解为深度遍历 */
public static void demo(){
    File dir = new File("C:/Users/13173/Desktop/recent paper/");
    listAll(dir);
}
public static void listAll(File dir){
    //获取指定目录下当前的所有文件夹或者文件对象
    System.out.println("dir:"+dir.getName());
    File[] files = dir.listFiles();
    for(int x=0;x<files.length;x++){
        if(files[x].isDirectory()){
            listAll(files[x]); 
        }
        else
            System.out.println("file:"+files[x].getAbsolutePath());
    }
}

递归

/**
 * 递归:函数直接或间接调用到自身
 * 
 * 一个功能在被重复使用,并每次使用时参与运算的结果跟上次调用有关,这时可以用递归解决问题
 * 注意:
 * 递归一定要明确条件,否则容易栈溢出
 * 注意一下递归的次数
 */
public static void toBin(int num){
    if(num>0){
        System.out.println(num%2);
        num = num/2;
        toBin(num);
    }
}
public static int getSum(int num){
    if(num==1)
        return 1;
    return num+getSum(num-1);
}
//删除一个带内容的目录
/**
 * 原理:必须从最里面往外删
 */
public static void removeDir(File dir){
    File[] files = dir.listFiles();
    for(File file:files){
        if(file.isDirectory()){
            removeDir(file);
        }
        else
            file.delete();
    }
}

Properties集和的存和取(存放键值对)

/*
Map
    |--Hashtable
        |--Properties
Properties集和:
    特点:
    1.该集和中的键和值都是字符串类型
    2.集和中的数据可以保存到流中,或者从流获取。

    通常该集和用于操作以键值对形式存在的配置文件。
 */
/**
 * Properties集和的存和取
 */
public static void propertiesDemo(){
    //创建一个properties集和
    Properties prop = new Properties();
    //存储元素
    prop.setProperty("pp", "24");
    prop.setProperty("zz", "24");
    prop.setProperty("ww", "2");
    //修改元素
    prop.setProperty("zz", "23");//键相同,值覆盖
    //取出所有元素
    Set<String> names = prop.stringPropertyNames();
    for(String name:names){
        String value = prop.getProperty(name);
        System.out.println(name+":"+value);
    }
}
//演示properties集和和流对象相结合的功能
public static void demo(){
    //创建一个properties集和
    Properties prop = new Properties();
    //存储元素
    prop.setProperty("pp", "24");
    prop.setProperty("zz", "24");
    prop.setProperty("ww", "2");
    prop.list(System.out);
    // -- listing properties --
    // pp=24
    // zz=24
    // ww=2
}

properties集和的store方法
将集和中的内容存入文件中

//将集和中的内容存入文件中
public static void demo2() throws FileNotFoundException,IOException{
    //创建一个properties集和
    Properties prop = new Properties();
    //存储元素
    prop.setProperty("pp", "24");
    prop.setProperty("zz", "24");
    prop.setProperty("ww", "2");
    //将这些集和中的字符串键值信息持久化存储到文件中,需要关联输出流
    FileOutputStream fos = new FileOutputStream("F:/buf1.txt");
    //将集和中数据存储到文件中,使用store方法
    prop.store(fos, "name+age");
    fos.close();
    // #name+age
    // #Thu Mar 11 19:30:51 CST 2021
    // pp=24
    // zz=24
    // ww=2
}

集和中的内容来自文件(从流中获取)

//集和中的内容来自文件(从流中获取)
//注意:必须要保证该文件中的数据是键值对
public static void demo3() throws FileNotFoundException,IOException{
    Properties prop = new Properties();
    //需要使用读取流
    FileInputStream fis = new FileInputStream("F:/buf1.txt");
    //使用load方法
    prop.load(fis);
    prop.list(System.out);
    // -- listing properties --
    // pp=24
    // zz=24
    // ww=2
}

模拟load方法

//模拟load方法
public static void load_demo() throws FileNotFoundException,IOException{
    Properties prop = new Properties();
    BufferedReader bufr = new BufferedReader(new FileReader("F:/buf1.txt"));
    String line = null;
    while((line=bufr.readLine())!=null){
        if(line.startsWith("#"))
            continue;
        String[] arr = line.split("=");
        System.out.println(arr[0]+":"+arr[1]);
        prop.setProperty(arr[0],arr[1]);
    }
    prop.list(System.out);
    // bufr.close();
}

对已有配置文件中的信息进行修改

//对已有配置文件中的信息进行修改
public static void propModify() throws FileNotFoundException,IOException{
    /**
     * 读取这个文件
     * 并将这个文件的键值信息存储到集和中
     * 通过集和对数据进行修改
     * 通过流将修改后的数据存储到文件中
     */
    File file = new File("F:/buf1.txt");
    //如果这个文件不存在
    if(!file.exists()){
        //创建这个文件
        file.createNewFile();
    }
    FileReader fr = new FileReader("F:/buf1.txt");
    //创建存储配置信息的集和
    Properties prop = new Properties();
    //将流中信息存到集和中
    prop.load(fr);
    prop.list(System.out);
    prop.setProperty("dd", "26");
    //写入流
    FileWriter fw = new FileWriter("F:/buf1.txt");
    prop.store(fw, "");
    fr.close();
    fw.close();
}

properties练习

/**
* 定义功能:获取一个应用程序运行的次数,如果超过5次,给出使用次数已到的请注册的提示,请不要再运行程序
* 思路:
* 1.计数器
* 每次程序启动都需要计数一次,并且是在原有的计数上进行计数。
* 2.计数器就是一个变量,程序启动时进行计数,计数器必须存在于内存中并进行运算。
* 可程序一结束,计数器就消失了,再次启动程序,计数器又被初始化了。
* 我们需要多次启动同一个应用程序,使用的是同一个计数器,
* 这需要计数器的生命周期变长,从内存存储到硬盘文件中。
* 3.如何使用计数器
* 程序启动时,先读取用于记录计数器信息的配置文件,获取上一次计数次数
* 并对次数进行判断
* 其次,对该次数进行递增,并自增后的数据重新存储到配置文件中
* 4.文件中的信息该如何存储和体现
* 使用键值对,映射关系map集和搞定,又需要读取键盘上的数据,map+io=properties
*/
public static void getAppCount() throws IOException{
    //将配置文件封装成File对象
    File confile = new File("F:/buf1.txt");
    //如果文件不存在
    if(!confile.exists()){
        confile.createNewFile();
    }
    FileInputStream fis = new FileInputStream(confile);
    Properties prop = new Properties();
    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;
            throw new Error("");
        }
    }
    count++;
    //将改变后的次数重新存储到集和中
    prop.setProperty("time", count+"");
    FileOutputStream fos = new FileOutputStream(confile);
    prop.store(fos, "");
    fos.close();
    fis.close();
}

综合练习–文件清单列表

/**
* 获取指定目录下,指定扩展名的文件(包含子目录)
* 这些文件的绝对路径写入到一个文本文件中
* 简单说:建立一个指定扩展名的文件列表
* 思路:
* 1.必须进行深度遍历。
* 2.过滤器
* 3.对容器中的内容进行遍历,并将绝对路径写入到文件中
*/
public static void demo(File dir,FilenameFilter filter,List<File> list){
   //对指定目录中的内容进行深度遍历,并过滤,存入指定容器
   File[] files = dir.listFiles();
   for(File file:files){
       if(file.isDirectory()){
           //递归取文件
           demo(file,filter,list);
       }else{
           //对遍历到的文件进行过滤
           if(filter.accept(dir, file.getName()));{
               //将符合条件的file存入集和
               list.add(file);
           }
       }
   }
}
public static void write2File(List<File> list,File dstFile){
   BufferedWriter bufw = null;
   try{
       bufw = new BufferedWriter(new FileWriter(dstFile));
       for(File file:list){
           bufw.write(file.getAbsolutePath());
           bufw.newLine();
           bufw.flush();
       }
   }catch(IOException e){
       throw new RuntimeException("写入失败");
   }finally{
       if(bufw!=null){
           try{
               bufw.close();
           }catch(IOException e){
               throw new RuntimeException("关闭识别");
           }
       }
   }
}
//调用
File dir = new File("F:/java视频/");
FilenameFilter filter = new FilenameFilter(){
    public boolean accept(File dir,String name){
        return name.endsWith(".avi");
    }
};
List<File> list = new ArrayList<File>();
demo(dir, filter, list);
File dstFile = new File("F:/java视频/","dst.txt");
write2File(list, dstFile);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值