File类总结
最近一直在忙项目,所以没有及时更新小知识,今天就为大家讲一下file的知识点。首先呢,我们需要了解文件路径的概念。文件路径就是文件在电脑中的位置,表示文件路径的方式有两种:相对路径和绝对路径。相对路径是指目标相对于当前文件的路径,例如:“./index.html”。绝对路径:从盘符开始的路径或者网址的全路径,例如“C:\windows\system32\cmd.exe”或者“https://blog.csdn.net/Qingai521”。
相对路径表示的方法:
- ./ :代表文件所在的目录(可以省略不写)
- ../ :代表文件所在的父级目录
- ../../ :代表文件所在的父级目录的父级目录
- / :代表文件所在的根目录
File构造方法
注意:File没有无参构造方法, 因为创建一个File对象必须要指向某个路径才行,而这个路径就是调用有参构造方法传入的。
File(String pathname):根据一个路径得到File对象。
File(String parent, String child):根据一个目录和一个子文件/目录得到File对象
File(File parent, String child):根据一个父File对象和一个子文件/目录得到File对象
代码演示:
public static void demo1() {
File file = new File("F:\\double\\video\\today.avi");//绝对路径
System.out.println(file.exists());
File file2 = new File("xxx.txt"); //相对路径 相对于项目而言
System.out.println(file2.exists());
File file3 = new File("yyy.txt"); //相对路径 相对于项目而言
System.out.println(file3.exists());
}
public static void demo2() {
String parent = "F:\\double\\video";
String child = "today.avi";
File file = new File(parent,child);
System.out.println(file.exists());
}
public static void main(String[] args) {
File parent = new File("F:\\double\\video");
String child = "today.avi";
File file = new File(parent, child);
System.out.println(file.exists());
System.out.println(parent.exists());
}
File创建功能
public boolean createNewFile():创建文件,如果存在这样的文件,就不创建了;
public boolean mkdir()//只会建立一级的文件夹;
public boolean mkdirs():创建文件夹,如果父文件夹不存在,会帮你创建出来;
代码演示:
public static void main(String[] args) throws IOException {
File dir1 = new File("aaa");
System.out.println(dir1.mkdir());//创建成功则返回true,如果该目录存在则返回false
File dir2 = new File("bbb.txt");//这样写是可以的,文件夹也是可以有后缀的
System.out.println(dir2.mkdir());//虽然传入的是"bbb.txt",但是创建的是文件夹
File dir3 = new File("ccc\\ddd");
System.out.println(dir3.mkdirs()); //创建多级目录
}
public static void demo() throws IOException {
File file = new File("yyy.txt");
System.out.println(file.createNewFile());//如果没有就创建,返回true
File file2 = new File("zzz");
//可以不写后缀,创建成功则返回true;如果文件已经存在 就返回false
System.out.println(file2.createNewFile());
}
File删除功能
public boolean delete():删除文件或者文件夹
注意:Java中的删除不走回收站;要删除一个文件夹,请注意该文件夹内不能包含文件或者文件夹。
代码演示:
public static void main(String[] args) {
File file1 = new File("yyy.txt");
System.out.println(file1.delete());//删除文件
File file2 = new File("aaa");
System.out.println(file2.delete());//删除文件夹
File file3 = new File("ccc"); //如果删除一个文件夹,那么文件夹必须是空的
System.out.println(file3.delete());
}
File重命名功能
public boolean renameTo(File dest):把文件重命名为指定的文件路径
注意:如果路径名相同,就是改名;如果路径名不同,就是改名并剪切。
代码演示:
public static void demo() {
File file1 = new File("ooo.txt");
File file2 = new File("D:\\xxx.txt");
System.out.println(file1.renameTo(file2)); //不同路径,剪切并改名;改名成功则返回true
}
File判断功能
public boolean isDirectory():判断是否是目录
public boolean isFile():判断是否是文件
public boolean exists():判断是否存在
public boolean canRead():判断是否可读
public boolean canWrite():判断是否可写
public boolean isHidden():判断是否隐藏
注意:windows系统认为所有的文件都是可读的;canWrite() 与windows系统文件的“只读”属性有关;isHidden() 与windows系统文件的“隐藏”属性有关
代码演示:
public static void main(String[] args) {
File file = new File("zzz");
file.setReadable(false);
System.out.println(file.canRead()); //windows系统认为所有的文件都是可读的
file.setWritable(true);
System.out.println(file.canWrite()); //windows系统可以设置为不可写
File file2 = new File("aaa.txt");
System.out.println(file2.isHidden()); //判断是否是隐藏文件
System.out.println(file.isHidden());
}
public static void demo() {
File dir1 = new File("ccc");
System.out.println(dir1.isDirectory()); //判断是否是文件夹
File dir2 = new File("zzz");
System.out.println(dir2.isDirectory());
System.out.println(dir1.isFile()); //判断是否是文件
System.out.println(dir2.isFile());
}
File获取功能
-
public String getAbsolutePath():获取绝对路径
-
public String getPath():获取路径
-
public String getName():获取名称
-
public long length():获取长度。字节数
-
public long lastModified():获取最后一次的修改时间,毫秒值
-
public String[] list():获取指定目录下的所有文件或者文件夹的名称数组
-
public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组
注意:getPath() 获取的是构造方法里面传入的路径
代码演示:
public static void main(String[] args) {
File dir = new File("F:/double/day/video");
String[] arr = dir.list(); //获取F:/double/day/video下所有的文件和文件夹的名称
for (String string : arr) {
System.out.println(string);
}
File[] subFiles = dir.listFiles();
for (File file : subFiles) { //获取F:/double/day/video下所有的文件和文件夹对象
System.out.println(file);
}
}
public static void demo() {
File file1 = new File("ccc.txt");
File file2 = new File("D:\\double\\day\\ccc.txt");
System.out.println(file1.getAbsolutePath()); //获取绝对路径
System.out.println(file2.getAbsolutePath());
System.out.println(file1.getPath()); //获取构造方法中传入路径
System.out.println(file2.getPath());
System.out.println(file1.getName()); //获取文件或者文件的名字
System.out.println(file2.getName());
System.out.println(file1.length());
Date d = new Date(file1.lastModified()); //文件的最后修改时间
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
System.out.println(sdf.format(d));
}
案例:获取指定目录下以.jpg结尾的文件
public static void main(String[] args) {
File dir = new File("E:\\");
//方法一
File[] subFiles = dir.listFiles(); //获取e盘下所有的文件或文件夹对象
for (File subFile : subFiles) {
//判断是否是文件 判断文件的名字是否以.jpg结尾
if(subFile.isFile() && subFile.getName().endsWith(".jpg")) {
System.out.println(subFile); //这样方法就只能获取到以.jpg结尾的文件
}
}
//方法二
String[] arr = dir.list(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
//dir就是new File("E:\\")对象。name 就是E盘下每个文件和文件夹的名字
File file = new File(dir, name); //把E盘下每个文件名称封装成File对象
return file.isFile() && file.getName().endsWith(".jpg");//判断E盘下每个文件对象 是否是文件 判断文件的名字是否以.jpg结尾
}
});
for (String string : arr) {
System.out.println(string);
}
}
文件名称过滤器的使用源码分析
public File{
public String[] list(FilenameFilter filter) { //filter接收我们传入的文件名称过滤器对象(也就是传入的匿名内部类)
String names[] = list(); //获取this对象下所有的文件和文件夹的名字存到names[]数组中
if ((names == null) || (filter == null)) {//判断文件过滤器是否为null
return names;
}
//创建一个ArrayList集合,用来保存文件名称过滤器过滤出来的文件名称
List<String> v = new ArrayList<>();
for (int i = 0 ; i < names.length ; i++) {//遍历names[]数组
if (filter.accept(this, names[i])) {//用传入的文件名称过滤器对象(也就是传入的匿名内部类)调用accept方法(就是匿名内部类中重写的方法),并且传入this和this对象下每个文件和文件夹的名字,看是否符合过滤器过滤条件
v.add(names[i]); //如果符合过滤器过滤条件 就添加到集合中
}
}
return v.toArray(new String[v.size()]);//把集合转成数组并返回
}
}
好了今天就先说到这了,明天继续。想了解更多学习知识,请关注微信公众号“阿Q说”,获取更多学习资料吧!你也可以后台留言说出你的疑惑,阿Q将会在后期的文章中为你解答。每天学习一点点,每天进步一点点。