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);
}
}
}
這樣就可以實現目錄的拷貝啦!