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

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

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


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

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

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


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

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

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

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

實例二
普通文件的創(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("./遇事問春風(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ù),則不會創(chuàng)建。返回false
System.out.println(file.createNewFile());
}
}
結(jié)果如下:

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

實例三
普通文件的刪除
代碼如下:
import java.io.File;
import java.io.IOException;
public class IODemo3 {
public static void main(String[] args) throws IOException {
File file = new File("./遇事問春風(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é)果展示:

實例四
觀察 deleteOnExit 的現(xiàn)象
我們先來觀察以下代碼,沒有加deleteOnExit
import java.io.File;
import java.io.IOException;
public class IODemo4 {
public static void main(String[] args) throws IOException {
File file = new File("./遇事問春風(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é)果如下:

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

當(dāng)我們加上deleteOnExit后再來看看運行結(jié)果

但是呢,當(dāng)程序運行結(jié)束后卻觀察不到該路徑下的該文件。
這就是deleteOnExit方法的效果
實例五
觀察目錄的創(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é)果如下:


實例六
觀察目錄創(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());
}
}
運行結(jié)果如下:

mkdir() 的時候,如果中間目錄不存在,則無法創(chuàng)建成功; 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.mkdirs());
System.out.println(dir.isDirectory());
System.out.println(dir.isFile());
}
}
結(jié)果展示:


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

文件重命名如下:

總結(jié)
到此這篇關(guān)于認(rèn)識文件與Java中操作文件的文章就介紹到這了,更多相關(guān)Java操作文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java多線程 BlockingQueue實現(xiàn)生產(chǎn)者消費者模型詳解
這篇文章主要介紹了Java多線程 BlockingQueue實現(xiàn)生產(chǎn)者消費者模型詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-09-09
SpringBoot入門實現(xiàn)第一個SpringBoot項目
今天我們一起來完成一個簡單的SpringBoot(Hello World)。就把他作為你的第一個SpringBoot項目。具有一定的參考價值,感興趣的可以了解一下2021-09-09
Spring MVC集成springfox-swagger2構(gòu)建restful API的方法詳解
這篇文章主要給大家介紹了關(guān)于Spring MVC集成springfox-swagger2構(gòu)建restful API的相關(guān)資料,文中介紹介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-06-06
Mybatis注解實現(xiàn)多數(shù)據(jù)源讀寫分離詳解
這篇文章主要給大家介紹了關(guān)于Mybatis注解實現(xiàn)多數(shù)據(jù)源讀寫分離的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Mybatis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
springboot2升級到springboot3過程相關(guān)修改記錄
本文詳細(xì)記錄了將Spring Boot 2升級到Spring Boot 3的過程,包括升級JDK到17、修改依賴、配置文件調(diào)整以及處理一些特定問題,如Redisson版本升級和Swagger配置,感興趣的朋友跟隨小編一起看看吧2024-12-12

