一.File类
File类是java.io包下的一个类,从名字就可以看出来是以文件为操作对象的.
功能可以独立的完成对文件和文件夹的操作要求,亦可以辅助java.io包下的其他流类对文件的具体操作,例如读入和写入操作.
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等。
File对象代表磁盘中实际存在的文件和目录。通过以下构造方法创建一个File对象。
// 需要借助log4j2 创建一个单独向文件中输出错误信息的log
// ①.完善配置文件 -- log4j2.xml
// 1).增加向文件输出的Appender
// 2).设置对应输出的Logger
<?xml version="1.0" encoding="UTF-8"?>
<!--
Configuration:设置配置文件根标签
status:设置系统的输出的log级别
-->
<Configuration status = "error">
<!--
Appenders: 设置输出源
-->
<Appenders>
<!--
Console:设置控制台输出
name:appender的名字(自定义)
target:设置输出格式(out / err)
-->
<Console name = "cs" target = "system_out">
<!--
设置输出格式
PatternLayout: 灵活的布局模式
-->
<PatternLayout pattern = "%d -- %msg%n" />
</Console>
<!--
设置文件输出
filename:文件的存放的地址
append:是否覆盖前面的日志文件
-->
<File name = "fl" fileName = "./log/log4j2.log" append = "false">
<PatternLayout pattern = "[%d][%l][%c] -- %msg%n" />
</File>
</Appenders>
<!-- 设置打印者 Root / logger -->
<Loggers>
<!-- 设置打印的log等级 -->
<Root level = "info">
<!-- 为输出 引用appender -->
<AppenderRef ref = "cs" />
</Root>
<Logger name = "flLog" level = "warn">
<AppenderRef ref = "fl" />
</Logger>
</Loggers>
</Configuration>
// ②.在类中创建Logger对应的Logger对象
// 该特定的Logger在使用时,便会向文件中输出错误信息
Logger flLog = LogManager.getLogger("flLog");
1.通过给定的路径字符串装换成抽象名路径创建一个File类
File(String pathname)
获取用户桌面的File实例:
// 获得桌面的绝对路径字符串
File f1 = new File("/User/**(这里填电脑的名称)/Desktop");
// 判断实例是否存在
log.info(f1.exist());
2.根据parent父类路径名字符串和child子类路径名字符串创建一个File类
File(String parent , String child)
在桌面生成一个test文件:
// 获取桌面的父级路径和创建的子级路径
File f2 = new File("/User/**(这里填电脑的名称)/Desktop" , "test");
log.info(f2.exist());
3.根据parent父类抽象路径名和child子类路径名字符串创建一个File类
File(File parent , String child)
在桌面生成一个test文件:
// 获取父类路径1中的f1和创建的子级路径
File f3 = new File(f1,"test");
log.info(f3.exist());
4..根据给定的file:uri地址装换成抽象路径名创建一个File类
File(URI uri)
在桌面生成一个test文件:
URI uri = null;
// 可能会有异常,所以需要try...catch...
try{
uri = new URI("file:///USer/**(这里填电脑的名称)/Desktop/test");
}catch(URISyntaxException e){
flLog.warn("URISyntaxException:" + e.getMessage());
}
// 可能会有异常,所以需要try...catch...
try{
File f4 = new File(uri);
}catch(IllegalArgumentException e){
flLog.warn("IllegalArgumentException:" + e.getMessage());
}
System.out.println(f4.exist());
拓展:
绝对路径根目录: /
相对路径根目录: ./
当前目录的上一级目录: ../
二.File类的方法
首先封装log类,后面都用得到
import org.apache.logging.log4j.Logger;
import org.apache.logging.log4j.LogManager;
public class Log(
public static final Logger ROOT_LOG = LogManager.getLogger();
public static final Logger FILE_LOG = LogManager.getLogger("flLog");
)
创建对象成功后,就可以使用下面的方法操作文件了.
(以一中的log4j2.xml为例:)
创建log4j2.xml实例:(括号填的是对象存在的位置)
File f1 = new File(“./src/log4j2.xml”);
1.File对象是否存在 – exist()
Log.ROOT_LOG.info(“文件存在的情况: ” + f1.exist());
2.文件的大小(单位为B) – length()
Log.ROOT_LOG.info(“文件大小为: ” + f1.length());
3.空间有关的方法
以桌面为例:
File df = new File(“/Users/**(填你电脑的名字)/Desktop”);
1).总空间大小 – getTotalSpace()
Log.ROOT_LOG.info(“总空间: ” + df.getTotalSpace());
2).空余空间大小 – getFreeSpace()
Log.ROOT_LOG.info(“空余空间: ” + df.getFreeSpace());
3).可用空间大小 – getUsableSpace()
Log.ROOT_LOG.info(“可用空间: ” + df.getUsableSpace());
4.相关判断
1).是否是文件夹 – isDirectory()
Log.ROOT_LOG.info(“桌面是文件夹吗? ” + df.isDirectory());
2).是否为文件 – isFile()
Log.ROOT_LOG.info(“log4j2.xml是文件吗? ” + f1.isFile());
3).是否为隐藏文件 – isHidden()
同样是用File创建出来的对象.isHidden使用该方法
4).是否是绝对路径 – isAbsolute()
Log.ROOT_LOG.info(“桌面是否是绝对路径获取? ” + df.isAbsolute());
5.文件本身的操作
1).获取文件名 – getName()
Log.ROOT_LOG.info(“f1的文件名为: ” + f1.getName());
2).文件全名(路径信息) – getAbsolutePath()
Log.ROOT_LOG.info(“f1的路径名为: ” + f1.getAbsolutePath());
3).获取父级名 – getParent() 和 获取父级File名 – getParentFile()
Log.ROOT_LOG.info(“f1的父级名: ” + f1.getParent());
Log.ROOT_LOG.info(“f1的父级File为: ” + f1.getParentFile());
三.File类的基础操作
1.创建文件 – createNewFile()
步骤:
1).获取存放的文件的路径
2).确定所创文件的文件名(有无后缀名)
3).创建目标文件
按照步骤写:
String path = "file03"; // 存放文件的路径
String name1 = "new1"; // 无后缀名的文件
String name2 = "new1.txt"; // 有后缀名的文件
// 使用File(File parent , String child)创建文件实例
File f1 = new File(path , "new1");// 创建无后缀名的文件实例
File f2 = new File(path , "new1.txt"); // 创建有后缀名的文件实例
boolean res = false;
try{
// 可能会创建失败,所以需要try...catch...
res = f1.createNewFile();
res = f2.createNewFile();
}catch(IOException e){
Log.FILE_LOG.warn("IOException:文件创建失败");
}
Log.ROOT_LOG.info("文件创建情况: " + res);
2.创建文件夹 – mkdir()
步骤:
1).获取存放的文件夹的路径
2).确定创建文件夹的名称(有无后缀名)
3).创建目标文件夹
String name3 = "King";// 无后缀的文件夹
String name4 = "queen.big";// 有后缀名的文件夹
// 使用File(File parent , String child)创建文件实例
File f3 = new File(path , "King");// 创建无后缀名的文件夹实例
File f4 = new File(path , "queen.big");// 创建有后缀名的文件夹实例
Log.ROOT_LOG.info("f3创建情况: " + f3.mkdir());
Log.ROOT_LOG.info("f4创建情况: " + f4.mkdir());
注意:文件 和 文件夹 创建时:
1).如果能创建,且目标不存在时,则会创建成功
2).如果不能创建,且目标存在时,则会创建失败
3.多层文件夹的创建 – makeDirs()
①.使用系统方法
File f5 = new File(path , "a/b/c");
Log.ROOT_LOG.info("多层文件夹的创建: " + makeDirs(f5));
②.使用递归
先直接创建本身,如果不能创建 -> 就优先创建本身的父级,在回头创建本身 - > 如果创建不了,重复操作
private static File makedir(File file){
// 如果文件夹存在 直接返回
if(file.exist()){
return false;
}
// 优先处理父级文件夹
// 如果父级文件夹也存在 也会被上一步骤的安全处理返回
makedir(file.getParentFile);
// 经过上一步骤父级一定能创建成功 所以可直接创建本身
return file.mkdir();
}
File f5 = new File(path , "a/b/c");
Log.ROOT_LOG.info("多层文件夹创建情况: " + makedir(f5));
4.创建多层文件夹下的目标文件
步骤:
1).如果本身文件已经存在,直接返回
2).如果本身文件夹如果存在,直接创建目标文件
3).如果不存在,就先创建父级的文件夹(们),在创建本身
private static boolean makeFile(File file){
// 如果存在直接返回false
if(file.exist()){
return false;
}
File parent = file.getParentFile();
// 已经处理了Parent存在的情况
parent.mkdirs();
try{
return file.createNewFile();
}catch(IOException e){
Log.FILE_LOG.warn("IOException: " + e.getMessage());
return false;
}
}
File f6 = new File(path , o/p/q/1.txt);
Log.ROOT_LOG.info("多层文件夹下的文件创建: " + makeFile(f6));