一、文件类基本操作

java.io包中保存了所有的IO操作类(原始提供的类),而在整个IO包中核心的就是5个类一个接口
文件类:File
流操作类:InputStream、OutputStream、Reader、Writer
一个接口:Serializable
1.1 File类的基本操作
在真个java.io包中,File类是唯一一个与文件本身操作有关的类,即:通过File类可以实现文件的创建、删除、目录列表等操作,与操作的内容没有任何的关系。
如果要使用File类那么必须准备出一个合理的路径,所以在File类中有如下构造方法:
(1)设置操作完整路径:public File(String pathname);在java企业开发中都会使用此方法
(2)设置父路径与子文件: public File(String parent, String child),主要用于android中使用。
范例:操作File类
(1)在使用File定义路径的时候必须要考虑分割符的问题,记住:“\”为“\”;
(2)在File类中提供了以下基本的操作方法:public boolean createNewFile() throws IOException,如果存在就返回false,如果创建成功就返回true,如果文件路径错误,就抛出异常。
(3)判断文件是否存在:public boolean exists();
(4)删除文件:public boolean delete();

范例:File类的基本操作

package day2;

import java.io.*;
public class FileDemo {
    public static void main(String[] args) throws Exception{
        //在设置文件路径的时候,并不会判断文件具体内容
        File file = new File("F:\\java8\\file\\test.txt");
        //判断文件路径是否存在
        if(file.exists()){
            //删除文件
            file.delete();
            System.out.println("删除已经存在的文件");
        }else {
            //创建文件,如果存在就返回false,如果创建成功就返回true
            Boolean flag = file.createNewFile();
            System.out.println(flag);
        }
    }
}

1.2 File操作的问题
问题1:在实际的项目开发过程中,往往都会选择在Windows下做开发,在Linux下部署,对于两个操作系统而言,最为麻烦的部分在于路径分割符问题;
Windows的路径分割符:(反)
linux的路径分割符:/(正)

那么以上的程序代码,直接使用了“\”,很明显这是windows的,为此在实际的开发过程中,一定要记住一个原则,不要直接写上路径的分割符,在File类中定义有一个常量: public static final String separator

范例

package day2;

import java.io.*;
public class FileDemo {
    public static void main(String[] args) throws Exception{
        //在设置文件路径的时候,并不会判断文件具体内容
        File file = new File("F:"+File.separator+"java8"+File.separator+"file"+File.separator+"test.txt");
        //判断文件路径是否存在
        if(file.exists()){
            //删除文件
            file.delete();
            System.out.println("删除已经存在的文件");
        }else {
            //创建文件,如果存在就返回false,如果创建成功就返回true
            Boolean flag = file.createNewFile();
            System.out.println(flag);
        }
    }
}

问题2:文件的创建会存在有延迟操作
这种延迟操作很多时候是可以忽略的,但是有一点不能忽略,刚刚删除了一个文件马上创建一个文件,就有可能出现创建不了的情况。

问题3:如果现在给定的路径包含有目录,但是又不存在该目录,那么就将无法创建
(1)取得父路径:public File getParentFile();
(2)创建目录:public boolean mkdirs()

package day2;

import java.io.*;
public class FileDemo {
    public static void main(String[] args) throws Exception{
        //在设置文件路径的时候,并不会判断文件具体内容
        File file = new File("F:"+File.separator+"java8"+"test"+File.separator+"file"+File.separator+"test.txt");
        if(!file.getParentFile().exists()){//判断文件夹是否存在
            file.getParentFile().mkdirs();
        }
        //判断文件路径是否存在
        if(file.exists()){
            //删除文件
            file.delete();
            System.out.println("删除已经存在的文件");
        }else {
            //创建文件,如果存在就返回false,如果创建成功就返回true
            Boolean flag = file.createNewFile();
            System.out.println(flag);
        }
    }
}

注:在创建文件的时候,首先要保证文件路径存在。

1.3 File的其他操作

package day2;

import java.io.*;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileDemo {
    public static void main(String[] args) throws Exception{
        File file = new File("F:"+File.separator +"java8"+File.separator +"file" +File.separator+"跟冰河学习互联网工程技术.pdf" );
        //File file = new File("F:"+File.separator+"java8"+File.separator+"file"+File.separator+"卡卡西.jpg");
        if(file.exists()){
            //1.file方法
            System.out.println("是否为目录:" + file.isDirectory());
            System.out.println("是否为文件:" + file.isFile());
            System.out.println("文件名称:" + file.getName());
            System.out.println("文件后缀名:" + file.getName().substring(file.getName().lastIndexOf(".")));
            System.out.println("最后修改时间:" +  new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format( new Date(file.lastModified())));
            System.out.println("文件大小:" + new BigDecimal((double)file.length()/1024/1024).divide(new BigDecimal(1),3,BigDecimal.ROUND_HALF_UP));
            System.out.println("父文件" + file.getParentFile());

            //2、根据目录找出所有子文件
            File fileDirectory = file.getParentFile().getParentFile();
            if(fileDirectory.exists() && fileDirectory.isDirectory()){
                File result[] = fileDirectory.listFiles();
                if(result.length >0){
                    for (int i =0;i <result.length;i++){
                        System.out.println(result[i]);
                    }
                }
            }

        }else {
            System.out.println("文件不存在");
        }
    }
}
是否为目录:false
是否为文件:true
文件名称:跟冰河学习互联网工程技术.pdf
文件后缀名:.pdf
最后修改时间:2022-05-12 15:23:51
文件大小:5.651
父文件F:\java8\file

F:\java8\1111.txt
F:\java8\file
F:\java8\日报.txt
。。。。
F:\java8\线程.pptx

1.4 目录列表
通过目录名称,列出所有子目录以及所有子目录的文件名称

范例:目录列表

package day2;

import java.io.*;
public class FileDemo {
    public static void main(String[] args) throws Exception{
        File file = new File("F:"+File.separator + "java8" );
      print(file);
    }
    public static void print(File file){
        if(file.exists() && file.isDirectory()){
           File fileAttr[] = file.listFiles();
           if(fileAttr != null && fileAttr.length >0){
               for(int i =0; i<fileAttr.length; i++){
                   if(fileAttr[i].isDirectory()){
                       print(fileAttr[i]);
                   }else {
                       System.out.println(fileAttr[i]);
                   }
               }
           }
        }
    }
}