File類常用方法及拷貝目錄


File類是Object的一個子類,與四大家族流是沒有關系的,所以File不能對文件進行讀和寫的操作。

File類是文件和目錄路徑名的抽象表示。即File對象對應的可能是一個文件,也可能是一個目錄。

對於File類,查看api文檔,可以看到有非常多的方法,需要掌握其中的一些常用方法。

File類常用方法

  • File(String pathname) :構造方法;
  • boolean exits():判斷文件是否存在;
  • boolean createNewFile():創建一個新文件;
  • boolean mkdir():創建一個目錄;
  • boolean mkdirs():創建多重目錄;
  • boolean isFile():判斷是否是文件;
  • boolean isDirectory():判斷是否是目錄;
  • String getParent():獲取父路徑;
  • File getParentFile():獲取父文件;
  • String getAbsolutePath():獲取絕對路徑;
  • String getName():返回文件或者目錄的名稱;
  • long lastModified():獲取最后一次修改時間;
  • long length():獲取文件長度;
  • File[] listFile():獲取當前目錄下的所有子目錄。

常用方法的使用:

package com.dh.io;

import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class FileDemo {

    public static void main(String[] args) {

        //通過構造方法創建一個File類對象
        File file1 = new File("F:\\file1");
        //首先先判斷文件是否存在
        boolean b = file1.exists();
        //如果不存在
        if (!b) {
            //以文件的形式創建
            try {
                file1.createNewFile();
                System.out.println("file1文件創建成功!");
            } catch (IOException e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("file1文件已存在!");
        }

        File file2 = new File("F:\\file2");
        if (!file2.exists()) {
            //以目錄的形式創建
            file2.mkdir();
            System.out.println("file2目錄創建成功!");
        } else {
            System.out.println("file2目錄已存在!");
        }

        File file3 = new File("F:\\file3\\test");
        if (!file3.exists()) {
            //或者以多重目錄的形式創建
            file3.mkdirs();
            System.out.println("file3多重目錄創建成功!");
        } else {
            System.out.println("file3多重目錄已存在!");
        }

        //判斷是否是一個目錄
        System.out.println("file1是一個文件嗎?" + file1.isFile());
        System.out.println("file1是一個目錄嗎?" + file1.isDirectory());
        //判斷是否是一個文件
        System.out.println("file2是一個文件嗎?" + file2.isFile());
        System.out.println("file2是一個目錄嗎?" + file2.isDirectory());

        //獲取父路徑(1)
        String parent = file1.getParent();
        System.out.println("file1的父路徑:" + parent);
        //獲取父路徑(2)
        File parentFile = file1.getParentFile();
        System.out.println("file1的絕對路徑:" + parentFile);
        //獲取絕對路徑
        String absolutePath = file1.getAbsolutePath();
        System.out.println(absolutePath);

        //獲取文件最后一次修改時間
        long l = file1.lastModified();
        Date date = new Date(l);
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String s = dateFormat.format(date);
        System.out.println("file1的最后一次修改時間:" + s);

        //獲取文件的大小
        long length = file1.length();
        System.out.println("file1的長度:" + length);

        //獲取所有的子目錄名稱
        File file4 = new File("F:\\file3");
        File[] files = file4.listFiles();
        for (File file : files) {
            System.out.println(file.getName());
        }
    }
}

結果:

file1文件創建成功!
file2目錄創建成功!
file3多重目錄創建成功!
file1是一個文件嗎?true
file1是一個目錄嗎?false
file2是一個文件嗎?false
file2是一個目錄嗎?true
file1的父路徑:F:\
file1的絕對路徑:F:\
F:\file1
file1的最后一次修改時間:2021-02-08 11:51:50
file1的長度:0
test

File類實現目錄拷貝

四大家族是可以完成對文件的讀寫復制的,但是不能對目錄進行復制操作,要對目錄進行復制的話,就需要使用File類啦。

分析實現邏輯:

首先我們需要去遞歸判斷(因為可能存在多重目錄)要復制目錄下的子目錄和子文件,如果是目錄就在目的目錄下新建對應的目錄,如果是文件的話,就停止遞歸,使用流操作完成對文件的復制。

實現代碼:

package com.dh.io;

import java.io.*;

public class FileCopyDemo {

    public static void main(String[] args) {
        //拷貝源
        File fileSrc = new File("F:\\test");
        //拷貝目標
        File fileDes = new File("D:\\");
        //調用拷貝方法
        copyFiles(fileSrc,fileDes);
    }

    public static void copyFiles(File fileSrc,File fileDes){
        //如果是文件,則復制文件,然后退出
        FileInputStream fis = null;
        FileOutputStream fos = null;
        if(fileSrc.isFile()){
            try {
                fis = new FileInputStream(fileSrc);
                String path = (fileDes.getAbsolutePath().endsWith("\\") ?fileDes.getAbsolutePath() : fileDes.getAbsolutePath() + "\\") + fileSrc.getAbsolutePath().substring(3);
                fos = new FileOutputStream(path);
                byte[] bytes = new byte[1024*1024];
                int readCount = 0;
                while((readCount = fis.read(bytes))!=-1){
                    fos.write(bytes,0,readCount);
                }
                fos.flush();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }finally {
                if(fos != null){
                    try {
                        fos.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(fis != null){
                    try {
                        fis.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            return;
        }
        //如果是目錄,則獲取該目錄下的文件,遍歷
        File[] files = fileSrc.listFiles();
        for (File file : files) {
            if(file.isDirectory()){
                //獲取源路徑
                String srcPath = file.getAbsolutePath();
                //利用拷貝目標和源路徑拼接,獲得對應的目錄
                String desPath = (fileDes.getAbsolutePath().endsWith("\\") ?fileDes.getAbsolutePath() : fileDes.getAbsolutePath() + "\\") + srcPath.substring(3);
//            System.out.println(desPath);
                File newFile = new File(desPath);
                if(!(newFile.exists())){
                    newFile.mkdirs();
                }
            }
            //用遍歷的當前元素繼續遞歸
            copyFiles(file,fileDes);
        }
    }
}

這樣就可以實現目錄的拷貝啦!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM