IO(File、递归、Properties)

来源:互联网 发布:咕咚运动软件最新 编辑:程序博客网 时间:2024/06/05 04:29


File

File类:流只操作数据,因此将文件系统中的文件和文件夹封装成了对象,便于对文件和文件夹更多的属性和行为进行操作。

File构造函数:将已有和不存在的文件或文件夹装载成File对象。(封装时不会创建文件或者文件夹)

可以是:绝对路径、相对路径、路径+文件名、相对路径+绝对路径。

路径+文件名时可以作为一个String参数传递,也可以作为两个参数 路径String/File对象 + 文件名String

File类的toString方法输出的是构造函数传递进去的内容。

File类常见方法:

1:创建。

    boolean  createNewFile():在指定目录下创建文件,如果该文件已存在,则不创建,不覆盖,返回false。

    boolean  mkdir():创建指定目录的文件夹,只能创建一级文件夹,即一个层次。

    boolean  mkdirs():创建多级目录。

2:删除。

    boolean  delete():删除此抽象路径名表示的文件或目录。

    void  deleteOnExit():在虚拟机退出时删除,常用以建立临时文件。

注意:在删除文件夹时,必须保证这个文件夹中没有任何内容,才可以将该文件夹用delete删除。 window的删除动作,是从里往外删。注意:java删除文件不走回收站。要慎用。


3:判断:

    boolean  exists()判断文件或者文件夹是否存在。

    boolean  isDirectory()测试此抽象路径名表示的文件是否是一个文件夹。

    boolean  isFile()测试此抽象路径名表示的文件是否是一个文件。

    boolean  isHidden():测试此抽象路径名指定的文件是否是一个隐藏文件。

    boolean  isAbsolute():测试此抽象路径名是否为绝对路径名。

注意:isDirectory、isFile、isHidden方法只判断已存在在硬盘上被封装的数据,未被创建时,就算封装了对象也会返回false。所以通常先用exists方法先判断数据是否已存在

4:获取.

    long  length():获取文件大小。

    long  lastModified()返回此抽象路径名表示的文件最后一次被修改的时间。

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

    String  getPath():将此抽象路径名转换为一个路径名字符串(封装什么路径,返回的就是什么路径)。

    String  getAbsolutePath()返回此抽象路径名的绝对路径名字符串。

    File  getAbsoluteFile()返回此抽象路径名的绝对路径对象。

    String  getParent():返回此抽象路径名父目录的抽象路径名,如果此路径名没有指定父目录,则返回null

    File.pathSeparator:返回当前系统默认的路径分隔符,windows默认为 “;”。

    File.Separator:返回当前系统默认的目录分隔符,windows默认为 “\”。

另外:

     boolean  renameTo(Filedest):可以实现移动的效果。剪切+重命名。

     static  File[]  listRoots();:获取系统里面所有有效盘符对象

     String[]  list();:获取文件夹内部一级文件和文件夹的名称。包含隐藏文件,但调用对象是文件时抛异常。可以传递过滤器。

     File[]  listFile();:和list()类似,不过获取的是对象。也可以传递过滤器。

public static void method_2() throws IOException{File f1 = new File("a.txt");f1.deleteOnExit();//退出时删除;sop("f1:"+f1.createNewFile());//sop("f1:"+f1.mkdir());//只能创建1个文件夹(无论是单层还是多层)//sop("f1:"+f1.mkdirs());}
public static void method_3() throws IOException{File f1 = new File("a.txt");//f1.mkdir();f1.createNewFile();sop("canExecute:"+f1.canExecute());//canExecute无论是文件夹还是没有扩展名的文件都是true,不存在时才返回false//那么和exists效果是一样的,区别在哪里?sop("exists:"+f1.exists());sop("File:"+f1.isFile());//必须先存在才能去判断sop("Directory:"+f1.isDirectory());//目录sop("Hidden:"+f1.isHidden());//隐藏文件}

————————————————————————————————————————————————————

递归

File常见需求:

//列出指定目录下文件或者文件夹,包含子目录中的内容。//也就是列出指定目录下所有内容。import java.io.*;class myFileDemo3 {public static void main(String[] args) throws IOException{File f = new File("D:\\新建文件夹");showDir(f,0);}public static String getlevel(int level)//为每一个分层加上分级符号{StringBuilder sb = new StringBuilder();sb.append("|--");for(int x = 0;x< level;x++){sb.insert(0,"   ");}return sb.toString();}public static void showDir(File dir,int level)//遍历一个文件夹里面所有内容,包括子文件夹中的{//dir为目录,level为文件夹等级sop(getlevel(level)+dir.getName());level++;File[] files = dir.listFiles();for(File f : files){if (f.isDirectory())showDir(f,level);elsesop(getlevel(level)+f.getName());}}public static void sop(Object obj){System.out.println(obj);}}

列出指定目录下,文件或者文件夹。包含子目录中的内容。也就是类出指定目录下的所有内容。

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

在列出过程中出现的还是目录的话,就在此调用本功能。也就是函数自己调用自己。

这种编程手法、或者现象,成为递归


要注意:

  1. 限定条件
  2. 递归次数,尽量避免内存溢出。

————————————————————————————————————————

Properties

Properties:

  1. Properties是HashTable的子类,具备Map集合的特点,里面存储的键值对都是字符串
  2. Properties的特点是可以用于存储键值对形式的配置文件
  3. Properties是IO流合集合相结合的集合容器
那么在加载数据时,需要数据有固定格式:键=值
常见方法:
Object  setProperty(String key, String value): 调用 Hashtable 的方法 put。
String  getProperty(String key) :用指定的键在此属性列表中搜索属性。 
void  load(输入流) :从输入流(字符流、字节流都可以)中读取属性列表(键和元素对)。 
void  list(输出流) :将属性列表输出到指定的输出流(字符流、字节流都可以)。 
void store(输入流, String comments) :把集合中的修改保存到输入流,comments为注释。load和store对应使用
Set<String> stringPropertyNames() :返回的是键的Set集合(1.6版本)

//练习:限制程序运行次数。当运行次数到达5次时,给出,请您注册的提示。并不再让该程序执行。import java.io.*;import java.util.*;class myProp {public static void main(String[] args) throws IOException{lianxi();}public static void lianxi()throws IOException{File file = new File("info.ini");//封装配置文件对象;if(!file.exists())//第一次时建立配置文件file.createNewFile();FileInputStream fis = new FileInputStream(file);//建立输入流,关联文件;Properties prop = new Properties();//prop.load(fis);//加载配置文件int conut = 0;//计数器String value = prop.getProperty("time");//获取使用次数;if(value!=null){conut = Integer.parseInt(value);//把使用次数转成int型,以便累计if(conut>=5)//判断使用次数;{System.out.println("使用次数已到,请付费");return;}conut++;//使用次数累计}prop.setProperty("time",conut+"");//把使用次数保存到集合里面FileOutputStream fos = new FileOutputStream(file);//建立输出流,关联配置文件prop.store(fos,"");//把集合存到文件中;fos.close();fis.close();}public static void get2()throws IOException{Properties prop = new Properties();FileInputStream fis = new FileInputStream("1.txt");prop.load(fis);Set<String> s = prop.stringPropertyNames();for (String str : s ){System.out.println(str+"::"+prop.get(str));}}public static void getAndset()throws IOException{Properties prop = new Properties();FileOutputStream fos = new FileOutputStream("1.txt");prop.setProperty("zhangsan","23");prop.setProperty("lisi","20");prop.getProperty("lisi");//System.out.println(prop);prop.store(fos,"");fos.close();}}