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