File类和匿名内部类

File类和匿名内部类

1. File类
1.1 File类概述
	File类是SUN公司提供给程序员用于在Java中,操作文件和文件夹的一个类。提供了针对文件和文件夹的本身操作,增删改查!!!不涉及文件内容,文件内容需要通过IO流来进行操作。
	Java中需要考虑的文件操作内容:
		1. 用户上传的文件,图片,视频,文档,音频。。。【文件上传和下载 upload 
		download】
		2. 对于开发中日志文件的操作。创建,删除和发送

文件路径问题:
	404 Source Not Found 资源未找到
	相对路径
		当前操作路径为参照物去往其他路径的最短捷径。
		. 当前工作目录
		.. 当前工作目录的上级目录 父目录
	绝对路径
		以根目录为参照的一个绝对路径。
		物理路径:
			电脑中的根磁盘 C D E F(Windows)
			Linux 系统不分区,只有一个根目录
		项目中的根目录:
			当前项目所在文件夹是整个WEB Application的根目录
1.2 File类构造方法
File(String pathName);
	根据用户指定的文件或者文件夹对应路径(相对路径,或者绝对路径),创建File类对象
File(String parent, String childName);
	根据父目录文件路径,和子文件或者子文件夹的名字,创建对应的File类对象。
File(File parent, String childName);
	根据父目录File类对象,和子文件或者子文件夹的名字,创建对应的File类对象。
package com.qfedu.a_file;

import java.io.File;

/*
 * File类构造方法
 */
public class Demo1 {
	public static void main(String[] args) {
		
		/*
		 * 开发中根据当前操作系统不同,使用的文件路径分隔符也是不同的
		 * Windows中默认的文件分隔符为 \ Windows同时兼容 /
		 * Linux和Web Application使用的路径分隔符是 /
		 * 
		 * File.separator File.separatorChar
		 * 通过当前文件系统,判断当前的操作系统环境,根据系统环境选取对应的文件分隔符。
		 */
		File file1 = new File("I:" + File.separator + "aaa/1.txt");
		File file2 = new File("I:/aaa", "bbb");
		File file3 = new File(new File("I:/aaa"), "ccc");
		
		System.out.println(file1);
		System.out.println(file2);
		System.out.println(file3);
	}
}
1.3 File类创建文件和文件夹的方法
boolean createNewFile();
	通过File对象调用,创建当前File对象对应的普通文件。这里要求文件必须带有文件后缀名。创建成功返回true,失败返回false
	失败原因:
		1. 路径不合法!盘符不存在,文件夹不存在。 
		2. 对应文件已存在
		3. 非法字符(有待验证)
		4. 对应文件夹没有写入权限。
		5. 磁盘GG思密达
		
boolean mkdir();
	通过File对象调用,创建当前File对象对应的文件夹。成功true,失败false
	失败原因:
		同上
		
boolean mkdirs();
	super 超级变态!!!
	
boolean renameTo(File dest);
	将当前File对象文件或者文件夹,转换到dest目标中,重命名,移动...
package com.qfedu.a_file;

import java.io.File;
import java.io.IOException;

/*
 * File类创建文件和文件夹的方法
 */
public class Demo2 {
	public static void main(String[] args) throws IOException {
		// 文件创建
		File file = new File("G:/aaa/你大爷的.txt");
		boolean createNewFile = file.createNewFile();
		System.out.println("createNewFile : " + createNewFile);
	
		// 文件夹创建
		File file2 = new File("G:/aaa/bbb");
		boolean mkdir = file2.mkdir();
		System.out.println("mkdir : " + mkdir);
		
		//G:\aaa\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t
		File file3 = new File("G:/aaa/b/c/d/e/f/g/h/i/j/k/l/m/n/o/p/q/r/s/t");
		boolean mkdirs = file3.mkdirs();
		System.out.println(mkdirs);
		
		// renameTo
		File src = new File("F:/aaa/不要皮.txt");
		File dest = new File("G:/aaa/bbb/皮皮虾.txt");
		
		boolean renameTo = src.renameTo(dest);
		System.out.println(renameTo);
	}
}
1.4 File类删除文件和文件夹的方法
boolean delete();
	通过File类对象调用,删除对应的文件或者文件夹
	要求:
		1. 如果删除内容是文件夹,对应文件夹中不得存在任何内容。
		2. 所有删除操作,都是直接从磁盘抹去数据,不是放入回收站。

void deleteOnExit();
	程序退出时删除调用当前方法对应的文件或者文件夹。
	用于删除程序运行过程中的日志文件,错误记录,可以节约硬盘空间
package com.qfedu.a_file;

import java.io.File;
import java.util.Scanner;

/* 
 * File类删除文件和文件夹的方法
 */
public class Demo3 {
	public static void main(String[] args) {
		File file1 = new File("G:/aaa/1.txt");
		File file2 = new File("G:/aaa/2.txt");
		
		File file3 = new File("G:/aaa/ccc");
		File file4 = new File("G:/aaa/bbb");
		
		file1.deleteOnExit();
		file3.deleteOnExit();
		
		new Scanner(System.in).nextLine();
		
	}
}
1.5 File类判断方法
boolean exists();
	判断File类对象对应文件或者文件夹是否存在
boolean isFile();
	判断File类对象对应内容是否是一个文件。
boolean isDirectory();
	判断File类对象对应内容是否是一个文件夹。
boolean isHidden();
	判断File类对象对应文件或者文件夹是否是隐藏文件。
boolean isAbsolute();
	判断File类对象创建使用的内容是否是绝对路径
package com.qfedu.a_file;

import java.io.File;

/*
 * File类判断方法
 */
