一文帶你詳細(xì)認(rèn)識(shí)文件與Java中操作文件
認(rèn)識(shí)文件
我們先來(lái)認(rèn)識(shí)狹義上的文件(file)。針對(duì)硬盤(pán)這種持久化存儲(chǔ)的I/O設(shè)備,當(dāng)我們想要進(jìn)行數(shù)據(jù)保存時(shí),往往不是保存成一個(gè)整體,而是獨(dú)立成一個(gè)個(gè)的單位進(jìn)行保存,這個(gè)獨(dú)立的單位就被抽象成文件的概念,就類(lèi)似辦公桌上的一份份真實(shí)的文件一般。

文件除了有數(shù)據(jù)內(nèi)容之外,還有一部分信息,例如文件名、文件類(lèi)型、文件大小等并不作為文件的數(shù)據(jù)而存在,我們把這部分信息可以視為文件的元信息

樹(shù)型結(jié)構(gòu)組織和目錄
同時(shí),隨著文件越來(lái)越多,對(duì)文件的系統(tǒng)管理也被提上了日程,如何進(jìn)行文件的組織呢,一種合乎自然的想法出現(xiàn)了,就是按照層級(jí)結(jié)構(gòu)進(jìn)行組織 —— 也就是我們數(shù)據(jù)結(jié)構(gòu)中學(xué)習(xí)過(guò)的樹(shù)形結(jié)構(gòu)。這樣,一種專(zhuān)門(mén)用來(lái)存放管理信息的特殊文件誕生了,也就是我們平時(shí)所謂文件夾(folder)或者目錄(directory)的概念。


文件路徑(Path)
如何在文件系統(tǒng)中如何定位我們的一個(gè)唯一的文件就成為當(dāng)前要解決的問(wèn)題,但這難不倒計(jì)算機(jī)科學(xué)家,因?yàn)閺臉?shù)型結(jié)構(gòu)的角度來(lái)看,樹(shù)中的每個(gè)結(jié)點(diǎn)都可以被一條從根開(kāi)始,一直到達(dá)的結(jié)點(diǎn)的路徑所描述,而這種描述方式就被稱(chēng)為文件的絕對(duì)路徑(absolute path)

除了可以從根開(kāi)始進(jìn)行路徑的描述,我們可以從任意結(jié)點(diǎn)出發(fā),進(jìn)行路徑的描述,而這種描述方式就被
稱(chēng)為相對(duì)路徑(relative path),相對(duì)于當(dāng)前所在結(jié)點(diǎn)的一條路徑

知識(shí)擴(kuò)展
即使是普通文件,根據(jù)其保存數(shù)據(jù)的不同,也經(jīng)常被分為不同的類(lèi)型,我們一般簡(jiǎn)單的劃分為文本文件和二進(jìn)制文件,分別指代保存被字符集編碼的文本和按照標(biāo)準(zhǔn)格式保存的非被字符集編碼過(guò)的文件。


Windows 操作系統(tǒng)上,會(huì)按照文件名中的后綴來(lái)確定文件類(lèi)型以及該類(lèi)型文件的默認(rèn)打開(kāi)程序。但這個(gè)習(xí)俗并不是通用的,在 OSX、Unix、Linux 等操作系統(tǒng)上,就沒(méi)有這樣的習(xí)慣,一般不對(duì)文件類(lèi)型做如此精確地分類(lèi)。

文件由于被操作系統(tǒng)進(jìn)行了管理,所以根據(jù)不同的用戶(hù),會(huì)賦予用戶(hù)不同的對(duì)待該文件的權(quán)限,一般地可以認(rèn)為有可讀、可寫(xiě)、可執(zhí)行權(quán)限

Windows 操作系統(tǒng)上,還有一類(lèi)文件比較特殊,就是平時(shí)我們看到的快捷方式(shortcut),這種文件只是對(duì)真實(shí)文件的一種引用而已。其他操作系統(tǒng)上也有類(lèi)似的概念,例如,軟鏈接(soft link)等

