前言-------
学了IO流的一些操作,去年学习C++的I/O流的经验告诉我, I/O流的知识特别容易遗忘, 还好我养成了写博客的习惯,不然一两周过后就忘了...
注:转载请注明来源
目录
三.正确区分mkdir(),mkdirs(),creatNewFile()
一.什么是File类,有什么作用
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等.
我觉得用C/C++中的文件指针来理解反而比较容易,就是把FIle类类别成一个文件指针,达到操作某个文件的作用(在Java里面用引用的概念理解也是可以的)
二.使用绝对路径或者相对路径创建File对象
File类的构造函数有多个,但是我们一般使用 File(String pathname)来创建, 也就是传文件的绝对路径或者相对路径来创建.
绝对路径:一个文件或者文件夹的完整路径
相对路径:以当前Java文件所在的项目文件夹为根目录
三.正确区分mkdir(),mkdirs(),creatNewFile()
- 区分一下文件和文件夹:
文件就是.txt, .doc .java .cpp等后缀的文件, 不可能有子文件了;而文件夹可以有子文件
- 理解public boolean mkdir():
创建文件夹,不会创建文件
如果该文件夹存在就不创建了(调用file.mkdir()就会返回false)
如果该文件夹的父路径存在,那么就会创建
一级创建: D:/aa/bb/cc/dd/ee: 当D:/aa/bb/cc/dd 存在时ee才会被创建
测试代码1:当D:/aa/bb存在时,可以成功创建cc.txt
package Test;
import java.io.File;
import java.util.Date;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:/aa/bb/cc.txt");
if(!f.exists())
f.mkdir();
}
}
截图如下:创建成功
大家还有没有奇怪的地方, 就是为啥创建的不是记事本文件呢?哈哈哈,这就是我上面提到的mkdir()只能创建文件夹,所以就创建了个名字为"cc.txt"的文件夹
测试代码2: D:/aa/bb/存在,但是D:/aa/bb/xx不存在时,是无法成功创建cc.txt的
package Test;
import java.io.File;
import java.util.Date;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:/aa/bb/xx/cc.txt");
if(!f.exists())
f.mkdir();
}
}
截图如下:创建不成功
- 理解public boolean mkdirs():
创建文件夹,不会创建文件
如果该文件夹存在就不创建了(调用file.mkdirs()就会返回false)
如果文件夹不存在,会帮你补全父目录,再创建, 说白了就是可以多级创建
多级创建: D:/aa/bb/cc/dd/ee, 就算D:/aa/bb/cc/dd 没有完整地存在, 它也会自动帮你补全路径,再创建ee
测试代码: D:/aa/bb原先就存在,但是D:/aa/bb/cc/dd不存在,但是可以自动补全路径,再创建ee
package Test;
import java.io.File;
import java.util.Date;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:/aa/bb/cc/dd/ee");
if(!f.exists())
f.mkdirs();
}
}
截图如下:成功创建ee
综上:mkdirs()是万金油啊,好用,我一般都用mkdirs()
- 理解creatNewFile()
创建的是文件,不是文件夹
如果文件存在就会不创建
如果父路径不存在,那么不会创建,而且会抛出异常
如果父路径存在,但该文件不存在,会创建
测试代码:
package Test;
import java.io.File;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
File f = new File("D:/aa/bb/cc/dd/ee.txt");
if(!f.exists()) {
try {
f.createNewFile();
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
当D:/aa/bb存在, D:/aa/bb/cc/dd不存在,是无法创建ee.txt的
当D:/aa/bb/cc/dd存在,是可以成功创建ee.txt的
四.如何做到文件不存在时自动创建 (我的模板超级好用)
大家知道,每次都事先创建一个已经存在的文件夹,有时有点麻烦,毕竟人总是懒惰的. 我自己设计了一个小模板,巨好用,无论父路径是否完整存在,无论目标文件是否存在 ,都可以通吃,巨好用的模板,强烈推荐!
首先介绍一个方法:public File getParentFile()
返回此路径的父路径,如果此路径没有指定父路径,则返回 null
。
模板代码1:(创建文件)
public void checkFile(File f) {
//判断文件是否存在
if(!f.exists()) {
//不管父路径完整不完整,先用mkdirs()补全父目录
f.getParentFile().mkdirs();
}
//不管目标文件是否存在,都用creatNeaFile()创建
try {
f.createNewFile();
}catch(Exception e) {
e.printStackTrace();
}
}
模板代码2:(创建文件夹)
public void checkFile(File f) {
if(!f.exists()) {
f..mkdirs();
}
}
注:每当我们FIle f = new File(" 路径")后,我们只要再使用一次checkFile()来保证对应的文件或者文件夹被自动创建就可以了,从而避免总是先要创建一个文件
五.一些常用方法的demo
1 | public String getName() 返回由此抽象路径名表示的文件或目录的名称。 |
2 | public String getParent()、 返回此抽象路径名的父路径名的路径名字符串,如果此路径名没有指定父目录,则返回 null 。 |
3 | public File getParentFile() 返回此抽象路径名的父路径名的抽象路径名,如果此路径名没有指定父目录,则返回 null 。 |
4 | public String getPath() 将此抽象路径名转换为一个路径名字符串。 |
5 | public boolean isAbsolute() 测试此抽象路径名是否为绝对路径名。 |
6 | public String getAbsolutePath() 返回抽象路径名的绝对路径名字符串。 |
7 | public boolean canRead() 测试应用程序是否可以读取此抽象路径名表示的文件。 |
8 | public boolean canWrite() 测试应用程序是否可以修改此抽象路径名表示的文件。 |
9 | public boolean exists() 测试此抽象路径名表示的文件或目录是否存在。 |
10 | public boolean isDirectory() 测试此抽象路径名表示的文件是否是一个目录。 |
11 | public boolean isFile() 测试此抽象路径名表示的文件是否是一个标准文件。 |
12 | public long lastModified() 返回此抽象路径名表示的文件最后一次被修改的时间。 |
13 | public long length() 返回由此抽象路径名表示的文件的长度。 |
14 | public boolean createNewFile() throws IOException 当且仅当不存在具有此抽象路径名指定的名称的文件时,原子地创建由此抽象路径名指定的一个新的空文件。 |
15 | public boolean delete() 删除此抽象路径名表示的文件或目录。 |
16 | public void deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。 |
17 | public String[] list() 返回由此抽象路径名所表示的目录中的文件和目录的名称所组成字符串数组。 |
18 | public String[] list(FilenameFilter filter) 返回由包含在目录中的文件和目录的名称所组成的字符串数组,这一目录是通过满足指定过滤器的抽象路径名来表示的。 |
19 | public File[] listFiles() 返回一个抽象路径名数组,这些路径名表示此抽象路径名所表示目录中的文件。 |
20 | public File[] listFiles(FileFilter filter) 返回表示此抽象路径名所表示目录中的文件和目录的抽象路径名数组,这些路径名满足特定过滤器。 |
21 | public boolean mkdir() 创建此抽象路径名指定的目录。 |
22 | public boolean mkdirs() 创建此抽象路径名指定的目录,包括创建必需但不存在的父目录。 |
23 | public boolean renameTo(File dest) 重新命名此抽象路径名表示的文件。 |
24 | public boolean setLastModified(long time) 设置由此抽象路径名所指定的文件或目录的最后一次修改时间。 |
25 | public boolean setReadOnly() 标记此抽象路径名指定的文件或目录,以便只可对其进行读操作。 |
26 | public static File createTempFile(String prefix, String suffix, File directory) throws IOException 在指定目录中创建一个新的空文件,使用给定的前缀和后缀字符串生成其名称。 |
27 | public static File createTempFile(String prefix, String suffix) throws IOException 在默认临时文件目录中创建一个空文件,使用给定前缀和后缀生成其名称。 |
28 | public int compareTo(File pathname) 按字母顺序比较两个抽象路径名。 |
29 | public int compareTo(Object o) 按字母顺序比较抽象路径名与给定对象。 |
30 | public boolean equals(Object obj) 测试此抽象路径名与给定对象是否相等。 |
31 | public String toString() 返回此抽象路径名的路径名字符串。 |
一些方法的demo:
package Test;
import java.io.File;
import java.util.Date;
public class FileObjectTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileObjectTest myTest = new FileObjectTest();
myTest.fileTest1();
}
public void checkFile(File f) {
if(!f.exists()) {
f.getParentFile().mkdirs();
}
try {
f.createNewFile();
}catch(Exception e) {
e.printStackTrace();
}
if(!f.exists()) {
f.mkdirs();
}
}
public void fileTest1() {
//参数为绝对地址
File t1 = new File("D:/data1.txt");
//自动创建
checkFile(t1);
//判断操作的文件是否存在
System.out.println(t1.exists() ==true? "文件存在":"文件不存在");
//返回该文件的绝对地址
System.out.println(t1.getAbsolutePath());
//参数为相对地址
File t2 = new File("data2.txt");
//自动创建
checkFile(t2);
//判断操作的文件是否存在
System.out.println(t2.exists() == true? "文件存在":"文件不存在");
//返回该文件的绝对地址
System.out.println(t2.getAbsolutePath());
//返回该文件定义时的地址
System.out.println(t2.getPath());
//判断是否是文件夹
System.out.println("t2:" + t2.isDirectory());
System.out.println("t1:" + t1.isDirectory());
//判断文件长度
System.out.println("t2:" + t2.length());
System.out.println("t1:" + t1.length());
//获取文件最后修改时间
long time = t1.lastModified();
Date temp = new Date(time);
System.out.println("t1 最后的修改日期为:" + temp);
time = t2.lastModified();
temp = new Date(time);
System.out.println("t2 最后的修改日期为:" + temp);
//设置文件的修改时间
t1.setLastModified(0);
time= t1.lastModified();
temp = new Date(time);
System.out.println("t1 最后的修改日期为:" + temp);
//对文件重命名
t2.renameTo(t1);
System.out.println(t1.getName());
// 以字符串数组的形式,返回t1文件夹下的所有文件(不包含子文件及子文件夹)
String [] myList = t1.list();
for(String temp1 : myList) {
System.out.println(temp1);
}
//以File数组的形式,返回t1下的所有文件(不包括子文件的文件)
File [] myFiles = t1.listFiles();
for(File temp1 : myFiles) {
temp1.getName();
}
//以文件夹的形式获取t1文件所在的文件夹
File father = t1.getParentFile();
System.out.println(father.getName());
//删除文件
t1.delete();
t2.delete();
}
}