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
递归的使用前提:
当调用方法的时候,方法的主体不变,但是每次调用方法的参数不同,可以使用递归
注意事项
递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。构造方法,禁止递归
递归的理解:
-
递归出口
-
递归方程
其实就是寻找递归出口与递归方程的过程
两个递归题
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);
}
}