File
File简述
File类是java.io包下的,代表与平台无关的文件或目录,不管是文件还是目录都是通过File来操作的。
File对于文件或目录可以完成新建、删除、重命名、查看属性等操作,但是不可以访问文件的内容,访问文件的内容必须使用IO流。
创建File实例
File类一般情况下是使用一个表示路径的字符串来创建实例。表示路径的字符串可以是绝对路劲也可以是相对路径。
public static void main(String[] args) {
//相对路径实例化File,相对路径是相对于项目的工作目录
//可以使用System.getProperty("user.dir")获取工作目录,不要想当然地认为
File pomFile1 = new File("pom.xml");
//绝对路径实例化File
//这是在windows平台下的路径字符串
//在linux下表示路径的字符串可能是这个样子 /IdeaProject3/fileLearn/pom.xml
File pomFile2 = new File("E:\\IdeaProject3\\filelearn\\pom.xml");
//同样是绝对路径实例化File
//File.separator根据不同的平台自动决定分隔符
File pomFile3 = new File(System.getProperty("user.dir") + File.separator + "pom.xml");
//使用File(String parent,String child)构造函数来实例化,前一个参数是父路径
File pomFile4 = new File(System.getProperty("user.dir"), "pom.xml");
//上面的四个File实例都表示的是同一个文件,即工作目录下的pom.xml
}
访问File路径的相关方法
面对一个File,我们常常会想要获得一些关于它路径的信息,比如:
- 获取一个File对应的文件或目录的名字
- 获得File对应文件所在的目录或者File对应目录的父目录
- 对于一个使用相对路径创建的File实例,获得这个File的绝对路径
public static void main(String[] args){
//使用相对路径来实例化一个File
File pomFile = new File("./pom.xml");
//获取File对应的路径字符串
System.out.println(pomFile.getPath());// ./pom.xml
//获取File的文件名或者目录名
System.out.println(pomFile.getName());// pom.xml
//获取File的文件所在目录或目录的父目录
System.out.println(pomFile.getParent());// .
}
可以发现,这些方法在获取路径的相关信息时仅仅是根据实例化File时使用的字符串进行简单的解析而已,并不够智能。看一个比较极端的例子:
File file = new File(".");
System.out.println(file.getParent());//null
当前目录“.”的父路径居然时null,这显然不符合逻辑。
因此更稳妥一点的方法是在获取路劲信息之前首先要将File转换成绝对路径:
public static void main(String[] args){
//使用相对路径来实例化一个File
File pomFile = new File("./pom.xml");
//获取File对应的路径字符串
System.out.println(pomFile.getAbsoluteFile().getPath());// E:\IdeaProject3\filelearn\.\pom.xml
//获取File的文件名或者目录名
System.out.println(pomFile.getAbsoluteFile().getName());// pom.xml
//获取File的文件所在目录或目录的父目录
System.out.println(pomFile.getAbsoluteFile().getParent());// E:\IdeaProject3\filelearn\.
}
现在路径信息逻辑上已经不存在问题了,但是还有一个问题,就是路径信息中存在“.”,这样好像也不太好,如果想要彻底消除“.”获得一个规范的路劲字符串,那么使用另一个函数:
public static void main(String[] args) throws IOException {
//使用相对路径来实例化一个File
File pomFile = new File("./pom.xml");
//获取File对应的路径字符串
System.out.println(pomFile.getCanonicalFile().getPath());// E:\IdeaProject3\filelearn\pom.xml
//获取File的文件名或者目录名
System.out.println(pomFile.getCanonicalFile().getName());// pom.xml
//获取File的文件所在目录或目录的父目录
System.out.println(pomFile.getCanonicalFile().getParent());// E:\IdeaProject3\filelearn
}
判断File是否存在
实例化File之后并不代表这个File存在于计算机之中,可以使用下面的方法判断File是否存在以及File的类型:
public static void main(String[] args) throws IOException {
File file = new File(".");
String fileName = file.getCanonicalFile().getName();
if(file.exists()){//判断File是否存在
if(file.isFile()){//判断是否是文件
System.out.println(fileName + "是一个文件");
}else if (file.isDirectory()){//判断是否是目录
System.out.println(fileName+"是一个目录");
}else {
System.out.println(fileName+"是未知文件类型");
}
}else {
System.out.println(fileName+"不存在于计算机中");
}
}
File创建文件或目录
如果File的实例化对象不存在于计算机中,那么使用File之前必须创建一个文件或者目录。但是Java并不知道这个File是文件还是目录,决定权在于用户。
创建目录
public static void main(String[] args){
File newDir = new File("./parent/dir");
//mkdir()创建目录,但是如果父目录不存在就会创建失败返回false
if(!newDir.mkdir()){
newDir.mkdirs();//mkdirs()级联创建目录包括其父目录
}
}
创建文件
public static void main(String[] args){
File newFile = new File("./dir/newFile");
if(!newFile.exists()){//确定文件不存在,文件不存在才需要创建文件
try {
File parentDir = newFile.getCanonicalFile().getParentFile();
//判断文件的父目录是否存在如果不存在先创建
if(!parentDir.exists()){
parentDir.mkdirs();
}
newFile.createNewFile();//创建文件
} catch (IOException e) {
e.printStackTrace();
}
}
}
执行完成之后就会看到在工作目录下多了一个新文件newFile。
创建临时文件
public static void main(String[] args){
try {
//创建一个临时文件,临时文件保存在默认的目录
File tempFile = File.createTempFile("pre", "tmp");
tempFile.deleteOnExit();//设置在程序运行结束之后删除这个临时文件
PrintStream printStream = new PrintStream(tempFile);
printStream.println("hello tempFile\r\n");
Scanner scanner = new Scanner(new FileInputStream(tempFile));
String str = scanner.nextLine();
System.out.println(str);//hello tempFile
//虽然可以从文件中读取到字符串,但是程序执行完之后在磁盘上永远找不到这个文件
} catch (IOException e) {
e.printStackTrace();
}
}
File有一个静态的方法可以创建临时文件,临时文件在程序执行结束之后就被自动删除了,所以程序运行结束之后不会再磁盘上找到这个文件。
File常见操作
现在File要么是磁盘上确实存在的文件或目录,要么就是已经被我们创建。现在就可以进行一些常见的操作了。
列出目录下所有的项
list()方法可以将目录下所有的项以字符串形式返回。
下面列出当前目录下所有的项:
public static void main(String[] args){
File dir = new File(".");
String[] list = dir.list();
for(String str:list){
System.out.println(str);
}
//.idea
//dir
//filelearn.iml
//newFile
//pom.xml
//src
//target
}
list()方法还可以传入一个过滤器,过滤掉不感兴趣的文件,例如下面的方法只列出当前目录下的目录:
public static void main(String[] args){
File dir = new File(".");
class CustomeFilter implements FilenameFilter{
public boolean accept(File dir, String name) {
if(new File(name).isDirectory()){
return true;
}else {
return false;
}
}
}
String[] list = dir.list(new CustomeFilter());
for(String str:list){
System.out.println(str);
}
//.idea
//dir
//src
//target
}
获取文件的最后修改时间
public static void main(String[] args){
File file = new File("pom.xml");
long lastModified = file.lastModified();
Date time = new Date(lastModified);
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
System.out.println(dateFormat.format(time));
}
移动文件或目录
public static void main(String[] args){
//dir是工作目录下的一个目录
File file = new File("dir");
//这个File代表新的路径
File dest = new File("../dir");
file.renameTo(dest);
}
renameTo(File dest)方法既可以移动文件也可以移动目录,即使目录中存在子目录和文件也一样可以。当然也可以使用这个方法来进行重命名。
计算文件或目录的大小
public static void main(String[] args){
File file = new File("pom.xml");
System.out.println(file.length());//以字节返回文件的大小
}
注意:文件的大小和文件的实际占用空间是不一样的,这是因为在存储过程中文件不是以字节为单位进行存储的,实际占用空间大小往往大于文件的大小。一般较小的文件两者差别会很大,而文件足够大的话则差别较小。
不要使用length()方法计算目录的大小,你不会获得你想要的结果。如果有这个需求需要结合listFile()方法递归计算:
public static void main(String[] args) {
File dir = new File(".");
try {
System.out.println(size(dir));
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static long size(File dir) throws FileNotFoundException {
if(!dir.exists()) throw new FileNotFoundException();
if(dir.isFile()){
return dir.length();
}
else {
File[] files = dir.listFiles();
long size=0;
for (File file:files){
size+=size(file);
}
return size;
}
}
这个方法既可以计算目录的大小也可以计算文件的大小。
删除文件或目录
delete()删除一个文件或者一个空目录,如果这个目录非空则返回false表示无法删除。
现在设计一个方法可以删除一切文件或目录包括非空目录:
public static void main(String[] args) {
File dir = new File("./dir");
forceDelete(dir);
}
public static void forceDelete(File file){
if(!file.delete()){
File[] files = file.listFiles();
for (File f:files){
forceDelete(f);
}
file.delete();
}
}
暂时就想到这么多了,其他的以后再补充吧。