介绍
在Java中,File
类是用于表示文件和目录路径的抽象。它提供了一组方法来创建、删除、重命名、检查文件/目录的存在性、以及查询文件/目录的属性等功能。File
类可以用于执行文件系统操作,如创建新文件、删除文件、检查文件是否存在等。
目的是
把字符串先表示为路径
然后转化成File对象
去调用里面的方法
通过父级路径和子级路径拼接的方法
或者是
\ 在Java里是转义字符
字符串和文件拼接
小结
File对象表示路径,可以是文件,也可以是文件夹
这个路径是可以存在的,也可以是不存在的
绝对路径是带盘符的
相对路径是不带盘符的,默认到当前项目下去寻找
常见的成员方法
判断和获取
提前创建了文件
三步走
判断是否存在
判断是否为文件
判断是否为文件夹
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
//对文件进行判断
File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
System.out.println(f1.exists());
//判断f1文件夹是否存在
System.out.println(f1.isDirectory());
//如果f1是文件夹方法返回值是true
System.out.println(f1.isFile());
//如果f1是文件方法返回值是true
//对文件夹进行判断
File f2=new File("E:\\新建文件夹\\新建文件夹");
System.out.println(f2.exists());//true
System.out.println(f2.isDirectory());//true
System.out.println(f2.isFile());//false
//如果文件不存在
File f3=new File("E:\\新建文件夹\\我不存在");
System.out.println(f3.exists());//false
System.out.println(f3.isDirectory());//false
System.out.println(f3.isFile());//false
}
}
返回文件的大小 单位是字节
不能获取文件夹的大小,返回的结果和硬件有关
如果我们要获取一个文件夹的大小
需要把这个文件夹里的所有文件大小都累加到一起
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
File f2=new File("E:\\新建文件夹\\新建文件夹");
//返回文件的大小(字节数量)
System.out.println(f1.length());
//返回文件夹的大小(获取到的是0,因为length方法只能获取文件的大小)
System.out.println(f2.length());
}
}
获取文件的绝对路径
如果文字前写了模块名
会进行两次查找,即在当前项目下先寻找模块,在寻找文件
不写的话会在当前模块下直接寻找文件
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
File f2=new File("文字.txt");
//获取文件的绝对路径
System.out.println(f1.getAbsolutePath());
System.out.println(f2.getAbsolutePath());
}
}
获取定义文件对象使用的路径
获取创建File对象时,括号里写的东西
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
File f2=new File("文字.txt");
//获取定义文件时使用的路径
System.out.println(f1.getPath());
System.out.println(f2.getPath());
}
}
获取文件名称
扩展名,后缀名也会显示
但如果是文件夹,只会返回文件夹的名字,而不会返回后缀名,扩展名
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
File f2=new File("文字.txt");
//获取名称
System.out.println(f1.getName());
System.out.println(f2.getName());
}
}
返回文件的最后修改时间
获取的是时间的毫秒值
还是要把他变成字符串表示的时间 yyyy年MM月dd日
import java.io.File;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
File f1=new File("E:\\新建文件夹\\新建文本文档.txt");
File f2=new File("文字.txt");
//获取最后一次修改时间的毫秒值
System.out.println(f1.lastModified());
System.out.println(f2.lastModified());
}
}
拓展 把毫秒值转换成表示的时间
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
File f1=new File("文字.txt");
//获取毫秒值
System.out.println(f1.lastModified());
long time=f1.lastModified();
//获得Date对象
Date date=new Date(time);
//获取SimpleDateFormat对象
//可以解析时间变成我们自己喜欢的格式
//先写解析式
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM--dd HH:mm:ss");
//把参数传进去,获得字符串
String t=sdf.format(date);
System.out.println(t);
}
}
获取并遍历
最重要的一个方法
获取文件夹里面所有的内容 包括:文件 文件夹 隐藏的文件
把内容放到数组中进行返回 这个数组是file类型的数组
import java.io.File;
public class Main {
public static void main(String[] args) {
File f=new File("D:\\新建文件夹");
File file[]=f.listFiles();
for (File file : file) {
//file表示文件夹里的每一文件或者文件夹
System.out.println(file);
}
}
}
当调用者File表示的路径不存在的时候 返回null
当调用者File表示的路径是文件时 返回null
当调用者File表示的路径是一个空文件夹时 返回一个长度为0的数组
当调用者File表示的路径是一个有内容的文件夹时 将里面的所有文件和文件夹的路径放到File数组中进行返回
当调用者File表示的路径是一个有隐藏文件的文件夹时 将里面的所有文件和文件夹的路径房贷File数组中返回 包括隐藏文件
当调用者File表示的路径是需要权限才能访问的文件夹时 返回null
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
public class Main {
public static void main(String[] args) {
File f=new File("D:\\新建文件夹");
//遍历盘符
File arr1[]=File.listRoots();
for(File f1:arr1) System.out.println(f1);
/*-----------------------------------------*/
//获取当前路径下所有的内容 带拓展名
String arr2[]=f.list();
for(String str:arr2) System.out.println(str);
/*-----------------------------------------*/
//利用文件名过滤器获取当前路径下所有的内容
String arr3[]=
f.list(new FilenameFilter() {
@Override
//形参表示文件夹里每一个文件或者文件夹的路径
public boolean accept(File dir, String name) {
File src=new File(dir,name);
//返回值表示当前路径是否保留 保留为true 不保留为false
return src.isFile()&&name.endsWith(".txt");
}
});
for(String str:arr3) System.out.println(str);
//转化成Lambda表达式
f.list((dir, name) -> {
File src=new File(dir,name);
return src.isFile()&&name.endsWith(".txt");
});
/*-----------------------------------------*/
File arr4[]=f.listFiles(new FileFilter() {
@Override
//形参是完整的每一个文件或者文件夹的路径
public boolean accept(File pathname) {
return true;
}
});
//转化成Lambda表达式
File arr5[]=f.listFiles(pathname -> true);
/*-----------------------------------------*/
File arr6[]=f.listFiles(new FilenameFilter() {
@Override
//第一个形参表示父级路径 第二个形参表示子级路径
public boolean accept(File dir, String name) {
return false;
}
});
//第一个形参表示父级路径 第二个形参表示子级路径
File arr7[]=f.listFiles((dir, name) -> name.endsWith(".txt"));
}
}
创建文件夹
要求在当前文件夹下创建一个a.txt文件
import java.io.File;
import java.io.FileFilter;
import java.io.FilenameFilter;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File f=new File("D:\\新建文件夹");
//如果文件已经存在,则创建失败
f.mkdirs();
File src = new File(f,"a.txt");
boolean b=src.createNewFile();
if(b) System.out.println("创建成功");
else System.out.println("文件已经存在,创建失败");
}
}
单个文件夹查找文件
查找某一个文件夹中,是否有txt结尾的文本文档
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
File f=new File("D:\\新建文件夹");
System.out.println(have(f));
}
public static boolean have(File file){
//进入文件夹,获取里面的所有内容
File file1[]=file.listFiles();
//遍历数组获取里面的每一个元素
for (File f : file1) {
//f依次表示文件夹里每一个文件或者是文件夹路径
if(f.isFile()&&f.getName().endsWith(".txt"))
return true;
}
return false;
}
}
多个文件夹查找文件
找到电脑中所有以avi结尾的电影
搜索所有盘符 要考虑子文件夹
把大问题拆分,拆到某一个文件夹不包含其他文件夹为止
用递归来实现
找到子文件夹了就再扔到递归里面
import java.io.File;
import java.io.IOException;
public class Main {
public static void main(String[] args) throws IOException {
//将盘符获取到数组里
File arr[]=File.listRoots();
//通过增强for循环来将数组里的每一个文件对象作为参数传入find函数
for (File f:arr)find(f);
}
public static void find(File file){
//进入文件夹,获取里面的所有内容
File file1[]=file.listFiles();
//判断文件夹是否为空 如果不是空文件夹则进入
if (file1!=null){
//遍历文件夹
for(File f:file1){
//如果是文件
if(f.isFile()){
//获取文件名并进行判断
String name=f.getName();
if(name.contains(".txt"))
System.out.println(f);
}
//如果是文件夹 采用递归的方式
else {
find(f);
}
}
}
}
}
删除一个多级文件夹
如果我们要删除一个有内容的文件
先删除一个文件夹里的所有内容
再删除自己
其中删除不了无法直接删除的内容(在其他文件中已打开或是没有访问权限等等)
import java.io.File;
public class Main {
public static void main(String[] args) {
File file=new File("D:\\新建文件夹");
delete(file);
}
public static void delete(File src){
//把文件夹内部所有的文件和文件夹放到数组里面去
File files[]=src.listFiles();
//遍历每一个文件
for(File file:files){
if(file.isFile())//如果是文件,直接删除
file.delete();
else delete(file);//如果是文件夹,递归
}
src.delete();
}
}
统计文件夹的大小
统计一个文件夹的总大小
文件夹的总大小说白了就是文件夹里所有文件的大小
import java.io.File;
import java.util.GregorianCalendar;
public class Main {
//public static long len=0;//定义在外面
public static void main(String[] args) {
File file=new File("D:\\新建文件夹");
System.out.println(getlen(file));
}
public static long getlen(File src){
long len=0;
//定义变量进行累加
//得到每一个文件夹
File files[]=src.listFiles();
for(File file:files){
if(file.isFile())
//如果是文件累加
len+=file.length();
else
//如果是文件夹,递归
len+=getlen(file);
}
return len;
}
}
统计每种文件的个数
考虑子文件夹
File 递归 Map集合
写一个方法
参数是要统计的那个文件夹
返回值是用来统计map集合的
键:后缀名
值:出现次数
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static void main(String[] args) {
File file=new File("D:\\新建文件夹");
HashMap<String,Integer>hm=getCount(file);
System.out.println(hm);
}
public static HashMap<String,Integer> getCount(File src){
HashMap<String,Integer>hm=new HashMap<>();
//定义集合来统计
File[] files=src.listFiles();
//进入文件夹src
for(File file:files){
//如果是文件,进行统计
if(file.isFile()){
String name=file.getName();
String arr[]=name.split("\\.");
if(arr.length>=2){
String endName=arr[arr.length-1];
if(hm.containsKey(endName)){
//存在
int count=hm.get(endName);//把值拿出来
count++;//自增
hm.put(endName,count);//再放回去
}
else {
//第一次出现
hm.put(endName,1);
}
}
}
else {
//如果是文件夹,进行递归 自己调用自己
HashMap<String,Integer>sonMap=getCount(file);
//sonMap是子文件夹中每一种文件的个数
//遍历sonMap把里面的数值都累加到hm当中
Set<Map.Entry<String,Integer>>entries=sonMap.entrySet();
for (Map.Entry<String, Integer> entry : entries) {
//获取键值对对象
String key=entry.getKey();
int value=entry.getValue();
if(hm.containsKey(key)){
//存在
int count=hm.get(key);//count是从hm获取出来的数值
count+=value;//value是从sonMap中获取出来的值
hm.put(key,count);//放进去,覆盖
}
else{
//不存在
hm.put(key,value);
}
}
}
}
return hm;
}
}
标签:千行,System,文件夹,File,import,new,JavaSE,public
From: https://blog.csdn.net/qq_30500575/article/details/139236954