Java核心API之File使用技巧
1、CPU,内存和硬盘之间的关系
在讲述File对象之前,简单的介绍一下CPU,内存和硬盘之间的关系,深入了解可以自行翻阅资料。
CPU:中央处理器,处理指令和各种数据,通俗讲就像人类的心脏一样,处理数据流。
内存:内存储器,暂时存放CPU要运算的数据,性能要求相对较高。
硬盘:又称磁盘,可以永久的存储数据,但是运算速度较内存低。
如果CPU需要处理数据,直接从硬盘读取,硬盘虽然大,但运算速度低,这样可以导致CPU使用率不高。所以,将CPU要处理的数据,从硬盘取出暂时放在内存上,CPU直接与内存交互,提高CPU使用率,也提高了电脑运行速率。当内存资源不如时,再从硬盘读取数据暂存放内存。

2、File对象的介绍
在Java程序开发过程中,有时需要访问磁盘数据或存储数据,比如,游戏的状态就是存储到磁盘上的,每一次登录需要访问数据显示游戏状态。
下面都是干货。
java.io包下有许多io(输入/输出)对象,其中包括java.io.File对象,该对象用于表示文件(目录),也就是说程序员可以通过File类在程序中操作硬盘上的文件和目录的。File对象有许多方法,不一一列举,主要介绍几个在项目中比较常用的方法。

3、创建File对象
/*
* new File(String pathname)
* 通过文件路径创建对象
*/
@Test
public void testNewFile(){
File file = new File("demo"+File.separator+"test.txt");
System.out.println(file);
}
/*
* new File()
* 通过父文件对象和子文件路径创建对象
*/
@Test
public void testNewFile2(){
File parent = new File("demo");
File file = new File(parent,"test.txt");
System.out.println(file);
}
File类有许多构造方法,上面是其中两例,有感兴趣的朋友可以深入学习一下。
注意:为了屏蔽平台(window,linux等)差异带来的影响,文件路径分隔符建议用File.separator。

4、isFile()判断当前File对象是否为文件
/*
*boolean isFile()
*判断当前当前File对象是否为文件
*/
@Test
public void testIsFile(){
File file = new File("demo"+File.separator+"test.txt");
boolean flag = file.isFile();
System.out.println(file+"是否文件:"+flag);
File file2 = new File("demo"+File.separator+"test2.txt");
boolean flag2 = file2.isFile();
System.out.println(file2+"是否文件:"+flag2);
}
isFile()判断File对象是否是文件,有别于isDirectory()方法。

5、isDirectory()方法判断当前File对象是否为目录
/*
*boolean isDirectory()
*判断当前当前File对象是否为目录
*/
@Test
public void testIsDirectory(){
File file = new File("demo"+File.separator+"a");
boolean flag = file.isDirectory();
System.out.println(file+"是否目录:"+flag);
File file2 = new File("demo"+File.separator+"b");
boolean flag2 = file2.isDirectory();
System.out.println(file2+"是否目录:"+flag2);
}
一般结合isFile()方法可以判断File对象是文件还是目录,然后进行业务处理。

6、exists()判断路径名表示的文件是否存在
/*
* boolean exists()
* 判断路径名表示的文件/目录是否存在
*/
@Test
public void testExists() throws IOException {
File file = new File("demo"+File.separator+"test.txt");
if(!file.exists()){
file.createNewFile();
}
System.out.println("创建文件完成");
}
该方法常用于创建文件或目录时进行判断,如果文件或目录不存在则进行相应的业务处理。

7、createNewFile()方法创建新文件
/*
* boolean createNewFile()
*方法用于创建新文件,创建成功返回true,否则返回false
*/
@Test
public void testCreateNewFile() throws IOException {
File file = new File("demo"+File.separator+"test.txt");
boolean flag = false;
if(!file.exists()){
flag = file.createNewFile();
if(flag){
System.out.println("创建文件成功");
}else{
System.out.println("创建文件失败");
}
}
}
createNewFile()只负责创建文件,不创建目录,创建成功返回true,否则返回false。

8、mkdir()创建路径名指定的目录
/*
* boolean mkdir()
* 用于创建文件路径名指定的目录
*/
@Test
public void testMkdir(){
File file = new File("demo");
boolean flag = file.mkdir();
System.out.println("目录是否创建成功:"+flag);
}
mkdir()与mkdirs()的区别,mkdir()创建一个目录,mkdirs()将路径名不存在的目录都创建出来

9、mkdirs()用于创建路径名指定的所有目录
/*
* boolean mkdirs()
* 用于创建文件路径名指定的所有目录
*/
@Test
public void testMkdirs(){
File file = new File("demo"
+File.separator+"a"
+File.separator+"b");
boolean flag = file.mkdirs();
System.out.println("目录是否创建成功:"+flag); }
注意:mkdir()创建失败时也有可能已经成功创建了一部分目录。

10、delete()删除路径名表示的文件或目录
/*
* boolean delete()
* 用于删除路径名指定的文件或目录
*/
@Test
public void testDelete(){
File file = new File("demo"+File.separator+"test.txt");
file.delete();
}
注意:当delete()方法删除目录时,只有目录为空的情况下才可以删除成功。


11、listsFiles()返回路径名指定的目录所有子项文件或目录
/*
* File[] listFiles()
* 返回抽象路径表示的目录所有子项,包括文件或目录
*/
@Test
public void testListFiles(){
File file = new File("demo");
File[] files = file.listFiles();
for(int i=0; i<files.length;i++){
System.out.println(files[i].getName());
}
}

12、FileFilter用于抽象路径名的过滤器
/*
* FileFilter接口用于抽象路径名的过滤
*/
@Test
public void testFileFilter(){
File file = new File("demo");
File[] files = file.listFiles(new FileFilter(){
@Override
public boolean accept(File fil){
return fil.getName().endsWith(".txt");
}
});
for(int i=0; i<files.length;i++){
System.out.println(files[i].getName());
}
}
将此接口传递给File类中listFiles()方法,用于获取满足过滤条件的子项。