最后,很多操作系統(tǒng)為了實(shí)現(xiàn)接口的統(tǒng)一性,將所有的 I/O 設(shè)備都抽象成了文件的概念,使用這一理念,最為知名的就是 Unix、Linux 操作系統(tǒng) —— 萬(wàn)物皆文件
Java 中操作文件
Java 中通過(guò) java.io.File 類(lèi)來(lái)對(duì)一個(gè)文件(包括目錄)進(jìn)行抽象的描述。
值得注意的是,有 File 對(duì)象,并不代表真實(shí)存在該文件
File 概述
我們先來(lái)看看 File 類(lèi)中的常見(jiàn)屬性、構(gòu)造方法和方法
屬性
| 修飾符及類(lèi)型 | 屬性 | 說(shuō)明 |
|---|---|---|
| static String | pathSeparator | 依賴(lài)于系統(tǒng)的路徑分隔符,String 類(lèi)型的表示 |
| static char | pathSeparator | 依賴(lài)于系統(tǒng)的路徑分隔符,char 類(lèi)型的表示 |
構(gòu)造方法
| 簽名 | 說(shuō)明 |
|---|---|
| File(File parent, Stringchild) | 根據(jù)父目錄 + 孩子文件路徑,創(chuàng)建一個(gè)新的 File 實(shí)例 |
| File(String pathname) | 根據(jù)文件路徑創(chuàng)建一個(gè)新的 File 實(shí)例,路徑可以是絕對(duì)路徑或者相對(duì)路徑 |
| File(String parent, Stringchild) | 根據(jù)父目錄 + 孩子文件路徑,創(chuàng)建一個(gè)新的 File 實(shí)例,父目錄用路徑表示 |
方法
| 修飾符及返回值類(lèi)型 | 方法簽名 | 說(shuō)明 |
|---|---|---|
| String | getParent() | 返回 File 對(duì)象的父目錄文件路徑 |
| String | getName() | 返回 FIle 對(duì)象的純文件名稱(chēng) |
| String | getPath() | 返回 File 對(duì)象的文件路徑 |
| String | getAbsolutePath() | 返回 File 對(duì)象的絕對(duì)路徑 |
| String | getCanonicalPath() | 返回 File 對(duì)象的修飾過(guò)的絕對(duì)路徑 |
| boolean | exists() | 判斷 File 對(duì)象描述的文件是否真實(shí)存在 |
| boolean | isDirectory() | 判斷 File 對(duì)象代表的文件是否是一個(gè)目錄 |
| boolean | isFile() | 判斷 File 對(duì)象代表的文件是否是一個(gè)普通文件 |
| boolean | createNewFile() | 根據(jù) File 對(duì)象,自動(dòng)創(chuàng)建一個(gè)空文件。成功創(chuàng)建后返回 true |
| boolean | delete() | 根據(jù) File 對(duì)象,刪除該文件。成功刪除后返回 true |
| void | deleteOnExit() | 根據(jù) File 對(duì)象,標(biāo)注文件將被刪除,刪除動(dòng)作會(huì)到JVM 運(yùn)行結(jié)束時(shí)才會(huì)進(jìn)行 |
| String[] | list() | 返回 File 對(duì)象代表的目錄下的所有文件名 |
| File[] | listFiles() | 返回 File 對(duì)象代表的目錄下的所有文件,以 File 對(duì)象表示 |
| boolean | mkdir() | 創(chuàng)建 File 對(duì)象代表的目錄 |
| boolean | mkdirs() | 創(chuàng)建 File 對(duì)象代表的目錄,如果必要,會(huì)創(chuàng)建中間目錄 |
| boolean | renameTo(Filedest) | 進(jìn)行文件改名,也可以視為我們平時(shí)的剪切、粘貼操作 |
| boolean | canRead() | 判斷用戶(hù)是否對(duì)文件有可讀權(quán)限 |
| boolean | canWrite() | 判斷用戶(hù)是否對(duì)文件有可寫(xiě)權(quán)限 |
File使用實(shí)例代碼演示
實(shí)例一
觀察get系列的特點(diǎn)和差異
代碼如下:
import java.io.File;
import java.io.IOException;
public class IODemo1 {
public static void main(String[] args) throws IOException {
File file = new File("./遇事問(wèn)春風(fēng)乄.txt");
System.out.println(file.getName());
System.out.println(file.getParent());
System.out.println(file.getPath());
System.out.println(file.getAbsolutePath());
System.out.println(file.getCanonicalPath());
}
}
注意:有 File 對(duì)象,并不代表真實(shí)存在該文件
也就是說(shuō)這里的遇事問(wèn)春風(fēng)乄可能根本不存在
運(yùn)行結(jié)果如下:

實(shí)例二
普通文件的創(chuàng)建、刪除
代碼如下:
import java.io.File;
import java.io.IOException;
public class IOdemo2 {
public static void main(String[] args) throws IOException {
File file = new File("./遇事問(wèn)春風(fēng)乄.txt"); // 要求該文件不存在,才能看到相同的現(xiàn)象
//文件是否存在
System.out.println(file.exists());
//是否是文件目錄
System.out.println(file.isDirectory());
//是否為普通文件
System.out.println(file.isFile());
//創(chuàng)建該文件
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
//如果有重復(fù),則不會(huì)創(chuàng)建。返回false
System.out.println(file.createNewFile());
}
}
結(jié)果如下:

如果你跟博主一樣是使用IDEA編譯器的話(huà),還可以看到該文件路徑下已經(jīng)產(chǎn)生了該文件

