File对象实例化
三种构造器
File file = new File("C:\\Users\\Administrator\\Desktop\\数据结构代码\\algorithm");//绝对路径
File file1 = new File(file,"testtss.txt");//根据parent和child构造
File file2 = new File(file,"test");//相对路径
相对路径的例子:
用junit单元测试创建的文件在当前moudle下
在main中创建的文件在当前project下
跨平台路径分隔符
File file3 = new File("D:" + File.separator + "io" + File.separator + "test11.txt")
- File对象的实例化仅仅是内存层面开辟了一个空间
- File对象可以存储文件,也可以存储文件目录
- File对象表示的是路径的最后一个文件,例如:"C:\Users\Administrator\Desktop\数据结构代码\algorithm"的对象对其操作更改的是algorithm文件目录
部分API
方法 | 解释 | 备注 |
---|---|---|
createTempFile | (String prefix, String suffix) (String prefix, String suffix, File directory) | static方法,“创建空文件” 文件名前缀(最少3字符),文件名后缀 前缀,后缀,指定路径的File对象 |
deleteOnExit | run结束后就删掉 | 创建的方式是mkdirs,但删除时是只删除该File对象路径的最末尾文件 |
delete | 删除File对象对应的文件or文件目录 | 必须保证是末梢路径,不然不能删除并且返回false |
renameTo(File dest) | 1,如果destFile对象与源文件File对象是在同一个路径下,那么renameTo的作用是重命名 2,如果目标文件与源文件不是在同一个路径下,那么renameTo的作用就是剪切,而且还不能操作文件夹。 | 见代码详解 1 |
getParent getParentFile | 返回父路径String 返回父路径File | 用于同路径创建等操作 |
length | 返回字节长度long | 非空小文件的length返回值可能为0 2 |
应用
递归遍历
1,遍历删除
要求:
- 遍历d:\io目录下的所有文件and文件目录名
- 删除png,img格式的文件,并告知删除成功
代码示例:
public class FileTest1 {
public static void intoDir(File f){//定义静态方法
File[] files = f.listFiles();//罗列内部所有File对象
for(File ff : files){
if (ff.isFile()){
System.out.println("文件" + ff.toString());
/*****************删除img,png格式的图片文件**********/
if(ff.toString().endsWith("img") || ff.toString().endsWith("png")){
ff.delete();
System.out.println("删除成功:"+ff.toString());
}
/****************************************************/
}
else{
System.out.println("文件目录" + ff.toString());
intoDir(ff);//递归
}
}
}
public static void main(String[] args) throws IOException {
File file = new File("D:\\io");
FileTest1.intoDir(file);//调用静态遍历方法
}
}
2,遍历计算大小
要求:
- 计算指定文件目录的大小
- 删除空文件(不是删空的文件目录)
代码示例:
public class FileTest1 {
public static long sumLength(File file){
File[] files = file.listFiles();
long sum = 0;
for(File f : files){
if (f.isFile()){
/****判断是否为空文件,若是则删除并告知****/
long length = f.length();
if(length == 0){
f.delete();
System.out.println("删除空文件:"+f.toString());
}
else{
sum += length;
}
/******************* *****************/
}
else{
FileTest1.sumLength(f);
}
}
return sum;
}
public static void main(String[] args) {
File file = new File("D:\\io");
long l = FileTest1.sumLength(file);
System.out.println("该文件总长为:"+l);
}
}
为什么最后的文件总长计算结果为0?
因为小文件会内联存储
NTFS文件系统是如何处理小文件的
大小对比 | 解释 | |
---|---|---|
小文件 | 文件大小 > 占用空间 通常占用空间为0 | 因为小文件内联存储 |
大文件 | 文件大小 < 占用空间 | 大文件占用空间包括了没有使用的簇的空间大小 |
↩︎File file1 = new File("D:\\io\\io2\\io3\\start.txt"); System.out.println(file1.createNewFile());//true创建成功,存在则false File file2 = new File("D:\\io\\io1\\io3\\dest.txt"); System.out.println(file1.renameTo(file2));//dest不存在,则true // "D:\\io\\io2\\io3\\start.txt"变成了"D:\\io\\io1\\io3\\dest.txt"( 路径不同:剪切 ) //若dest文件已存在,则返回false File file3 = new File("D:\\io\\io1\\io3\\file.txt"); System.out.println(file2.renameTo(file3));( 同路径:重命名)
- ↩︎