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 ;
public class Demo1 {
public static void main ( String [ ] args) {
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 ;
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) ;
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) ;
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 ;
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 ;
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 ( ) ;
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 [ ] list = file. list ( ) ;
for ( String string : list) {
System . out. println ( string) ;
}
System . out. println ( ) ;
File [ ] listFiles = file. listFiles ( ) ;
for ( File file2 : listFiles) {
System . out. println ( file2) ;
}
System . out. println ( ) ;
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) {
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 ;
@FunctionalInterface
interface A {
void test ( ) ;
}
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 ( ) ;
A a = new A ( ) {
@Override
public void test ( ) {
System . out. println ( "匿名内部类对象赋值给接口 A 的引用数据类型变量 a" ) ;
}
} ;
a. test ( ) ;
new A ( ) {
@Override
public void test ( ) {
System . out. println ( "匿名内部类对象,直接调用实现的方法" ) ;
}
} . test ( ) ;
testInnerType ( new A ( ) {
@Override
public void test ( ) {
System . out. println ( "匿名内部类的对象直接作为方法的参数!!!" ) ;
}
} ) ;
testInnerType ( ( ) -> System . out. println ( "Lambda表达式!!!" ) ) ;
}
public static void testInnerType ( A a) {
a. test ( ) ;
}
}