java笔记25 File类、递归、Properties

1.       File类

File类用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。File对象可以作为参数传递给流的构造函数。

常用方法

1、创建

         boolean  createNewFile()

         如果没有文件,创建成功返回true

         再次创建返回false,即没有覆盖。

         创建文件夹

         f.mkdir();//只能创建一级目录,会创建一个名为file.txt的文件夹

           f.mkdirs();//可以创建多级目录

2、删除

         boolean  delete();

         void deleteOnExit();在程序退出时删除

3、判断

         boolean exists()

                            isFile()

                            isDirectory()

                            isHidden() :是否隐藏,通常不要读取系统隐藏文件

                            isAbsoulute():是否是绝对路径

4、获取

                   getName();返回此抽象路径名表示的文件或目录的名称

                   getPath();将此抽象路径名转换成一个路径名字符串

                   getParent(); 获取父目录路径

                   //该方法返回的是绝对路径中的父目录,因为定义时使用的是file.txt,所以父目录是null

                    //如果相对路径中有上一级目录,则返回该上一级目录

                  getAbsouluteFile()

                   getAbsoulutePath()

                   lastModified():最后一次被修改的时间

                   length(); 文件大小  返回类型是long

                 f.renameTo(f1);//将f的文件名重命名为f1的文件名

   public static void method_5() throws IOException

    {

        File f=new File("file.txt");

        File f1=new File("file2.txt");

        f.renameTo(f1);//将f的文件名重命名为f1的文件名

    }

    public static void method_4() throws IOException

    {

        File f=new File("file.txt");

        f.createNewFile();

       sop("abspath"+f.getAbsolutePath());//D:\shakespace\workspace\Heima\file.txt

        sop("path"+f.getPath());//和new File一样  file.txt

        sop("parent"+f.getParent());//null

        //该方法返回的是绝对路径中的父目录,因为定义时使用的是file.txt,所以父目录是null

        //如果相对路径中有上一级目录,则返回该上一级目录

       

    }

    public static void method_3() throws IOException

    {

        File f=new File("file.txt");

        sop(f.exists());//测试是否存在

        f.mkdir();//只能创建一级目录,会创建一个名为file.txt的文件夹

        //f.mkdirs();//可以创建多级目录

        sop(f.isDirectory());//结果为true

        sop(f.isFile());//结果为false          

    }

    public static void method_2() throws IOException

    {

        File f=new File("H05_10ThisDemo.java");

        sop(f.canExecute());//测试是否可执行  true          

    }

    public static void method_1() throws IOException

    {

        File f=new File("file.txt");

        sop(f.createNewFile());//true

        sop(f.delete());//true

        f.deleteOnExit();//运行结束时删除

    }

public static void consMethod()

{

           //将a.txt封装成file对象,可以将已有和未出现的文件或者文件夹封装成对象

           File f1=new File("D:\\workspace\\a.txt");

           File f2=new File("D:\\workspace\\Heima","b.txt");

           File f3=new File("D:"+File.separator+"workspace"+File.separator+"Heima","b.txt");

           //+File.separator+  具有跨平台性                

         }


 

5、 list():返回目录下的文件和文件夹,包含隐藏文件

import java.io.*;

public class H_05FileDemo2 {

    public static void main(String[] args) {

        listDemo();//获取文件,包含隐藏文件

        listRootsDemo();//得到根目录(CDEF…

    }

    public static void listDemo()

    {

        File f=new File("d:\\");//如果是文件,内部没有内容,会报错。

        String [] names=f.list();      

        for(String namenames)

        {

            sop(name);

        }

    }

    public static void listRootsDemo()

    {

        File[] files=File.listRoots();

        for(File f:files)

        {

            sop(f);//不能直接获得盘符的大小

        }

    }

    public static void sop(Object obj)

    {

        System.out.println(obj);

    }

}


 

2.       递归

需求

列出指定目录下的文件或者文件夹,包含子目录中的内容

也就是列出指定目录下的所有内容

遍历→遇到文件夹→继续遍历

1、因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可

           在列出过程中出现的还是目录的话,还可以再次调用本功能

           也就是函数自身调用自身

           这种表现形式或者变成手法,成为递归

                    关键:函数中调用函数自身。

2、递归的注意点

           2.1 限制循环条件

           2.2 注意递归的次数,防止内存溢出

示例

public static void toBin(int num)

         {

                   if(num>0)

                   {

                            toBin(num/2);

                            sop(num%2);

                   }

         }

         传入6,输出结果是110

         不是011

         因为递归的时候不断在栈内存开辟空间,从最后满足条件的地方开始

         //sum(50000)发生Exception in thread "main" java.lang.StackOverflowError


示例2 显示文件夹中的所有文件      

  public static void showDir(File dir)

    {

        System.out.println(dir);

        File[] files=dir.listFiles();

        for(File s:files)

        {

            if(s.isDirectory())

                showDir(s);

            else

                sop(s);

        }

    }


3.       创建java文件列表文件

/*

    建立一个java文件列表文件

    思路

    1、对指定的目录进行递归

    2、获取递归过程所有的java文件的路径

                public static void fileToList(File dir,List<File> list)

    {

        File[] files=dir.listFiles();

        for(File file:files)//循环file数组

        {

            if(file.isDirectory())//是目录 递归判断

                fileToList(file,list);

            else

            {

                if(file.getName().endsWith("java"))//是文件 判断扩展名

                    list.add(file);//符合添加到list集合中

               

            }

        }

    }

    3、将这些路径存储到集合中

    4、将集合中的数据写入到一个文件中

        存入到硬盘中

    文件来源:内存

    写入目的:硬盘

        写入流:   

 */

