文件操作和IO-2 使用Java操作文件
Java操作文件的API
1、针对文件系统的操作。包括但不限于:创建文件、删除文件、重命名文件、列出目录内容……
2、针对文件内容的操作。读文件/写文件
Java中针对文件的操作,使用File类来进行操作,这个类被存储在java.io这个包里面。
i:input,输入。 o:output,输出。
数据从硬盘写到CPU叫输入,数据从CPU写回硬盘叫输出。
File概述
属性
这两种属性是文件路径的表示,可以表示为字符串类型或者字符类型,依赖于路径分隔符,实际开发中多使用“\”进行分隔。
构造方法
大多数情况下,我们使用第二种构造方法。
构造一个File对象,需要指定路径。此处的路径可以说绝对路径也可以是相对路径(也可以是不存在的路径)
写作相对路径就会产生两种情况:
1、如果是直接在idea中运行程序,此时工作目录就是我们项目所在的目录。
2、如果是把代码打包成一个单独的jar包来执行,此时工作目录就是jar包所在的目录。
如果是其他两种方式的话,例如:对于C:\User\寻梦缘6\test.txt,它的父目录:C:\User\寻梦缘6
方法
getParent/getName/getPath/getAbsolutePath/getCanonicalPath
示例代码:
刚才我们在C盘下的User目录的寻梦缘6目录中有一个test.txt文件,使用它的绝对路径当作参数传入File中。
import java.io.File;
import java.io.IOException;public class FileDemo1 {public static void main(String[] args) throws IOException {File file = new File("C:/User/寻梦缘6/test.txt");//获取当前文件的名字System.out.println(file.getName());//获取当前文件的父亲目录System.out.println(file.getParent());//获取当前文件对象的路径System.out.println(file.getPath());//获取当前文件的绝对路径(简化版)System.out.println(file.getCanonicalPath());//获取当前文件的绝对路径System.out.println(file.getAbsolutePath());}
}
打印结果如下:
此时我们可以看到:在绝对路径下,getPath()、getAbsolutePath()和getCanonicalPath()结果都是差不多的。
当我们改为相对路径时又会出现什么情况呢?
代码如下:
import java.io.File;
import java.io.IOException;public class FileDemo1 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");//获取当前文件的名字System.out.println(file.getName());//获取当前文件的父亲目录System.out.println(file.getParent());//获取当前文件对象的路径System.out.println(file.getPath());//获取当前文件的绝对路径(简化版)System.out.println(file.getCanonicalPath());//获取当前文件的绝对路径System.out.println(file.getAbsolutePath());}
}
运行结果如下:
观察打印结果发现:
这里的getParent()方法只打印了一个 .来表示父目录。getPath()方法打印的是File构造方法中的参数,最后,我们发现getAbsolutePath方法和下面的getConicalPath方法就是打印的是我们当前Java进程所在的路径再加上当前的文件的名字。再仔细观察,我们可以发现getAsbolutePath方法比getCanoicalPath方法多了一个点,这个.就表示当前的路径,相当于原地踏步了一下,而getCanoicalPath方法的到的就是上面绝对路径简化的结果,就没有那个点了。
exists/isFile/isDirectory/createNewFile
代码如下:
import java.io.File;
import java.io.IOException;public class FileDemo2 {public static void main(String[] args) throws IOException {File file = new File("./test.txt");//判断当前file对象是否存在System.out.println(file.exists());//判断当前file对象是否是文件System.out.println(file.isFile());//判断当前file对象是否是目录System.out.println(file.isDirectory());//创建文件对象boolean ret = file.createNewFile();System.out.println("是否成功创建对象"+ret);}
}
注意 :在使用createNewFile时需要抛出IOException(这是文件IO经常会涉及到的异常)。
第一次运行结果如下:
可以看到在file对象没有创建前,当前file对象不存在,不存在就不是文件也不是目录了。最后,再创建当前flie对象,我们可以再左侧项目那里看到:我们当前的文件对象已经被创建好了。
再次运行,结果如下:
可以看到当前file对象存在,且它是文件,不是目录,无法成功创建file对象了(一个文件只能被创建一次)。
delete 和 deleteOnExit
delete用来直接删除文件:
import java.io.File;public class FileDemo3 {public static void main(String[] args) {File file = new File("./test.txt");boolean ret = file.delete();System.out.println(ret);}
}
运行结果: 可以看到,刚才还在项目里的test文件消失了:
deleteOnExit 等到进程结束再对文件进行删除:
先再创建好一个test文件:
代码如下:
import java.io.File;public class FileDemo4 {public static void main(String[] args) throws InterruptedException {File file = new File("./test.txt");file.deleteOnExit();Thread.sleep(5000);}
}
为了让代码效果演示更明显(突出和delete的区别),我们这里让main线程sleep个5s再退出。
可以看到,在5s后文件消失:
退出后再删除,这样的文件,也被称为“临时文件”。我们的Word文档就会有一个临时文件 ,点击此电脑,打开查看中的显示,将隐藏的项目打开。
此时随便打开一个Word文档,就可以看到:
那么这个临时文件的作用是什么呢?我们正在编辑的内容,都是在内存中的,如果我们的电脑(台式机)突然断电,内存数据就没有了。这个临时文档会将我们正在编写的内容存到这个临时文件中,借助这个临时文件就可以恢复断电之前的数据。
list/listFiles
list会返回File对象目录下的所有文件名,而listFiles则会返回File对象目录下的所有文件名的相对路径。
测试代码:
import java.io.File;
import java.util.Arrays;public class FileDemo5 {public static void main(String[] args) {File file = new File(".");//返回当前路径的所有文件名System.out.println(Arrays.toString(file.list()));//返回当前路径的所有文件的相对路径System.out.println(Arrays.toString(file.listFiles()));}
}
运行结果:
mkdir/mkdirs
mrdir创建File对象为代表的目录:
import java.io.File;public class FileDemo6 {public static void main(String[] args) {File file = new File("./aaa");boolean ret = file.mkdir();System.out.println(ret);}
}
运行结果:
mkdirs可以用来创建中间目录:
比如,我们想要在刚才的aaa下创建bbb,再在bbb下创建ccc,就可以这么写:
import java.io.File;public class FileDemo7 {public static void main(String[] args) {File file = new File("./aaa/bbb/ccc");boolean ret = file.mkdirs();System.out.println(ret);}
}
运行结果如下:
renameTo
renameTo可用于文件改名,也可以用于修改文件路径,相当于重构。
先准备好我们要操作的文件:
代码如下:
import java.io.File;public class FileDemo8 {public static void main(String[] args) {File file = new File("./test.txt");File file1 = new File("./test2.txt");System.out.println(file.renameTo(file1));}
}
结果如下:
下面我们再使用removeTo方法将该test2文件放到刚才的aaa/bbb/ccc目录下。
代码如下 :
import java.io.File;public class FileDemo9 {public static void main(String[] args) {File file = new File("./test2.txt");File file1 = new File("./aaa/bbb/ccc/test2.txt");System.out.println(file.renameTo(file1));}
}
结果如下: