----------- android培训、java培训、java学习型技术博客、期待与您交流! ---------
File类
一.引述
I/O流,流对象只能操作设备上的数据,而不能操作文件,例如,创建文件;更改文件属性;获取文件名字……这些I/O流对象都不能操作,如果想要进行这些操作,我们就有要引入一个类:File类。
File类:用来将文件或者文件夹封装成对象,方便对文件与文件夹的属性信息进行操作。
File对象可以作为参数传递给流的构造函数。
File类中的常用方法。
注意,因为File类是用来将文件或者文件夹封装成对象,所以在创建的时候一定要传入一个文件,或者一个文件夹的名称。
二.简述
(1)字段摘要
1.1 separator 表示与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
1.2 pathSeparatorChar表示与系统有关的路径分隔符。此字段被初始为包含系统属性 path.separator 值的第一个字符。此字符用于分隔以路径列表 形式给定的文件序列中的文件名。在 UNIX 系统上,此字段为 ':';在 Microsoft Windows 系统上,它为 ';'。
路径列表:例如,环境配置里的Path变量。
(2)构造方法
2.1 File(String Pathname)通过将给定的路径字符串转换为抽象路径来创建一个新的File实例;也就是说,可以将一个已存在的,或者不存在的文件或者目录封装成一个File对象
2.2 File (String parent, String child)根据parent路径字符串和child路径名字符串创建一个新的File实例;
2.3 File (File parent, String child)根据parent抽象路径名和 child 路径名字符串创建一个新的File实例;此构造方法与1.2不同,它可以使用File对象的方法来操作参数而1.2不可以使用File对象的方法来操作,只能使用字符串对象的方法来操作。
常用方法摘要
(3)获取
3.1 获取文件名称:String name = file.getName();
3.2 获取文件绝对路径:String absPath = file.getAbsolutePath();
3.3 获取文件参数输入路径:String path = file.getPath();
比较:3.3和3.2;这两个方法都是获取文件路径,但是3.2获取的是绝对路径;
而3.3获取的是创建对象是传入的参数路径:可以是相对的也可以是绝对的。
因此,file.getPath()可能获取相对的路径,也可能获取绝对路径。
补充:
相对路径:不以盘符为开头的路径就是相对路径
绝对路径:以盘符开头的路径就是绝对路径——虽然不太对但是好记;
对于相对路径来讲:在根目录看来——我的附庸的附庸不是我是附庸;
对于绝对路径来讲:在根目录看来——你,生是我的人,死是我的鬼,直属关系,绝对掌控;
3.4 获取文件父目录:String parent = file.getParent();
如果参数是相对路径那么返回值为null
3.5 获取文件大小:long len = file.length();
3.6 获取文件修改时间 :long time = file.lastModified();
此方法返回最后修改文件时的毫秒值
(4)创建与删除
4.1 创建文件:createNewFile(); 返回值为boolean;
此方法,如果指定文件不存在则创建指定文件;如果存在则不创建
(对比输出流,输出流创建文件时,无论是否存在一律覆盖,除非你指定)
4.2 删除文件:delete();返回值为:boolean;
4.3 删除文件:deleteOnExit(); 在JVM退出时删除
4.4 创建文件夹:mkdir(); 返回值为:boolean;
此方法适用于创建单级目录;
4.5 创建多级目录:mkdirs();返回值为:boolean;
此方法适用于创建多级目录;
4.5 删除文件夹:dir.delete(); 返回值为:boolean
关于文件删除:如果当前文件正在被操作则无法被删除。
关于文件夹的删除,在Win系统中如果一个文件夹为空你可以使用,Dos命令或者 使用java语句来删除,但是,如果一个文件夹内,有文件,你必须从文件夹里向 文件夹外一层一层的删除。不能一次性的删除干静。
(5)判断
5.1 判断文件是否存在:exists();返回值为:boolean;
5.2 判断是否为文件:is.File( ); 返回值:为boolean;
5.3 判断是否为目录:isDirectory( );返回值:boolean;
知识盲点:其实文件夹可以有后缀名称;而文件也可以没有后缀;(虽然有些无聊)
(6)重命名
6.1 文件重命名file 1.renameTo(file2);
同一个目录下两文件重命名;
不同目录下源文件(file)剪切,并改名(为file2)
同类文件对象才可以操作,貌似如果这样就不行 dir.renameTo(file)
文件夹和文件都可以带后缀或不带,但必须保证名称不同:
1)在window中文件的命名规则是前缀加后缀;
2)文件名指的就是全名,即前缀加后缀;
3)系统命名规则中把文件和文件夹都当成文件;
4)一般文件夹不写后缀,文件写后缀,但其实是不同的名称;
5)当文件名不带后缀时,就可能与文件夹重名;
6)这时,系统就认为文件重名了,所以不能命名成功。
(7)列出可用的文件系统根
File[ ] files = File.listRoots();
7.1 listRoots();——这是一个静态方法不需要你创建对象,返回一个数组
(8)获取信息
8.1 获取盘符可用空间getFreeSpace() 返回值类型lang
8.2获取盘符全部空间 getTotalSpace( )
8.3 获取当前盘符中文件及文件夹名称 list() 返回值:String[]
注意:1·调用list()方法的对象中封装的必须是目录。否则会发生空指针异常
2·如果访问的是系统级目录也会发生空指针异常
3·如果目录存在但是没有内容,会返回一个数组,但是长度为0;
8.4 list()方法的重载;
list(FilenameFilter filter) ;
此方法返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足
指定过滤器的文件和目录。
接口 FilenameFilter实现此接口的类实例可用于过滤器文件名
boolean |
accept(File dir, String name) |
三.练习
(9)Test:
9.1获取电脑最大剩余空间的硬盘和大小;——知识点应用(7)、(8)
import java.io.File;
import java.io.IOException;
/**
* 获取你电脑上最大的盘符空间
* 1.遍历你的电脑,获取所有的盘符
* listRoot();
* 2.遍历每一个盘符的空闲空间;
* getFreeSpace()
* 3.找出空闲空间最大的盘符
*
*/
public class FileDemo{
//查看自己电脑中可用空间最大的盘符
public static void main(String[] args) throws IOException{
//1.获取电脑盘符根路径
File[] files = File.listRoots();
//2.遍历数组,并找出剩余空间最大的元素,和其下标;
int index = 0;
long max = 0;
//开始遍历
for(int i = 0; i < files.length; i++){
if(files[i].getFreeSpace() > max){
max = files[i].getFreeSpace();
index = i;
}
}
System.out.println("亲,电脑中剩余空间最大的盘符是"+(char)(index+(int)('C'))+"\t剩余空间是"+max+"字节");
}
}
9.2深度遍历
import java.io.File;
public class FileTest {
/**
* 需求:对指定的目录进行所有内容的列出(包含子目录中的内容)也就是深度遍历
*
* 1.遍历指定路径;获取路径中文件和文件夹
* 2.判断如果是文件夹,继续遍历,
* 3.重复上述动作
*/
public static void main(String[] args) {
//封装路径对象
File dir = new File("i:\\java");
listAll(dir);
}
private static void listAll(File dir) {
//1.获取指定目录下当前的所有文件夹或者文件对象;
File[] files = dir.listFiles();
for(int i = 0; i < files.length; i++){
//打印美观,加上盘符标记;
System.out.print("file: ");
//2.判断
//如果获取的文件对象是文件夹,继续遍历
if(files[i].isDirectory()){
//3.递归,因为这个方法本身就是用来遍历文件目录的,所以他可以调用自身
listAll(files[i]);
}
else
//获取文件的决定路径
System.out.println(files[i].getAbsolutePath());
}
}
}
9.3 删除一个带内容的文件夹——应用知识点:深层遍历、(4)
import java.io.File;
public class RemoveDirTest {
/**
* 需要:删除一个带内容的文件
* 思路:
* 1.深层遍历指定路径
* 2.判断遍历到的对象为文件还是文件夹
* 3.从内到外删除文件。
* 4.最后删除文件夹,一次就够了,只要没有内容
*
*/
public static void main(String[] args) {
File dir = new File("F:\\ABC");
removeDir(dir);
}
private static void removeDir(File dir) {
File[] files = dir.listFiles();
for(int i = 0; i < files.length; i++){
if(files[i].isDirectory()){
removeDir(files[i]);
}
else{
System.out.println(files[i]+":"+files[i].delete());
}
}
System.out.println(dir+":"+dir.delete());
}
}