package day20;

import java.io.*;

import java.util.*;

public class H_10JavaFileList {

    public static void main(String[] args)

    {

        File dir=new File("D:\\shakespace\\workspace");

        List<File> list=new ArrayList<File>();

        fileToList(dir,list);

        System.out.println(list.size());//获得文件数量     

        writeToFile(list);

    }

    public static void fileToList(File dir,List<File> list)

    {

        File[] files=dir.listFiles();

        for(File file:files)//循环file数组

        {

            if(file.isDirectory())//是目录 递归判断

                fileToList(file,list);

            else

            {

                if(file.getName().endsWith("java"))//是文件 判断扩展名

                    list.add(file);//符合添加到list集合中             

            }

        }

    }

    public static void writeToFile(List<File> list)

    {

        BufferedWriter bufw=null;

       

        try

        {

            bufw=new BufferedWriter(new FileWriter("D:\\shakespace\\workspace\\Heima\\java.txt"));

            for(File f:list)

            {

                String path=f.getAbsolutePath();

                bufw.write(path);

                bufw.newLine();

                bufw.flush();

            }          

        } catch (IOException e) {

        e.printStackTrace();

        }

        finally

        {

            if(bufw!=null)

                try {

                    bufw.close();

                } catch (IOException e) {

                            e.printStackTrace();

                }              

        }

    }

}


 

4.       Properties集合

Properties是hashtable的子类

也就是说它具备map集合的特点,而且它里面存储的都是字符串,不需要加泛型

是集合中和IO技术相结合的集合容器

该对象的特点:可以用于键值对形式的配置文件。

/*

         演示 如何将流中的数据存储到集合中

        将info.txt中键值存到集合中进行操作

        1、用一个流和info.txt文件关联

        2、读取一行数据,将该行数据用“=”切割

        3、等号左边作为键,右边作为值,存入到Properties集合中即可

 */

package day20;

import java.io.*;

import java.util.*;

public class H_11Properties {

         public static void main(String[] args) throws IOException {

                   //setAndGet();

                   method_1();

                   loadDemo();             

         }

         public static void loadDemo() throws IOException

         {

                   Properties prop=new Properties();

                   FileInputStream fis=new FileInputStream("info.txt");

                   //将流中的数据加载进集合

                   prop.load(fis);

                   prop.setProperty("zhangsan", "23");

                   //prop.store(new FileOutputStream("info.txt"), "haha");

                   sop(prop);

                   prop.list(System.out);

                   fis.close();

         }

         public static void method_1() throws IOException

         {

                   BufferedReader bufr=new BufferedReader(new FileReader("info.txt"));

                   String line=null;

                   Properties prop=new Properties();

                   while((line=bufr.readLine())!=null)

                   {

                            //sop(line);

                            String[] arr=line.split("=");

                            //sop(arr[0]+"  "+arr[1]);

                            prop.setProperty(arr[0], arr[1]);

                            //顺序按照哈希表

                   }

                   bufr.close();

                   sop(prop);                          

         }

         //设置和获取对象

         public static void setAndGet()

         {

                   Properties prop=new Properties();

                   prop.setProperty("zhangsan", "30");

                   prop.setProperty("lisi", "39");

                   //System.out.println(prop);

                   String value=prop.getProperty("zhangsan");

                   sop(value);

                   Set<String> names=prop.stringPropertyNames();

                   for(String s:names)

                   {

                            sop(s);

                   }                

         }

         public static void sop(Object obj)

         {

                   System.out.println(obj);

         }

}


需求:获取一个应用程序运行的次数,如果超过5次,给出使用次数已到请注册的提示,并不要再运行程序。

思路:
    1、应该有计数器
    每次程序启动都需要计数一次,并且是在原有的次数上进行计数。
    2、计数器就是一个变量。程序启动时进行计数,计数器必须存在于内存并进行运算。
    可是程序一结束,计数器消失了。那么再次启动该程序,计数器又重新被初始化了。
    而我们需要多次启动同一个应用程序,使用的是同一个计数器。
    这就需要计数器的生命周期边长,从内存存储到硬盘文件中。
    3、如何使用这个计数器呢?
    首先,程序启动时,应该先读取这个用于记录计数器信息的配置文件
    获取上一次计数器次数。并进行使用次数的判断。
    其次,对该次数进行自增,并自增后的次数重新存储到配置文件中
    4、文件中的信息该如何进行存储并体现。
    直接存储次数值可以,但是不明确该数据的含义。所以起名字就变得很重要。
    这就有了名字和值的对应,所以可以使用键值对。
    可是映射关系map集合搞定,又需要读取硬盘上的数据,所以map+io=properties。

        

import java.io.*;

import java.util.*;

public class H_14Properties {

    public static void main(String[] argsthrows IOException {

        Properties prop=new Properties();

        File file=new File("count.ini");

            if(!file.exists())

                file.createNewFile();//不存在则创建

        FileInputStream fis=new FileInputStream(file);//创建读取流

        prop.load(fis);//fis中读取键值对

        int count=0;

        String value=prop.getProperty("time");//或者time对应的值

        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();

    }

}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值