File类丶递归

File类

java.io.File文件和目录路径名的抽象表示形式

java把电脑中的文件和文件夹(目录)封装成为一个File类,我们可以使用file类对文件和文件夹进行操作

File类是一个与操作系统无关的类,任何的操作系统都可以使用这个类中的方法

file:文件 directory:文件夹 path:路径

成员变量

static String pathSeparator:与系统有关的分隔符

win是分号;linux是冒号:

static String Separator:与file有关的分隔符

win是反斜线\ linux是/

操作路径不能写死了

例如C:\aaa\bbb.java win

​ /usr/develop/aaa/bbb.java

这时候就要 使用File.Separator,File.pathSeparator来写

 

相对路径与绝对路径

相对路径:是一个完整的路径,例:以盘符开始的路径C:\a.txt

绝对路径:是一个简化路径.指的是相对与当前项目的根目录.

路径是不区分大小写的

路径中的文件名分隔符windows使用反斜杠\,而\是转义字符,所以要写两个\

构造方法

File(String pathname):通过给定的路径名字符串来创建一个新的File实例.创建File对象,只是把字符穿路径封装成了File对象,不考虑路径的真假情况

File(String parent,String child):根据parent路径名字符串和child路径名字符串来创建一个新的file实例.(好处:父路径和子路径可以单独书写,使用起来非常的灵活,父路径和子路径都可以变化)

File(File parent,String child):根据parent抽象路径名和child路径名字符串来创建一个新的file实例.

(好处:好处:父路径和子路径可以单独书写,使用起来非常的灵活,父路径和子路径都可以变化,同时父路径是File类型,可以使用file的方法对路径进行一定的操作,再使用file来创建对象)

File(URI uri):根据uri来创建一个文件

常用方法

public String getAbsolutePath() :返回此File的绝对路径名字符串(无论定义的是不是绝对路径)。

如果是传递的是相对路径,getAbsolutePath()返回的是绝对路径,并且是相对工程名的.例如:

文件的绝对路径是:D:\IdeaProjects\StageTwo\ccc.java

public String getPath():将此File转换为路径名字符串。(就是构造方法中传递的路径)

public String getName() :返回由此File表示的文件或目录的名称。

public long length() :返回由此File表示的文件的长度。ps:文件夹是没有大小概念的,不能获取文件夹的大小,如果给出的路径不存在,那么length就会返回0,文件夹也是返回0

其实打印file,就是打印了toString(),而toString则是调用了getPath()

判断功能的方法

public boolean exists():此File表示的文件或目录是否实际存在。public boolean isDirectory():此File表示的是否为目录。public boolean isFile():此File表示的是否为文件。

后两个的使用前提必须是路径是真实存在的,不然都是false,所以用之前最好判断,不存在就没有必要获取

创建删除功能的方法

public boolean createNewFile():当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。

上面的方法声明了异常(IO异常)我们要解决这个异常

public boolean delete() :删除由此File表示的文件或目录。

delete是直接从硬盘中删除,不走回收站,需要谨慎使用

public boolean mkdir():创建由此File表示的目录。

不能创建多级文件夹

public boolean mkdirs():创建由此File表示的目录,包括任何必需但不存在的父目录。

File类遍历

public String[] list():返回一个String数组,表示该File目录中的所有子文件或目录。public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。

 

package com.qin.study;
​
import java.io.File;
​
/**
 * Created by SunYuqin in 2018/8/10
 * Description:
 * public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录。
 * public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
 **/
​
public class FileFor {
    public static void main(String[] args) {
        File dir = new File("D:\\aaa\\bbb");
        String[] list = dir.list();
        for (String s : list) {
            System.out.println(s);
        }
​
        System.out.println("---------------");
​
        File[] files = dir.listFiles();
        for (File file : files) {
            System.out.println(file);
        }
    }
}
​
结果:
string[]list 返回的只是有文件名
File[]listfiles 返回的是前面的目录+文件名(原因:file里面的toString方法重写的是return getPath())
    
ccc - 副本 (2).java
ccc - 副本 (3).java
ccc - 副本.java
ccc.java
---------------
D:\aaa\bbb\ccc - 副本 (2).java
D:\aaa\bbb\ccc - 副本 (3).java
D:\aaa\bbb\ccc - 副本.java
D:\aaa\bbb\ccc.java
​

 

调用listFiles方法的File对象,表示的必须是实际存在的目录,否则返回null,无法进行遍历。

string[]list 返回的只是有文件名File[]listfiles 返回的是前面的目录+文件名(原因:file里面的toString方法重写的是return getPath())

 

对于new File()并没有创建文件的问题:

首先 File 类是对文件系统的映射 并不是硬盘上真实的文件 所以 new File("xxx.xxx") 只是在内存中创建File文件映射对象,而并不会在硬盘中创建文件 如果需要创建文件需要以下操作: 判断映射的文件是否真实存在 file.exists() //true存在 false不存在 如果存在即可直接操作, 否则需要调用 file.createNewFile() 创建真实文件 但是以上方式只会适用创建文件本身,不包括父文件的创建(如果父文件不存在) 所以一般需要对父文件存在与否作判断 File parent = file.getParentFile() // 获取父文件 if( !parent.exists() ) parent.mkdirs(); //创建所有父文件夹

package com.qin.study;
​
import java.io.File;
import java.io.IOException;
​
/**
 * Created by SunYuqin in 2018/8/10
 * Description:
 **/
​
public class FileCreate {
    public static void main(String[] args) {
        File file = new File("D:/aaa/bbb/ccc.java");
        if (file.exists()) {
            System.out.println("文件已经存在了!");
        } else {
            File parent = file.getParentFile();
            if (!parent.exists()) {
                parent.mkdirs();
            }
            try {
                file.createNewFile();
                System.out.println("文件已经创建");
​
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
​

 

递归

概述

指在当前方法中调用自己的现象

分类: 直接递归和间接递归

直接递归:自己调用自己

间接递归:a->b->c->a

递归的使用前提:

当调用方法的时候,方法的主体不变,但是每次调用方法的参数不同,可以使用递归

注意事项

递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。构造方法,禁止递归

递归的理解:

  1. 递归出口

  2. 递归方程

其实就是寻找递归出口与递归方程的过程

 

两个递归题

package com.qin.test;
​
/**
 * Created by SunYuqin in 2018/8/12
 * Description:
 * 用递归实现不死神兔
 * 故事得从西元1202年说起,话说有一位意大利青年,名叫斐波那契。
 * 在他的一部著作中提出了一个有趣的问题:假设一对刚出生的小兔一个月后就能长成大兔,
 * 再过一个月就能生下一对小兔,并且此后每个月都生一对小兔,没有发生死亡,
 * 问:现有一对刚出生的兔子2年后(24个月)会有多少对兔子?
 * 其实就是
 * 递归方程:         f(n) = f(n-1)+f(n-2);
 * 递归出口:         f(1) = 1 ,f(2) = 1;
 **/
​
public class Ex02 {
    public static void main(String[] args) {
        int numRabbit = getNumRabbit(24);
        System.out.println(numRabbit);
    }
​
    private static int getNumRabbit(int i) {
        if (i == 1) {
            return 1;
        }
        if (i == 2) {
            return 1;
        }
        return getNumRabbit(i - 1) + getNumRabbit(i - 2);
    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值