一文帶你詳細認(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)文章
一文掌握Spring Cookie和Session 是什么及區(qū)別介紹
Cookie和Session都是用于在客戶端和服務(wù)器之間傳遞信息的技術(shù),但它們的工作方式和使用場景有所不同,Cookie是在客戶端保存用戶信息的一種機制,而Session是在服務(wù)器端保存用戶信息的一種機制,本文介紹Spring Cookie和Session 是什么,感興趣的朋友一起看看吧2025-01-01解決SpringBoot運行Test時報錯:SpringBoot Unable to find
這篇文章主要介紹了SpringBoot運行Test時報錯:SpringBoot Unable to find a @SpringBootConfiguration,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-10-10SpringMvc+POI處理excel表數(shù)據(jù)導(dǎo)入
這篇文章主要為大家詳細介紹了SpringMvc+POI處理excel表數(shù)據(jù)導(dǎo)入,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-06-06Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹的實現(xiàn)方法和原理詳解
這篇文章主要介紹了Java數(shù)據(jù)結(jié)構(gòu)之紅黑樹的實現(xiàn)方法和原理,紅黑樹是一種特殊的二叉查找樹,每個結(jié)點都要儲存位表示結(jié)點的顏色,或紅或黑,本文將通過示例為大家詳細講講紅黑樹的原理及實現(xiàn),感興趣的朋友可以了解一下2024-02-02Java使用Hutool執(zhí)行日期的加法和減法操作方法
使用Hutool進行日期的加法和減法操作,可以使用`DateUtil.offsetXXX()`方法來實現(xiàn),這些方法會返回一個新的日期,而不是在原日期上進行修改,本文給大家介紹Java使用Hutool執(zhí)行日期的加法和減法操作方法,感興趣的朋友一起看看吧2023-11-11