public class Demo4 {
	public static void main(String[] args) {
		File file1 = new File("G:/aaa/你大爷的.txt");
		File file2 = new File("G:/aaa/bbb");
		File file3 = new File("G:/aaa/1.txt");
		
		System.out.println("文件是否存在 : " + file3.exists());
		System.out.println("是否是普通文件 : " + file3.isFile());             
		System.out.println("是否是文件夹 : " + file3.isDirectory());
		System.out.println("是否是隐藏文件 : " + file3.isHidden());
		System.out.println("是否使用绝对路径: " + file3.isAbsolute());
	}
}
1.6 File类鸡肋方法
以下方法纯无赖方法:
	String getPath();
	String getParent();	
	String getName();	
	String getAbsolutePath();	

以下方法有那么一丢丢的用
	long lastModified();
		File对象对应文件或者文件夹的最后一次修改时间
	long length();
		获取当前文件占用的硬盘字节数
		【注意】
			如果是文件夹返回值为 0L 或者 4096L
package com.qfedu.a_file;

import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Date;

/*
 * 最后一次修改时间方法和文件占用硬盘字节数
 */
public class Demo6 {
	public static void main(String[] args) {
		File file = new File("G:/aaa/你大爷的.txt");
		
		long lastModified = file.lastModified();
		// 1606115040282 1970年1月1日 00:00:00 到当前修改时间的秒数
		System.out.println(lastModified);
		
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
		
		String format = sdf.format(new Date(lastModified));
		System.out.println(format);
		
		System.out.println(file.length());
		
		System.out.println("文件夹length方法 : " + new File("G:/aaa").length());
	}
}
1.7 File类列表方法
package com.qfedu.a_file;

import java.io.File;

public class Demo7 {
	public static void main(String[] args) {
		File file = new File("D:\\Program Files\\Java\\jdk1.8.0_241");
		
		// 当前目录中的所有子文件和子文件夹名字,String类型数组
		String[] list = file.list();
		for (String string : list) {
			System.out.println(string);
		}
		
		System.out.println();
		
		// 当前目录中的所有子文件和子文件夹File对象数组
		File[] listFiles = file.listFiles();
		for (File file2 : listFiles) {
			System.out.println(file2);
		}
		
		System.out.println();
		
		// 获取Windows操作系统下的所有根盘符对应File对象
		File[] listRoots = File.listRoots();
		for (File file2 : listRoots) {
			System.out.println(file2);
		}
	}
}
1.8 FilenameFilter过滤器
FilenameFilter 文件名过滤器
需要完成的方法:
	boolean accept(File dir, String name);
	dir是当前选择操作的文件夹
	name是当前操作对应的文件名
	用于File类列表方法使用,可以在返回的String数组或者File数组中,保留满足要求的文件内容。
package com.qfedu.a_file;

import java.io.File;
import java.io.FilenameFilter;

class MyFilter implements FilenameFilter {
	@Override
	public boolean accept(File dir, String name) {
		// new File(dir, name) 根据父目录File对象和子文件名字创建对应的File对象,判断是否为普通文件
		return new File(dir, name).isFile() 
				&& name.endsWith(".java");
	}
}

public class Demo8 {
	public static void main(String[] args) {
		File file = new File("G:\\aaa\\bbb");
		
		
		String[] list = file.list(new MyFilter());
		for (String string : list) {
			System.out.println(string);
		}
	}
}
2. 匿名内部类 Anonymous Inner Type
2.1 接口和实现类关系
interface A {
	void test();
}

class TypeA implements A {
	@Override
	public void test() {
		方法实现
	}
}

TypeA类是遵从接口A,从可以实现test方法。
TypeA只是实现了test方法,是test方法实现的载体。

new TypeA().test();
2.2 匿名内部类格式
package com.qfedu.b_anonymous;

/*
 * 函数式接口,在接口有且只有一个未实现的缺省属性为abstract的方法。
 * 注解
 */
@FunctionalInterface
interface A {
	void test();
}

/*
 * TypeA类是大括号内容的名称,类名,匿名内部类就是没有类名的一个大括号。
 * 需要一个特定的格式。需要告知编译器,当前大括号内容和哪一个接口相关
 */
class TypeA implements A {

	@Override
	public void test() {
		System.out.println("low ~~~ 彦祖不会");
	}
	
}

public class Demo1 {
	public static void main(String[] args) {
		TypeA typeA = new TypeA();
		typeA.test();
		
		/*
		 * 1. 大括号中的内容是实现方法test
		 * 2. A() 所谓的接口构造方法,只是告知编译器,当前大括号里面的内容
		 * 和哪一个接口相关,或者说大括号里面的内容完成的是哪一个接口中要求的
		 * 方法。
		 * 3. new 申请内存堆区空间,并且清除所有数据空。new + 接口构造方法和
		 * 方法实现部分。创建了一个接口A的【匿名内部类】对象
		 * 
		 * so low
		 */
		A a = new A() {
			@Override
			public void test() {
				System.out.println("匿名内部类对象赋值给接口 A 的引用数据类型变量 a");
			}
		};
		
		a.test();
		
		/*
		 * little low 小low
		 * Android中大量出现
		 */
		new A() {
			@Override
			public void test() {
				System.out.println("匿名内部类对象,直接调用实现的方法");
			}
		}.test();
		
		testInnerType(new A() {
			
			@Override
			public void test() {
				System.out.println("匿名内部类的对象直接作为方法的参数!!!");
			}
		});
		
		// lambda表达式
		testInnerType(() -> System.out.println("Lambda表达式!!!"));
	}
	
	public static void testInnerType(A a) {
		a.test();
	}
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值