File概述
java.io.File类,具体的File类对象表示的是文件或文件目录即文件夹.在开发中,读取文件、生成文件、删除文件、修改文件的属性时经常会用到此类。
后续File类的对象常作为参数传递到流的构造器中,指明读取或写入的"节点",即从哪个文件读取内容以及写入到哪个文件中去。
File操作文件或文件夹,如查看路径,文件名,是否可读,可写,文件大小等;对于文件中的内容读取或写入则需要用io流,如在内存里需要将数据写到文件里
删除文件或文件夹,直接清空,不在回收站里;删除文件夹,则内部必须是空的,若有内容,则无法删除。
File类的使用
怎么创建对象
/*
如何创建File类的实例
*/
@Test
public void test1(){
/*
构造器1,File(String FilePath)
*/
//相对路径 ,相对于当前module
File file1 = new File("hello.txt");
//绝对路径 ,包含盘符在内的文件或文件夹目录
File file2 = new File("D:\\JAVA\\IdeaProjects\\hi.txt");
File file3 = new File("D:" + File.separator + "JAVA" + File.separator + "IdeaProjects" + File.separator + "hi.txt");
System.out.println(file1);
System.out.println(file2);
System.out.println(file3);
// D:\JAVA\IdeaProjects,Windows中识别的是这样的路径,而\在windows的java层面有转义意义
/*
构造器2,File(String parentPath,String childPath)
*/
File file4 = new File("D:\\JAVA","IdeaProjects");
System.out.println(file4);
/*
构造器3 File(File parentPath,String childPath)
*/
File file5 = new File(file4,"hi.txt");
System.out.println(file5);
System.out.println(System.getProperty("user.dir")); //输出当前工程的绝对路径
}
以FilePath为路径创建File对象,如果FilePath是相对路径,则默认的当前路径在系统属性user.dir中存储。
常见方法
@Test
public void test1(){
File file1 = new File("hello.txt");
File file2 = new File("D:\\JAVA\\io\\hi.txt");
System.out.println(file1.getAbsolutePath());
System.out.println(file1.getPath());
System.out.println(file1.getName());
System.out.println(file1.getParent());//获取上层文件目录。没有的话,返回null
System.out.println(file1.length()); //获取文件长度,字节数。不能获取目录的长度
System.out.println(file1.lastModified()); //获取最后一次的修改时间,毫秒值
System.out.println(new Date(file1.lastModified()));
System.out.println();
System.out.println(file2.getAbsolutePath());
System.out.println(file2.getPath());
System.out.println(file2.getName());
System.out.println(file2.getParent());
System.out.println(file2.length());
System.out.println(file2.lastModified());
}
上述是初次创建的结果;
当hello.txt创建并有内容后,测试
/**
* 用于文件目录
*/
@Test
public void test2(){
File file = new File("D:\\JAVA\\IdeaProjects\\base-practice");
//文件路径不存在的话,报空指针异常
String[] list = file.list();
for(String s: list){
System.out.println(s); //文件或文件目录的名字
}
File[] files = file.listFiles();
for(File file1: files){
System.out.println(file1);
}
}
/*
public boolean renameTo(File dest):把文件重命名为指定的文件路径
如file1.renameTo(file2),要想保证返回true,需要file1在硬盘中是存在的,并且file2不能在硬盘中存在
*/
@Test
public void test3(){
File file1 = new File("hello.txt");
File file2 = new File("D:\\JAVA\\io\\hi.txt");
boolean rename = file1.renameTo(file2);
System.out.println(rename);
}
重命名操作是将file1所在路径下的文件相当于剪切到file2文件所在的位置处,名字更改。
@Test
public void test4(){
File file1 = new File("hello.txt");
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());
//真实存在的文件可读可写,不存在的文件获取值都是默认值false
System.out.println();
File file2 = new File("D:\\JAVA\\io");
file2 = new File("D:\\JAVA\\io1");
System.out.println(file2.isDirectory());
System.out.println(file2.isFile());
System.out.println(file2.exists());
System.out.println(file2.canRead());
System.out.println(file2.canWrite());
System.out.println(file2.isHidden());
//不存在的目录获取值都是默认值false
}
内存中的File对象,实际硬盘中真实存在的话,各个属性显式赋值,若硬盘中不存在的话,创建对象时,除了指定的目录和路径之外,其他的属性都是取默认值
创建文件
/**
* 创建对应的文件,
* 注意,java中的删除不走回收站
*/
@Test
public void test5() throws IOException {
//文件的创建
File file1 = new File("hi.txt");
if(!file1.exists()){
file1.createNewFile();
System.out.println("创建成功");
}else{
file1.delete();
System.out.println("删除成功");
}
}
创建文件目录
@Test
public void test6() {
/**
* 文件目录的创建,如果文件目录存在,就不创建
*/
File file1 = new File("D:\\JAVA\\io\\io1");
boolean mkdir = file1.mkdir();
if(mkdir){
System.out.println("创建成功1");
}
File file2 = new File("D:\\JAVA\\io\\io2");
boolean mkdir2 = file2.mkdirs();
if(mkdir2){
System.out.println("创建成功2");
}
//以上mkdir()和mkdirs()无差别
/*File file3 = new File("D:\\JAVA\\io\\io1\\io3");
boolean mkdir3 = file3.mkdir();
if(mkdir3){
System.out.println("创建成功3");
}
File file4 = new File("D:\\JAVA\\io\\io1\\io4");
boolean mkdir4 = file4.mkdirs();
if(mkdir4){
System.out.println("创建成功4");
}*/
//mkdir文件目录的上层目录不存在,也不创建
// mkdirs适用于如果上层目录不存在,一并创建
}
路径分隔符
-
路径中的每级目录之间用一个路径分隔符隔开;
-
路径分隔符和系统有关:
- Windows和DOS系统默认使用“\”来表示;
- UNIX和URL使用“/”来表示
-
Java程序支持跨平台运行,路径分隔符慎用;
-
解决这个隐患,File类提供了一个常量:
public static final String separator,根据操作系统,动态提供分隔符
示例:
File file1 = new File("hello.txt"); File file2 = new File("D:\\JAVA\\IdeaProjects\\hi.txt"); File file3 = new File("D:" + File.separator + "JAVA" + File.separator + "IdeaProjects" + File.separator + "hi.txt");
练习1
JAVA遍历文件夹下的文件
递归调用
public static void main(String[] args) {
traverseFolder("D:/JAVA");
}
public static void traverseFolder(String path){
File file = new File(path);
if(file.exists()){
File[] files = file.listFiles();
if(files == null || files.length == 0){
System.out.println("文件夹是空的");
return;
}else{
for(File file1: files){
if(file1.isDirectory()){
System.out.println("文件夹:" + file1.getAbsolutePath() );
traverseFolder(file1.getAbsolutePath());
}else{
System.out.println("文件:"+ file.getAbsolutePath());
}
}
}
}else{
System.out.println("文件不存在");
}
}
非递归调用
public static void traverseFolder1(String path){
int folderNum = 0 ;
int fileNum = 0;
File file = new File(path);
if(file.exists()){
LinkedList<File> list = new LinkedList<>();
File[] files = file.listFiles();
for(File file1: files){
if(file1.isDirectory()){
System.out.println("文件夹:" + file1.getName());
list.add(file1);
folderNum++;
}else{
System.out.println("文件:" + file1.getName());
fileNum++;
}
}
System.out.println("-------------");
File temp_file;
while(!list.isEmpty()){
temp_file = list.removeFirst();
files = temp_file.listFiles();
for(File file2: files){
if(file2.isDirectory()){
System.out.println("文件夹:"+file2.getName());
list.add(file2);
folderNum++;
}else{
System.out.println("文件:" + file2.getName());
fileNum++;
}
}
}
}else{
System.out.println("文件不存在");
}
System.out.println("文件夹共有:" + folderNum + ",文件共有:" + fileNum);
}
练习2
@Test
public void test() throws IOException {
File file = new File("D:\\JAVA\\io\\hello.txt");
//创建一个与file同目录下的另外一个文件
File file1 = new File(file.getParent(),"haha.txt");
boolean newFile = file1.createNewFile();
if(newFile){
System.out.println("创建成功");
}
}
@Test
public void test2(){
File file = new File("C:\\Users\\时光\\Pictures\\alego");
if(file.exists()){
String[] list = file.list();
for(String s: list){
if(s.endsWith(".gif")){
System.out.println(s);
}
}
}else{
System.out.println("目录不存在");
}
}
通过File类对象可以访问文件的属性:
表1 File类访问属性的方法列表
通过File对象创建空文件或目录
(在该对象所指的文件或目录不存在的情况下,只是内存层面的存在)
表2 File类创建文件或目录的方法列表