一、创建文件对象和跨平台的separator
//创建File对象
//将a.txt封装成file对象,可以将已有的和未出现的文件或者文件夹城装成对象
File f1=new File("a.txt");
File f2=new File("E:\\abc","b.txt");
File d=new File("E:\\abc");
File f3=new File(d,"c.txt");
//若写的相对路径,则打印f1为相对路径,若写的绝对路径,则打印f2为绝对路径
System.out.println("f1:"+f1);//f1:a.txt
System.out.println("f2:"+f2);//f2:E:\abc\b.txt
System.out.println("f3:"+f3);
//但是路径中写\\只是在win系统这样,不利于跨平台性,所以File类提供了字段separator
File f4=new File("E:"+File.separator+"abc","c.txt");
System.out.println("f4:"+f4);//f4:E:\abc\c.txt
二、基本操作
1.创建:
①boolean createNewFile():在指定位置创建文件,如果该文件已经存在。则不创建,返回false.和输出流不一样,输出流对象已建立即创建文件,而且文件已经存在的话,被覆盖。
②public boolean mkdir():创建目录(只能创建一级目录)
public boolean mkdirs():创建多级目录
2.删除:
boolean delete():删除此抽象路径名表示的文件或者目录
void deleteOnExit():在虚拟机终止时,请求删除抽象路径名表示的文件或者目录
3.判断:
boolean exists():文件或者目录是否存在
boolean isFile():判断是否为一个文件
boolean isDirectory:判断是否为一个目录
boolean isAbsolute:判断此路径是否为绝对路径(只是判断是否为绝对路径,与是否存在文件或者目录无关,即没有创建文件或者目录,只要表示的是绝对路径,那么其就为真)
//创建文件,并对其简单操作
File f=new File("file.txt");
sop("create:"+f.createNewFile());
sop("exists:"+f.exists());//判断文件是否存在
sop("execute:"+f.canExecute());//判断文件是否可执行
//创建文件夹
//File f1=new File("file");
//sop("mkdir:"+f1.mkdir());
//创建子文件夹在原有的file文件夹中创建子文件夹abc
//File f2=new File("file\\abc");
//sop("mkdir1:"+f2.mkdir());
//创建多级目录,是前面创建文件夹和子文件夹的综合
File f3=new File("file\\a\\b\\c");
sop("mkdirs:"+f3.mkdirs());
//
File f=new File("file.txt");
//f.mkdir();不能主观根据后缀名判断是文件还是目录,在目录名中也可以带有后缀名的目录名
//记住:在判断文件对象是否为文件或者文件目录时,必须要先判断该文件对象封装的内容是否存在
//通过exists判断
sop("dir:"+f.isDirectory());//true
sop("file:"+f.isFile());//false
//File f=new File("C:\\file.txt");
sop("isAbsolute:"+f.isAbsolute());
4,获取信息:
①getName():获取目录或者文件名称
②getPath():返回自定义的相对路径或者绝对路径,若只写个文件名,则返回相对路径;若写的是个 (”E:\file”,”b.txt”)则返回绝对路径
③ getAbsolutePath():无论创建的相对路径文件对象,还是绝对文件对象,返回的都是绝对路径
④ getParent():该方法返回绝对路径中的父目录,若没指定父目录,则返回null;若相对路径中含有上一 层目录,则返回结果为父级目录
⑤ long lastModified():
⑥long length():获取文件的长度
⑦boolean renameTo(File dest):类似剪切也改名
File f1=new File("E:\\ABC.txt");
File f2=new File("d:\\abc.txt");
sop(f1.renameTo(f2));
5,获取文件列表
①public static File[] listRoots():获取所有的根目录(注意其为静态方法)
②public String[] list():获取指定路径名表示的目录中的文件和目录
//获取所有的根目录
File[] files=File.listRoots();
for(File f:files) {
sop(f);
}
//获取指定路径下的文件和目录
File f=new File("D:\\BaiduNetdiskDownload\\【he11oworld.com】毕向东25天");
String[] names=f.list();
for(String name:names) {
sop(name);
}
③public String[] list(FilenameFilter filter):获取指定目录下的指定文件
File f=new File("D:\\BaiduNetdiskDownload\\【he11oworld.com】毕向东25天\\源代码\\day18");
String[] names=f.list(new FilenameFilter()//匿名内部类
{
//accept方法,确定要返回的文件名或者目录名
public boolean accept(File dir,String name) {
return name.endsWith(".bmp");
}
});
for(String name:names) {
sop(name);
}
④public File[] listFiles():返回当前目录下的所有文件或者目录
在实际的开发中,只获取文件名操作较少,一般是要获取到文件,并对文件进行操作,这样才有意义。
获得当前目录下的所有文件
File dir=new File("c:\\");
File[] files=dir.listFiles();
for(File f:files) {
sop(f.getName()+"------"+f.length());//这个长度只能获取文件长度,不能获取目录长度
}
递归
一、新的需求:列出指定目录下的文件或者文件夹,包含子目录的的内容,也就是列出指定目录下的所有内容。
分析:因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。
在列出过程中出现的还是目录的话,就再次调用本功能,也就是函数自身调用自身,这种表现形式或者编程手法称为递归。
递归要注意的是:
1)限定条件
2)递归次数,避免内存溢出
public static void showDir(File dir) {
System.out.println(dir);
File[] files=dir.listFiles();
for(int x=0; x<files.length;x++) {
if(files[x].isDirectory())
showDir(files[x]);
else
System.out.println(files[x]);
}
}
主函数调用:File f=new File("D:\\BaiduNetdiskDownload\\【he11oworld.com】毕向东25天");
showDir(f);
图示演示↓
二、上面的遍历变形:删除当前某个目录
思路:从内往外删
若一层的目录或者文件都删完,应该在for后面在把此层的文件夹删掉。
public static void removeDir(File dir) {
File[] files=dir.listFiles();
for(int x=0; x<files.length;x++) {
if(files[x].isDirectory())
removeDir(files[x]);
else
System.out.println(files[x].delete());
}
System.out.println(dir+":::"+dir.delete());
}
三、将一个指定目录下的java文件的绝对路径,存储到一个文本文件中,建立一个java文件列表文件
思路:
1;对指定的目录进行递归。
2;获取在递归过程中的所有Java文件路径
3;将这些路径存储到集合中
4;将集合中的数据写入文件中
import java.io.*;
import java.util.*;
public class Demo2 {
private ArrayList<String> al;
Demo2(ArrayList al){
this.al=al;
}
public void search(File dir) {
File[] files=dir.listFiles();
for(int x=0; x<files.length;x++) {
if(files[x].isDirectory())
search(files[x]);
else {
String name=files[x].getName();
if(name.endsWith(".Java")) {
String path=files[x].getAbsolutePath();
al.add(path);
}
}
}
}
public static void main(String[] args)throws IOException {
Demo2 d=new Demo2(new ArrayList<String>());
File f=new File("E:\\练习");
d.search(f);
FileWriter fw=new FileWriter("E:\\a.txt");
BufferedWriter bufw=new BufferedWriter(fw);
Iterator<String> it=d.al.iterator();
while(it.hasNext())
{
bufw.write(it.next());
bufw.flush();
bufw.newLine();
}
bufw.close;
}
}
需求1在之前的十进制转换为二进制过程中,也可以用递归:
public static void toBin(int num) {
if(num>0) {
toBin(num/2);
sop(num%2);
}
}
调用:toBin(6)//输出110
图示表示如下:↓
求1-num的总和(带返回值的递归):
public static int getSum(int n)
{
if(n==1)
return 1;
return n+getSum(n-1);
}
图示演示执行过程:↓