實(shí)例三
普通文件的刪除
代碼如下:
import java.io.File;
import java.io.IOException;
public class IODemo3 {
public static void main(String[] args) throws IOException {
File file = new File("./遇事問(wèn)春風(fēng)乄.txt"); // 要求該文件不存在,才能看到相同的現(xiàn)象
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
System.out.println(file.delete());
System.out.println(file.exists());
}
}
結(jié)果展示:

實(shí)例四
觀察 deleteOnExit 的現(xiàn)象
我們先來(lái)觀察以下代碼,沒(méi)有加deleteOnExit
import java.io.File;
import java.io.IOException;
public class IODemo4 {
public static void main(String[] args) throws IOException {
File file = new File("./遇事問(wèn)春風(fēng)乄.txt"); // 要求該文件不存在,才能看到相同的現(xiàn)象
System.out.println(file.exists());
System.out.println(file.createNewFile());
System.out.println(file.exists());
//file.deleteOnExit();
System.out.println(file.exists());
}
}
結(jié)果如下:

注意這時(shí)候我們是可以看到我們創(chuàng)建了該文件的

當(dāng)我們加上deleteOnExit后再來(lái)看看運(yùn)行結(jié)果

但是呢,當(dāng)程序運(yùn)行結(jié)束后卻觀察不到該路徑下的該文件。
這就是deleteOnExit方法的效果
實(shí)例五
觀察目錄的創(chuàng)建
import java.io.File;
public class IODemo5 {
public static void main(String[] args) {
File dir = new File("IO-dir"); // 要求該目錄不存在,才能看到相同的現(xiàn)象
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
結(jié)果如下:


實(shí)例六
觀察目錄創(chuàng)建2——mkdirs
import javax.swing.*;
import java.io.File;
public class IODemo5 {
public static void main(String[] args) {
File dir = new File("./IO-dir/aa/bb"); // 要求所有目錄不存在,才能看到相同的現(xiàn)象
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdir());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
運(yùn)行結(jié)果如下:

mkdir() 的時(shí)候,如果中間目錄不存在,則無(wú)法創(chuàng)建成功; mkdirs() 可以解決這個(gè)問(wèn)題。
import javax.swing.*;
import java.io.File;
public class IODemo5 {
public static void main(String[] args) {
File dir = new File("./IO-dir/aa/bb"); // 要求所有目錄不存在,才能看到相同的現(xiàn)象
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
System.out.println(dir.mkdirs());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
結(jié)果展示:


實(shí)例七
觀察文件重命名
首先創(chuàng)建一個(gè)文件如下:

文件重命名如下:

總結(jié)
到此這篇關(guān)于認(rèn)識(shí)文件與Java中操作文件的文章就介紹到這了,更多相關(guān)Java操作文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文掌握Spring Cookie和Session 是什么及區(qū)別介紹
Cookie和Session都是用于在客戶(hù)端和服務(wù)器之間傳遞信息的技術(shù),但它們的工作方式和使用場(chǎng)景有所不同,Cookie是在客戶(hù)端保存用戶(hù)信息的一種機(jī)制,而Session是在服務(wù)器端保存用戶(hù)信息的一種機(jī)制,本文介紹Spring Cookie和Session 是什么,感興趣的朋友一起看看吧2025-01-01
解決SpringBoot運(yùn)行Test時(shí)報(bào)錯(cuò):SpringBoot Unable to find
這篇文章主要介紹了SpringBoot運(yùn)行Test時(shí)報(bào)錯(cuò):SpringBoot Unable to find a @SpringBootConfiguration,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
SpringMvc+POI處理excel表數(shù)據(jù)導(dǎo)入
這篇文章主要為大家詳細(xì)介紹了SpringMvc+POI處理excel表數(shù)據(jù)導(dǎo)入,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
解決idea中maven項(xiàng)目無(wú)端顯示404錯(cuò)誤的方法
這篇文章主要介紹了解決idea中maven項(xiàng)目無(wú)端顯示404錯(cuò)誤的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹(shù)的實(shí)現(xiàn)方法和原理詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹(shù)的實(shí)現(xiàn)方法和原理,紅黑樹(shù)是一種特殊的二叉查找樹(shù),每個(gè)結(jié)點(diǎn)都要儲(chǔ)存位表示結(jié)點(diǎn)的顏色,或紅或黑,本文將通過(guò)示例為大家詳細(xì)講講紅黑樹(shù)的原理及實(shí)現(xiàn),感興趣的朋友可以了解一下2024-02-02
Java使用Hutool執(zhí)行日期的加法和減法操作方法
使用Hutool進(jìn)行日期的加法和減法操作,可以使用`DateUtil.offsetXXX()`方法來(lái)實(shí)現(xiàn),這些方法會(huì)返回一個(gè)新的日期,而不是在原日期上進(jìn)行修改,本文給大家介紹Java使用Hutool執(zhí)行日期的加法和減法操作方法,感興趣的朋友一起看看吧2023-11-11

