对指定目录进行所有内容的列出(包含子目录中的内容)
/*
需求:对指定目录进行所有内容的列出(包含子目录中的内容)
也可以理解为深度遍历 */
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);