一、File概述
IO流是用来操作数据的,而文件是保存数据最常用的数据媒体,因此在应用程序中会经常对硬盘上的文件进行一些操作,比如创建一个文件,删除或者重命名某个文件,判断硬盘上某个文件是否存在,查询文件最后修改时间等等,针对这类操作,JDK定义了一个可以管理文件和目录的File类。
从定义看,File类是Object的直接子类,同时它继承了Comparable接口可以进行数组的排序。File类的操作包括文件的创建、删除、重命名、得到路径、创建时间等,以下是文件操作常用的函数。
二、File源码解析
- File构造方法
private File(String var1, int var2) {
this.path = var1;
this.prefixLength = var2;
}
private File(String var1, File var2) {
assert var2.path != null;
assert !var2.path.equals("");
this.path = fs.resolve(var2.path, var1);
this.prefixLength = var2.prefixLength;
}
//通过指定的一个字符串类型的文件路径来创建一个新的File对象
public File(String var1) {
if (var1 == null) {
throw new NullPointerException();
} else {
this.path = fs.normalize(var1);
this.prefixLength = fs.prefixLength(this.path);
}
}
//根据指定的一个字符串类型的父路径和一个字符串类型的子路径(包括文件名称)创建一个File对象
public File(String var1, String var2) {
if (var2 == null) {
throw new NullPointerException();
} else {
if (var1 != null) {
if (var1.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(), fs.normalize(var2));
} else {
this.path = fs.resolve(fs.normalize(var1), fs.normalize(var2));
}
} else {
this.path = fs.normalize(var2);
}
this.prefixLength = fs.prefixLength(this.path);
}
}
//根据指定的File类的父路径和字符串类型的子路径(包括文件名称)创建一个File对象
public File(File var1, String var2) {
if (var2 == null) {
throw new NullPointerException();
} else {
if (var1 != null) {
if (var1.path.equals("")) {
this.path = fs.resolve(fs.getDefaultParent(), fs.normalize(var2));
} else {
this.path = fs.resolve(var1.path, fs.normalize(var2));
}
} else {
this.path = fs.normalize(var2);
}
this.prefixLength = fs.prefixLength(this.path);
}
}
public File(URI var1) {
if (!var1.isAbsolute()) {
throw new IllegalArgumentException("URI is not absolute");
} else if (var1.isOpaque()) {
throw new IllegalArgumentException("URI is not hierarchical");
} else {
String var2 = var1.getScheme();
if (var2 != null && var2.equalsIgnoreCase("file")) {
if (var1.getAuthority() != null) {
throw new IllegalArgumentException("URI has an authority component");
} else if (var1.getFragment() != null) {
throw new IllegalArgumentException("URI has a fragment component");
} else if (var1.getQuery() != null) {
throw new IllegalArgumentException("URI has a query component");
} else {
String var3 = var1.getPath();
if (var3.equals("")) {
throw new IllegalArgumentException("URI path component is empty");
} else {
var3 = fs.fromURIPath(var3);
if (separatorChar != '/') {
var3 = var3.replace('/', separatorChar);
}
this.path = fs.normalize(var3);
this.prefixLength = fs.prefixLength(this.path);
}
}
} else {
throw new IllegalArgumentException("URI scheme is not \"file\"");
}
}
}
- File类常用方法
//判断File对象对应的文件或目录是否存在,若存在返回ture,反之返回
public boolean exists() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkRead(this.path);
}
if (this.isInvalid()) {
return false;
} else {
return (fs.getBooleanAttributes(this) & 1) != 0;
}
}
//删除File对象对应的文件或目录,若成功删除则返回true,,否则返回false。
public boolean delete() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkDelete(this.path);
}
return this.isInvalid() ? false : fs.delete(this);
}
//当File对象对应的文件不存在时,该方法将新建一个此File对象所指定的新文件,若创建成功则返回true,否则返回false
public boolean createNewFile() throws IOException {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkWrite(this.path);
}
if (this.isInvalid()) {
throw new IOException("Invalid file path");
} else {
return fs.createFileExclusively(this.path);
}
}
//返回File对象表示的文件名或者目录名(如果是目录,返回最后一级目录名)
public String getName() {
int var1 = this.path.lastIndexOf(separatorChar);
return var1 < this.prefixLength ? this.path.substring(this.prefixLength) : this.path.substring(var1 + 1);
}
//返回File对象对应的路径
public String getPath() {
return this.path;
}
//返回File对象对应的绝对路径(在Unix/Linux等系统上,如果路径是以正斜线(/)开始,,则这个路径是绝对路径;在Windows等系统上,如果路径是以从盘符开始,则这个路径是绝对路径)
public String getAbsolutePath() {
return fs.resolve(this);
}
//返回File对象对应目录的父目录(即返回的目录不包含最后一级子目录)
public String getParent() {
int var1 = this.path.lastIndexOf(separatorChar);
if (var1 < this.prefixLength) {
return this.prefixLength > 0 && this.path.length() > this.prefixLength ? this.path.substring(0, this.prefixLength) : null;
} else {
return this.path.substring(0, var1);
}
}
//判断File对象对应的文件或目录是否可读,若可读则返回true,反之返回false
public boolean canRead() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkRead(this.path);
}
return this.isInvalid() ? false : fs.checkAccess(this, 4);
}
//判断File对象对应的文件或目录是否可写,若可写则返回true,反之返回false
public boolean canWrite() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkWrite(this.path);
}
return this.isInvalid() ? false : fs.checkAccess(this, 2);
}
//判断File对象对应的是否是文件(不是目录),若是文件则返回true,反之返回false
public boolean isFile() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkRead(this.path);
}
if (this.isInvalid()) {
return false;
} else {
return (fs.getBooleanAttributes(this) & 2) != 0;
}
}
//判断File对象对应的是否是目录(不是文件),若是目录则返回true,反之返回false
public boolean isDirectory() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkRead(this.path);
}
if (this.isInvalid()) {
return false;
} else {
return (fs.getBooleanAttributes(this) & 4) != 0;
}
}
//判断File对象对应的文件或目录是否是绝对路径
public boolean isAbsolute() {
return this.scheme != null;
}
//返回1970年1月1日0时0分0秒到文件最后修改时间的毫秒值;
public long lastModified() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkRead(this.path);
}
return this.isInvalid() ? 0L : fs.getLastModifiedTime(this);
}
//返回文件内容的长度
public long length() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkRead(this.path);
}
return this.isInvalid() ? 0L : fs.getLength(this);
}
//列出指定目录的全部内容,只是列出了名称
public String[] list() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkRead(this.path);
}
return this.isInvalid() ? null : fs.list(this);
}
//返回一个包含了File对象所有子文件和子目录的File数组
public File[] listFiles() {
String[] var1 = this.list();
if (var1 == null) {
return null;
} else {
int var2 = var1.length;
File[] var3 = new File[var2];
for(int var4 = 0; var4 < var2; ++var4) {
var3[var4] = new File(var1[var4], this);
}
return var3;
}
}
//为已有的文件重新命名
public boolean renameTo(File var1) {
SecurityManager var2 = System.getSecurityManager();
if (var2 != null) {
var2.checkWrite(this.path);
var2.checkWrite(var1.path);
}
if (var1 == null) {
throw new NullPointerException();
} else {
return !this.isInvalid() && !var1.isInvalid() ? fs.rename(this, var1) : false;
}
}
//创建一个目录
public boolean mkdir() {
SecurityManager var1 = System.getSecurityManager();
if (var1 != null) {
var1.checkWrite(this.path);
}
return this.isInvalid() ? false : fs.createDirectory(this);
}
三、实例
package com.fileIO;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
public class fileIOtest1 {
public static void main(String[] args) throws IOException {
/**
* 创建
*/
//创建目录
File file = new File("src\\demo");
System.out.println("创建目录:"+file.mkdir());
//创建aa文件
File file1 = new File("src\\demo\\dd.txt");
System.out.println("创建文件:"+file1.createNewFile());
//重命名aa文件为bb文件
File file2 = new File("src\\demo\\cc.txt");
System.out.println("重命名:"+file1.renameTo(file2));
/**
* 删除
*/
System.out.println("删除目录或文件:"+file2.delete());
/**
* 判断功能
*/
//判断是否是目录
System.out.println("判断是否是目录:"+file1.isDirectory());
//判断是否是文件
System.out.println("判断是否是文件:"+file1.isFile());
//判断是否存在
System.out.println("判断是否存在:"+file1.exists());
//判断是否可读
System.out.println("判断是否可读:"+file1.canRead());
//判断是否可写
System.out.println("判断是否可写:"+file1.canWrite());
//判断是否隐藏
System.out.println("判断是否隐藏:"+file1.isHidden());
/**
* 基本获取功能
*/
//获取绝对路径
System.out.println("获取绝对路径:" + file1.getAbsolutePath());
//获取相对路径
System.out.println("获取相对路径:" + file1.getPath());
//获取名称
System.out.println("获取名称:" + file1.getName());
//获取长度
System.out.println("获取长度:" + file1.length());
SimpleDateFormat sdf = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");
//获取最后一次的修改时间
System.out.println("获取最后一次的修改时间:" + sdf.format(file1.lastModified()));
/**
* 高级获取功能
*/
//获取指定目录下的所有文件或者文件夹的名称数组
File file3 = new File("c:\\");
String[] list = file3.list();
for (String aa :list) {
System.out.println(aa);
}
//获取指定目录下的所有文件或者文件夹的File数组
File[] files = file3.listFiles();
for (File bb : files) {
System.out.println(bb.getName());
}
}
}