學(xué)習(xí)Java之File文件操作方法
一. File文件類(lèi)
1. 概述
在計(jì)算機(jī)系統(tǒng)中,文件是非常重要的信息存儲(chǔ)方式。為了讓我們方便的操作文件,Java標(biāo)準(zhǔn)庫(kù)java.io包中給我們提供了一個(gè)非常重要的File文件類(lèi)。該類(lèi)是唯一代表磁盤(pán)文件本身的對(duì)象,它提供了訪問(wèn)和操作文件及目錄的一系列方法。如果我們想在程序中操作文件和目錄,比如新建、刪除、寫(xiě)入、重命名文件,以及創(chuàng)建、移動(dòng)和刪除目錄等操作,都可以通過(guò)File類(lèi)來(lái)完成。
在Java中,F(xiàn)ile對(duì)象既可以表示文件,也可以表示目錄。特別要注意的是,如果我們想構(gòu)造一個(gè)File對(duì)象,即使傳入的這個(gè)文件或目錄不存在,代碼也不會(huì)出錯(cuò)。這是因?yàn)闃?gòu)造一個(gè)File對(duì)象時(shí),并不會(huì)有任何磁盤(pán)操作,只有當(dāng)我們調(diào)用了File對(duì)象的某些方法時(shí),才會(huì)真正地進(jìn)行磁盤(pán)操作。
2. 構(gòu)造方法
Java的File類(lèi)給我們提供了如下幾個(gè)構(gòu)造方法,用于創(chuàng)建一個(gè)File對(duì)象:
- File(String path):path表示路徑,如果path是真實(shí)存在的路徑,則該File對(duì)象表示的是一個(gè)目錄;如果path是文件名,則該File對(duì)象表示的是一個(gè)文件。
- File(String path, String name):path是路徑名,name是文件名。
- File(File dir, String name):dir是路徑對(duì)象,name是文件名。
我們使用上面的任意構(gòu)造方法,都可以創(chuàng)建出一個(gè) File對(duì)象。創(chuàng)建出File對(duì)象后,我們就可以調(diào)用File對(duì)象的各種方法,對(duì)文件進(jìn)行各種操作了。
3. 常用屬性
另外在File類(lèi)中還有兩個(gè)很常用的靜態(tài)常量屬性,如下所示:
- public static final String pathSeparator:分隔符,用于分隔連續(xù)的多個(gè)路徑,在Windows中代表";"。
- public static final String separator:路徑分隔符,用來(lái)分隔同一個(gè)路徑字符串中的目錄,在Windows中代表"/"。
大家要注意,一般Windows的路徑分隔符是反斜線“\”,而Java程序中的反斜線卻表示轉(zhuǎn)義字符。但Java程序支持將斜線當(dāng)成平臺(tái)無(wú)關(guān)的路徑分隔符,所以如果我們需要在Windows的路徑中使用路徑,可以使用兩條反斜線進(jìn)行轉(zhuǎn)義,或直接使用正斜線“/”。比如我們?cè)赪indows系統(tǒng)中有一個(gè)文件:D:\java\HelloWorld.java,在Java代碼中,該路徑的可以寫(xiě)成如下格式:
D:/java/HelloWorld.java 或 D:\java\HelloWorld.java。
4. 常用方法
為了方便進(jìn)行文件操作,F(xiàn)ile類(lèi)給我們提供了多個(gè)方法,用于獲取文件的屬性、信息以及文件操作。下面給大家介紹一些常用的方法:
4.1 獲取文件名和路徑
- getName():獲取文件名;
- getPath():獲取文件路徑;
- getAbsolutePath():獲取文件的絕對(duì)路徑;
- getParent():獲取文件的父路徑;
- getParentFile():獲取文件的父路徑的File對(duì)象。
4.2 獲取文件信息
- length():獲取文件的長(zhǎng)度(以字節(jié)為單位);
- lastModified():獲取文件的最后修改時(shí)間,返回的是毫秒值;
- exists():判斷文件是否存在;
- isFile():判斷是否是文件;
- isDirectory():判斷是否是目錄;
- canRead():判斷文件是否可讀;
- canWrite():判斷文件是否可寫(xiě)。
4.3 文件操作
- createNewFile():創(chuàng)建一個(gè)空文件,如果文件已經(jīng)存在,則不創(chuàng)建;
- delete():刪除文件或目錄,如果文件或目錄不存在,則返回false;
- mkdir():創(chuàng)建一個(gè)目錄,如果目錄已經(jīng)存在,則不創(chuàng)建;
- mkdirs():創(chuàng)建一個(gè)多級(jí)目錄,如果目錄已經(jīng)存在,則不創(chuàng)建;
- renameTo(File dest):將文件重命名為指定的文件名或路徑。
4.4 遍歷操作
- list():遍歷目錄中的文件,返回由File對(duì)象表示目錄中所有文件和子目錄名稱組成的字符串?dāng)?shù)組,如果調(diào)用的 File對(duì)象不是目錄,則返回null;
- list(FilenameFilter filter):返回文件數(shù)組中僅包含符合filter過(guò)濾器的文件和目錄,如果filter為 null,則接受所有的名稱。
接下來(lái)會(huì)通過(guò)一些案例來(lái)講解這些方法的具體使用。
5. 創(chuàng)建文件和目錄
如果我們想要使用File類(lèi)來(lái)訪問(wèn)文件系統(tǒng)中的文件和目錄,首先需要?jiǎng)?chuàng)建一個(gè)File對(duì)象。File類(lèi)的構(gòu)造方法有多種方式,接下來(lái)就說(shuō)說(shuō)幾種常見(jiàn)的方式。
5.1 通過(guò)文件路徑創(chuàng)建File對(duì)象
可以使用文件的路徑創(chuàng)建一個(gè)File對(duì)象,例如:
File file = new File("F:/example/file.txt");上面這行代碼將創(chuàng)建一個(gè)File對(duì)象,它代表文件系統(tǒng)中路徑為"F:/example/file.txt"的文件。但是大家要注意,F(xiàn)ile對(duì)象只是用來(lái)表示文件和目錄的路徑名,并不一定表示實(shí)際的文件和目錄。如果我們想操作實(shí)際的文件和目錄,必須使用File對(duì)象的相關(guān)方法來(lái)執(zhí)行操作。所以上面的這行代碼,并不會(huì)真的創(chuàng)建出對(duì)應(yīng)的目錄和文件,我們需要通過(guò)mkdir()、mkdirs()和createNewFile()方法才能創(chuàng)建出對(duì)應(yīng)的目錄和文件。
另外還請(qǐng)大家注意,即使該文件不存在,也不會(huì)報(bào)錯(cuò)。而且該文件是一個(gè)空白的文件,如果我們想往該文件中添加內(nèi)容,需要利用IO流往里添加內(nèi)容。完整代碼如下:
public class Demo01 {
public static void main(String[] args) {
//使用分隔符常量,屏蔽不同系統(tǒng)的路徑符號(hào)差異
//String path="F:" + File.separator + "example" + File.separator + "file.txt";
//File file = new File(path);
//path=F:\example\file.txt
//System.out.println("path="+file.getPath());
//該行代碼只是創(chuàng)建出File對(duì)象,但并不會(huì)真的創(chuàng)建出對(duì)應(yīng)的目錄和文件
File file = new File("F:/example/file.txt");
try {
// 文件操作
if (!file.exists()) {
//真正的創(chuàng)建文件
file.createNewFile();
System.out.println("文件創(chuàng)建成功!");
} else {
System.out.println("文件已經(jīng)存在!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}大家要注意,如果我們的代碼要運(yùn)行在不同的操作系統(tǒng)中,路徑的分隔符是不一樣的,例如:
- Windows中使用反斜杠\表示目錄的分隔符;
- Linux中使用正斜杠/表示目錄的分隔符。
所以為了讓我們的程序具有更好的可移植性,可以在編寫(xiě)路徑時(shí)根據(jù)程序所在的操作系統(tǒng),使用符合本地操作系統(tǒng)要求的分隔符,此時(shí)就可以使用File類(lèi)提供的兩個(gè)分隔符常量。
5.2 通過(guò)父目錄和子文件名創(chuàng)建File對(duì)象
我們還可以使用父目錄和子文件名來(lái)創(chuàng)建一個(gè)File對(duì)象,例如:
File parentDir = new File("F:/example");
File file = new File(parentDir, "file.txt");這行代碼會(huì)創(chuàng)建一個(gè)File對(duì)象,它代表文件系統(tǒng)中路徑為"F:/example/file.txt"的文件。如果父目錄不存在,會(huì)自動(dòng)創(chuàng)建出來(lái)。
5.3 通過(guò)URI創(chuàng)建File對(duì)象
我們還可以使用URI(統(tǒng)一資源標(biāo)識(shí)符)創(chuàng)建一個(gè)File對(duì)象,例如:
File file = new File(new URI("file:///F:/example/file.txt"));該代碼會(huì)創(chuàng)建一個(gè)File對(duì)象,它代表文件系統(tǒng)中路徑為"F:/example/file.txt"的文件。請(qǐng)注意,如果我們使用的URI格式不正確,會(huì)拋出異常。
5.4 創(chuàng)建單個(gè)目錄
除了能創(chuàng)建文件,F(xiàn)ile類(lèi)還提供了訪問(wèn)和操作文件系統(tǒng)中目錄的方法。我們可以使用mkdir()方法創(chuàng)建單個(gè)目錄。例如,以下代碼會(huì)創(chuàng)建出一個(gè)名為"example"的目錄。
import java.io.File;
public class Demo01 {
public static void main(String[] args) {
//該行代碼只是創(chuàng)建出File對(duì)象,但并不會(huì)真的創(chuàng)建出對(duì)應(yīng)的目錄和文件
//File file = new File("F:/example/file.txt");
File dir = new File("F:/example");
if (!dir.exists()) {//判斷目錄是否存在
//如果目錄不存在,則創(chuàng)建出來(lái)
boolean success = dir.mkdir();
if (success) {
System.out.println("目錄創(chuàng)建成功");
} else {
System.out.println("目錄創(chuàng)建失敗");
}
}
}
}5.5 創(chuàng)建多級(jí)目錄
我們還可以使用mkdirs()方法來(lái)創(chuàng)建出一個(gè)多級(jí)目錄,如果目錄已經(jīng)存在,則不創(chuàng)建。
import java.io.File;
public class Demo01 {
public static void main(String[] args) {
//創(chuàng)建多級(jí)目錄
File dirs = new File("F:\testDir\testSubDir");
if (dirs.mkdirs()) {
System.out.println("多級(jí)目錄創(chuàng)建成功!");
} else {
System.out.println("多級(jí)目錄已經(jīng)存在!");
}
}
}6. 獲取文件信息
創(chuàng)建出File文件和目錄之后,接下來(lái)我們還可以獲取文件與目錄的相關(guān)信息,F(xiàn)ile類(lèi)提供了多個(gè)方法用于獲取文件的屬性及信息,使用起來(lái)很方便,案例如下:
public class Demo03 {
public static void main(String[] args) {
//創(chuàng)建單級(jí)目錄
File file = new File("F:/example/file.txt");
// 獲取文件名和路徑
System.out.println("文件名:" + file.getName());
System.out.println("文件路徑:" + file.getPath());
System.out.println("文件絕對(duì)路徑:" + file.getAbsolutePath());
System.out.println("文件父路徑:" + file.getParent());
System.out.println("文件父路徑File對(duì)象:" + file.getParentFile());
// 獲取文件信息
System.out.println("文件長(zhǎng)度:" + file.length());
System.out.println("最后修改時(shí)間:" + file.lastModified());
System.out.println("是否存在:" + file.exists());
System.out.println("是否是文件:" + file.isFile());
System.out.println("是否是目錄:" + file.isDirectory());
System.out.println("是否可讀:" + file.canRead());
System.out.println("是否可寫(xiě):" + file.canWrite());
}
}7. 重命名與移動(dòng)文件
如果我們需要將一個(gè)文件重命名,或者是把文件從一個(gè)位置移動(dòng)到另一個(gè)位置,可以使用renameTo()方法。
public class Demo04 {
public static void main(String[] args) {
File oldFile = new File("F:/example/newFile2.txt");
File newFile = new File("F:/example2/newFile22.txt");
if(oldFile.exists()) {
//重命名文件。如果新文件所在的目錄與之前的文件不是同一目錄,則可以實(shí)現(xiàn)文件的移動(dòng),否則就是單純重命名
boolean result = oldFile.renameTo(newFile);
if(result) {
System.out.println("重命名成功");
}else {
System.out.println("重命名失敗");
}
}
}
}大家要注意,如果新文件所在的目錄與之前的舊文件不在同一目錄,則會(huì)實(shí)現(xiàn)文件的移動(dòng),否則就是單純重命名。
8. 刪除文件和目錄
我們可以使用delete方法來(lái)刪除一個(gè)文件或目錄。
public class Demo05 {
public static void main(String[] args) {
File file = new File("F:/example/file.txt");
if(file.exists()) {
boolean result = file.delete();
if(result) {
System.out.println("刪除成功");
}else {
System.out.println("刪除失敗");
}
}
}
}9. 遍歷文件
我們可以使用list()方法來(lái)遍歷一個(gè)目錄。假設(shè)我們想遍歷C盤(pán)根目錄下的所有文件和目錄,并顯示出文件或目錄名稱、類(lèi)型及大小,則實(shí)現(xiàn)代碼如下:
public class Demo06 {
public static void main(String[] args) {
File file = new File("C:/");
// 調(diào)用不帶參數(shù)的list()方法
String fileList[] = file.list();
for (int i = 0; i < fileList.length; i++) { // 遍歷返回的字符數(shù)組
System.out.print(fileList[i] + "\t\t");
System.out.print((new File("F:/", fileList[i])).isFile() ? "文件" + "\t\t" : "文件夾" + "\t\t");
System.out.println((new File("F:/", fileList[i])).length() + "字節(jié)");
}
}
}大家要注意,list()方法返回的數(shù)組中只包含文件名稱,但不包含路徑,也不保證所得數(shù)組中相同的字符串會(huì)以特定順序出現(xiàn),特別是不保證它們會(huì)按字母順序出現(xiàn)。
二. Path路徑類(lèi)
1. 概述
為了方便我們進(jìn)行文件路徑的操作,Java 7中還給我們提供了一個(gè)Path類(lèi),它位于java.nio.file包中,是一個(gè)用于操作文件路徑的工具類(lèi)。Path對(duì)象和File對(duì)象類(lèi)似,但操作起來(lái)更簡(jiǎn)單。
2. Path對(duì)象創(chuàng)建方式
我們?cè)谑褂肞ath類(lèi)之前,需要先創(chuàng)建一個(gè)Path對(duì)象,Java中給我們提供了多種創(chuàng)建Path對(duì)象的方式。接下來(lái)就給大家說(shuō)一下這幾種方法的使用。
2.1 通過(guò)文件路徑字符串創(chuàng)建
我們可以使用Path類(lèi)的靜態(tài)方法get(String first, String... more)來(lái)創(chuàng)建一個(gè)Path對(duì)象。其中,第一個(gè)參數(shù)是文件路徑的根路徑,第二個(gè)參數(shù)及以后的參數(shù)是路徑的各個(gè)部分。
Path path = Path.get("F:/workspace", "test", "example.txt");2.2 通過(guò)URI創(chuàng)建
我們可以使用Path類(lèi)的靜態(tài)方法get(URI uri)創(chuàng)建Path對(duì)象,URI可以是一個(gè)本地文件路徑,也可以是一個(gè)遠(yuǎn)程文件路徑。
URI uri = new URI("file:///F:/workspace/test/example.txt");
Path path = Path.get(uri);2.3 通過(guò)文件對(duì)象創(chuàng)建
我們還可以使用文件對(duì)象的toPath()方法創(chuàng)建Path對(duì)象。
File file = new File("D:/workspace/test/example.txt");
Path path = file.toPath();2.4 通過(guò)系統(tǒng)屬性創(chuàng)建
另外還可以使用系統(tǒng)屬性u(píng)ser.dir獲取當(dāng)前工作目錄,然后通過(guò)Path類(lèi)的靜態(tài)方法get(String first, String... more)創(chuàng)建一個(gè)Path對(duì)象。
Path path = Path.get(System.getProperty("user.dir"), "test", "example.txt");3. 常用方法
創(chuàng)建出Path對(duì)象之后,就可以通過(guò)Path類(lèi)給我們提供的一些常用方法,如創(chuàng)建、刪除、移動(dòng)、復(fù)制等,對(duì)文件路徑進(jìn)行操作了。以下是總結(jié)的Path對(duì)象方法的使用案例,大家來(lái)看看吧。
3.1 toAbsolutePath()
獲取絕對(duì)路徑。
Path path = Path.get("test", "example.txt");
Path absolutePath = path.toAbsolutePath();3.2 getParent()
獲取父路徑。
Path path = Path.get("test", "example.txt");
Path parentPath = path.getParent();3.3 getFileName()
獲取文件名。
Path path = Path.get("test", "example.txt");
Path fileName = path.getFileName();3.4 getNameCount()
獲取路徑名稱的數(shù)量。
Path path = Path.get("F:/workspace/test/example.txt");
int nameCount = path.getNameCount();3.5 getName(int index)
獲取指定索引位置的路徑名稱。
Path path = Path.get("F:/workspace/test/example.txt");
Path name = path.getName(2); // 返回test3.6 subpath(int beginIndex, int endIndex)
獲取路徑的子路徑。
Path path = Path.get("F:/workspace/test/example.txt");
Path subPath = path.subpath(0, 2); // 返回F:/workspace/test3.7 startsWith(Path other)
判斷當(dāng)前路徑是否以指定路徑開(kāi)始。
Path path = Path.get("F:/workspace/test/example.txt");
Path otherPath = Path.get("F:/workspace/test");
boolean startsWith = path.startsWith(otherPath); // 返回true好了,以上就是Path類(lèi)及其方法的使用了,是不是很簡(jiǎn)單呢?
四. 結(jié)語(yǔ)
至此,就把File和Path對(duì)象給大家介紹完畢了,今天的重點(diǎn)內(nèi)容如下:
- 創(chuàng)建File對(duì)象本身不涉及IO操作;
- File類(lèi)提供了多個(gè)創(chuàng)建對(duì)象的構(gòu)造方法;
- 掌握File文件和目錄的創(chuàng)建、刪除、重命名等方法。
以上就是學(xué)習(xí)Java之File文件操作方法的詳細(xì)內(nèi)容,更多關(guān)于Java File文件操作的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Scheduler定時(shí)任務(wù)實(shí)戰(zhàn)指南(零基礎(chǔ)入門(mén)任務(wù)調(diào)度)
本文介紹SpringScheduler在電商訂單超時(shí)處理中的應(yīng)用,涵蓋啟用定時(shí)任務(wù)、使用@Scheduled注解、cron表達(dá)式配置、線程池優(yōu)化及異步執(zhí)行等核心內(nèi)容,本文給大家介紹Spring Scheduler定時(shí)任務(wù)實(shí)戰(zhàn)指南,感興趣的朋友跟隨小編一起看看吧2025-09-09
深入解析Java編程中面向字節(jié)流的一些應(yīng)用
這篇文章主要介紹了Java編程中面向字節(jié)流的一些應(yīng)用,是Java入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10
Java線程安全和鎖Synchronized知識(shí)點(diǎn)詳解
在本篇文章里小編給大家分享的是關(guān)于Java線程安全和鎖Synchronized相關(guān)知識(shí)點(diǎn),有需要的朋友們可以參考下。2019-08-08
Spring Security 技術(shù)原理與實(shí)戰(zhàn)全解析
SpringSecurity是Spring生態(tài)的安全框架,提供認(rèn)證、授權(quán)、攻擊防護(hù)等功能,基于過(guò)濾器鏈和上下文模型,支持可插拔架構(gòu)與聲明式安全控制,適用于分布式和云原生場(chǎng)景,是Java應(yīng)用安全的核心解決方案,本文給大家介紹Spring Security 原理實(shí)戰(zhàn),感興趣的朋友一起看看吧2025-06-06
Java 中文字符按Unicode排序的實(shí)現(xiàn)方法
這篇文章主要介紹了Java 中文字符按Unicode排序的實(shí)現(xiàn)方法,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-10-10

