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