一、File类的概述和构造方法
1. File类的概述和构造方法
概述:文件和目录路径名的抽象表示形式。
构造:File类提供了不同的构造方法来创建对象,方法如下:
//参数是文件的路径字符串,例如D:\1702A\day07\.project
public File(String pathname)
//第一个参数是文件所在文件夹路径,第二个参数是文件名
public File(String parent,String child)
//第一个参数是文件所在文件夹对象,第二个参数是文件名
public File(File parent,String child)
案例代码:
public static void main(String[] args) {
//通过本文件夹路径创建File对象
File file1 = new File("c:\\a.txt");
//通过父文件夹路径和本文件夹名字创建File对象
File file2 = new File("c:\\abc", "d.txt");
File file3 = new File("c:\\abc");
//通过父文件夹对象和本文件夹名字创建File对象
File file4 = new File(file3, "e.txt");
}
二、File类的成员方法
1. 创建功能
创建文件夹和文件的方法:
//创建文件,不存在返回true 存在返回false
1.boolean createNewFile()
//创建一个目录
2.boolean mkdir()
//创建多级目录
3.boolean mkdirs()
案例代码:
public static void main(String[] args) throws IOException {
//在c盘下创建a.txt文件
File file1 = new File("c:\\a.txt");
file1.createNewFile();//创建文件
//在c盘下创建abc文件夹
File file2 = new File("c:\\abc");
file2.mkdir();//创建
}
2. 删除功能
删除的方法:
//删除
1.boolean delete()
//文件使用完成后删除
2.boolean deleteOnExit()
案例代码:
import java.io.File;
import java.io.IOException;
public class FileDemo2 {
public static void main(String[] args){
File f =new File("d:\\1.txt");
try {
System.out.println(f.createNewFile());//当文件存在时返回false
System.out.println(f.delete());//当文件不存在时返回false
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
文件被删除
3. 重命名功能
//参数是要改成的名字
public boolean renameTo(File dest)
案例代码:
public static void main(String[] args) throws IOException {
//创建a.txt文件对象
File file1 = new File("c:\\a.txt");
//创建新文件名b.txt对象
File file2 = new File("c:\\b.txt");
file1.renameTo(file2);//重命名
}
*注意:
1.路径以盘符开始:绝对路径 c:\a.txt
2.路径不以盘符开始:相对路径 a.txt
3.相对路径是根据其父层文件夹作为依据,我们这里的父层文件夹时项目目录。
4. 判断功能
判断方法:
//是否是文件夹
public boolean isDirectory()
//是否是文件
public boolean isFile()
//是否存在
public boolean exists()
//是否可读
public boolean canRead()
//是否可写
public boolean canWrite()
//是否隐藏
public boolean isHidden()
案例代码:
public static void main(String[] args) throws IOException {
File f1 = new File("c:\\abc");
System.out.println("abc是否是文件夹:"+f1.isDirectory());
File f2 = new File("c:\\b.txt");
System.out.println("b是否是文件:"+f2.isFile());
System.out.println("b是否存在:"+f2.exists());
System.out.println("b是否可读:"+f2.canRead());
System.out.println("b是否可写:"+f2.canWrite());
System.out.println("b是否隐藏:"+f2.isHidden());
}
9.2.5 基本获取功能
获取方法:
//获取名字
public String getName()
//获取路径
public String getPath()
//获取绝对路径
public String getAbsolutePath()
//如果没有父目录返回null
public String getParent()
//获取最后一次修改的时间
public long lastModified()
//获取文件的长度
public long length()
//获取机器盘符
public File[] liseRoots()
案例代码:
public static void main(String[] args) throws IOException {
File f1 = new File("c:\\abc\\d.txt");
System.out.println("名字:"+f1.getName());
System.out.println("路径:"+f1.getPath());
System.out.println("相对路径:"+f1.getAbsolutePath());
System.out.println("父文件夹:"+f1.getParent());
System.out.println("最后一次修改时间:"+f1.lastModified());
System.out.println("文件大小:"+f1.length());
System.out.println("获取盘符:"+f1.listRoots());
}
6. 高级获取功能
//获取指定目录下的所有文件或者文件夹的名称数组
public String[] list()
//获取指定目录下的所有文件或者文件夹的名称数组时进行过滤,参数是过滤器
public String[] list(FilenameFilter filter)
//获取指定目录下的所有文件或者文件夹
public File[] listFiles():
//获取指定目录下的所有文件或者文件夹时进行过滤,参数是过滤器
public File[] listFiles(FileFilter filter):
案例如下:列出磁盘下的文件和文件夹的名字
public class FileDemo3 {
public static void main(String[] args){
File[] files =File.listRoots();//获得所有磁盘根目录
for(File file:files){//遍历得到每一个磁盘根目录
System.out.println(file);
if(file.length()>0){
String[] filenames =file.list();//得到磁盘根目录下的文件和文件夹的名字
for(String filename:filenames){//遍历得到每一个名字
System.out.println(filename);
}
}
}
}
}
案例如下:指定一个目录,返回File数组
public static void main(String[] args) {
File file = new File("c:\\");//获得c盘文件夹对象
File[] files = file.listFiles();//获得c盘下的文件和文件夹对象
System.out.println(Arrays.toString(files));//打印
}
三、递归
1. 递归概念
方法调用方法本身的现象
2. 递归注意事项
1.要有出口,否则就是死递归
2.次数不能太多,否则就内存溢出
3.构造方法不能递归使用
递归实现:实现一个数字的阶乘
代码实现:
public static void main(String[] args) {
int i = jieCheng(3);//调用递归方法计算3的阶乘,结果是6 ,3*2*1=6
System.out.println(i);//打印结果
}
public static int jieCheng(int n){
if(n==1){
return 1;
}else {
return n*jieCheng(n-1);//阶乘计算
}
}
运行结果:
6
3. 递归解决问题的思想
兔子问题(斐波那契数列)
有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?
分析:
我们要想办法找规律,兔子对数
第一个月: 1
第二个月: 1
第三个月: 2
第四个月: 3
第五个月: 5
第六个月: 8
...
由此可见兔子对象的数据是:
1,1,2,3,5,8...
规则:
1.从第三项开始,每一项是前两项之和
2.而且说明前两项是已知的
public class FibonacciDemo{
public static void main(String[] args) {
for (int counter = 0; counter <= 10; counter++) {
System.out.printf("Fibonacci of %d is: %d\n",
counter, fibonacci(counter));
}
}
public static long fibonacci(long number) {
if ((number == 0) || (number == 1))
return number;
else
return fibonacci(number - 1) + fibonacci(number - 2);
}
}
4. 递归使用-遍历文件夹及子文件夹所有文件
案例1:遍历文件夹,不删除
//列出E:\\积云\\java目录下Java源文件的名字
public static void main(String[] args) {
File f=new File("C:\\积云\\java");
cha(f);
}
private static void cha(File f) {
File[] li = f.listFiles();//得到文件夹下的文件和文件夹
for (File file : li) {
if(file.isDirectory()){//是文件夹,继续扫描
cha(file);
}else{
String name = file.getName();
if(name.endsWith("java")){//是否是java文件
System.out.println("java文件是: "+file.getName());
}
}
}
}
案例2:遍历删除文件夹下所有的文件和文件夹
import java.io.File;
import java.util.Arrays;
import java.util.Scanner;
public class Test {
public static void main(String[] args) {
File dir = new File("C:\\积云");//实例化 积云 文件夹
File[] files = dir.listFiles();//得到文件夹下的文件和文件夹
for (int i = 0; i < files.length; i++) {
boolean flag = files[i].isFile();//是否是文件
if (flag) {
files[i].delete();//是文件则删除
} else {
getAllFiles(dir, 0);//得到文件夹下的文件和文件夹
}
}
deleteAll(dir);//删除积云文件夹下所有的空文件夹
System.out.println("over");
getAllFiles(dir, 0);
}
public static void getAllFiles(File dir, int level) {
System.out.println(getLevel(level) + dir.getName());
level++;
File[] files = dir.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isDirectory()) {
// 这里面用了递归的算法
getAllFiles(files[i], level);
} else {
System.out.println(getLevel(level) + files[i]);
}
}
}
public static String getLevel(int level) {
// A mutable sequence of characters.
StringBuilder sb = new StringBuilder();
for (int l = 0; l < level; l++) {
sb.append("|--");
}
return sb.toString();
}
// 递归删除指定路径下的所有文件
public static void deleteAll(File file) {
if (file.isFile() || file.list().length == 0) {
file.delete();
} else {
File[] files = file.listFiles();
for (File f : files) {
deleteAll(f);// 递归删除每一个文件
f.delete();// 删除该文件夹
}
}
}
}
5. Debug模式遍历文件
遍历过程中通过Debug模式跟踪
网友评论