Java?IO流必備之File、遞歸與字符集舉例詳解
File
File
是java.io.
包下的類,File
類的對象,用于代表當(dāng)前操作系統(tǒng)的文件(可以是文件、或文件夾)。File類的對象可以代表文件/文件夾,并可以調(diào)用其提供的方法對象文件進(jìn)行操作。
注意:
File
類只能對文件本身進(jìn)行操作,不能讀寫文件里面存儲的數(shù)據(jù),如果需要讀寫文件,就要用到IO
流。
創(chuàng)建File類的對象
構(gòu)造器 | 說明 |
---|---|
public File(String pathname) | 根據(jù)文件路徑創(chuàng)建文件對象 |
public File(String parent,String child) | 根據(jù)父路徑和子路徑名字創(chuàng)建文件對象 |
public File(File parent,String child) | 根據(jù)父路徑對應(yīng)文件對象和子路徑名字創(chuàng)建文件對象 |
注意:
File
對象既可以代表文件、也可以代表文件夾。File
封裝的對象僅僅是一個路徑名,這個路徑可以是存在的,也可以是不存在的。
File f1 =new File ("E:\\resource\\wang.jpg");
可以使用相對路徑定位文件對象
- 只要帶盤符的都稱為絕對路徑。
- 不帶盤符,默認(rèn)在IDEA工程下直接尋找文件的是相對路徑,其一般用來找工程下的項目文件。
File f1 =new File ("resource\\wang.jpg");
File類的相關(guān)方法
- File提供的判斷文件類型、獲取文件信息功能
方法名稱 | 說明 |
---|---|
public boolean exists() | 判斷當(dāng)前文件對象對應(yīng)的文件路徑是否存在,存在返回true |
public boolean isFile() | 判斷當(dāng)前文件對象指代的是否是文件,是文件返回true ,反之 |
public boolean isDirectory() | 判斷當(dāng)前文件對象指代的是否是文件夾,是文件夾返回true |
public String getName() | 獲取文件的名稱(包含后綴) |
public long length() | 獲取文件的大小,返回字節(jié)個數(shù) |
public long lastModified() | 獲取文件的最后修改時間 |
public String getPath() | 獲取創(chuàng)建文件對象時使用的路徑 |
public String getAbsolutePath() | 獲取絕對路徑 |
- File提供的創(chuàng)建和刪除文件的方法
方法名稱 | 說明 |
---|---|
public boolean createNewFile() | 創(chuàng)建一個新的空文件 |
public boolean mkdir() | 只能創(chuàng)建一級文件夾 |
public boolean mkdirs() | 可以創(chuàng)建多級文件夾 |
public boolean delete() | 刪除文件、空文件夾 |
注意:delete
方法默認(rèn)只能刪除文件和空文件夾,刪除后的文件不會進(jìn)入回收站。
- File提供的遍歷文件夾的方法
方法名稱 | 說明 |
---|---|
public String[] list() | 獲取當(dāng)前目錄下所有的“一級文件名稱”到一個字符串?dāng)?shù)組中返回 |
public File[] listFiles() | 獲取當(dāng)前目錄下所有的“一級文件對象”到一個文件對象數(shù)組中返回 |
使用listFiles方法時的注意事項:
- 當(dāng)主調(diào)是文件,或者路徑不存在時,返回
null
。 - 當(dāng)主調(diào)是空文件夾時,返回一個長度為0的數(shù)組。
- 當(dāng)主調(diào)是一個有內(nèi)容的文件夾時,將里面所有一級文件和文件夾的路徑放在File數(shù)組中返回。
- 當(dāng)主調(diào)是一個文件夾,且里面有隱藏文件時,將里面所有文件和文件夾的路徑放在File數(shù)組中返回,包含隱藏文件。
- 當(dāng)主調(diào)是一個文件夾,但是沒有權(quán)限訪問該文件夾時,返回
null
。
方法遞歸
認(rèn)識遞歸
遞歸是一種算法,從形式上來說,方法調(diào)用自身的形式稱為方法遞歸。
兩種形式
- 直接遞歸:方法自己調(diào)用自己。
- 間接遞歸:方法調(diào)用其他方法,其他方法又回調(diào)方法自己。
案例:遞歸求階乘
public class RecursionTest2{ public static void main(String[] args ){ int result = f(5); System.out.println("5的階乘是:"+result); } public static int f(int n){ if(n==1) return 1; else return n*f(n-1); } }
遞歸算法的三要素:
- 遞歸公式
- 遞歸的終結(jié)點
- 遞歸的方向必須走向終結(jié)點
文件搜索
使用遞歸算法搜索需要的文件。
public class Test { public static void main(String[] args) { File dir = new File("C:\\"); searchFile(dir,"QQ.exe"); } public static void searchFile(File dir,String fileName){ if(dir==null||!dir.exists()) return; File[] files = dir.listFiles(); if(files!=null && files.length>0){ for(File file:files){ if(file.isFile()){ if(file.getName().equals(fileName)){ System.out.println("找到了目標(biāo)文件:"+file.getAbsolutePath()); } }else{ searchFile(file,fileName); } } } } }
字符集
常見字符集
標(biāo)準(zhǔn)ASCII字符集
定義:
ASCII(American Standard Code for Information Interchange,美國信息交換標(biāo)準(zhǔn)代碼),包含英文、符號等字符。存儲規(guī)則:
- 使用 1個字節(jié) 存儲一個字符,首位固定為0。
- 可表示的字符總數(shù):
2^7 = 128
個(滿足英語等簡單語言需求)。
局限性:
- ASCII無法編碼中文等復(fù)雜字符,需擴(kuò)展字符集。
GBK(漢字內(nèi)碼擴(kuò)展規(guī)范,國標(biāo))
定位:
漢字編碼字符集,涵蓋 2萬多個漢字及符號,解決中文存儲問題。存儲規(guī)則:
- 中文字符:1個中文字符 → 2個字節(jié) 存儲。
- 兼容性:兼容ASCII字符集(ASCII字符仍用1字節(jié)、首位為0存儲,與GBK共存)。
編碼規(guī)則:
漢字的 第一個字節(jié)的第一位必須是1(用于區(qū)分ASCII字符,避免沖突)。示例輔助:
- 字符示例:
我a你
(“我”“你”是漢字,各占2字節(jié);“a”是ASCII,占1字節(jié))。 - 字節(jié)結(jié)構(gòu)對比:
- 原始混合(ASCII + 漢字):
xxxxxxxx xxxxxxxx 0xxxxxxx xxxxxxxx xxxxxxxx
(中間0xxxxxxx
是ASCII的“a”,兩側(cè)是漢字的兩字節(jié)) - 規(guī)范后(漢字首字節(jié)第一位為1):
1xxxxxxx xxxxxxxx 0xxxxxxx 1xxxxxxx xxxxxxxx
- 原始混合(ASCII + 漢字):
- 字符示例:
Unicode(統(tǒng)一碼、萬國碼)
定位:
跨語言、跨平臺的字符編碼標(biāo)準(zhǔn),目標(biāo)是覆蓋全球所有字符(包括各國文字、符號、 emoji 等)。核心特點:
- 唯一碼點:為每個字符分配 全球唯一的數(shù)字編號(如
U+0041
表示字母A
,U+4E2D
表示漢字中
)。 - 與編碼方式無關(guān):Unicode 僅定義字符與數(shù)字的映射關(guān)系,具體存儲需依賴 UTF-8/UTF-16/UTF-32 等編碼實現(xiàn)。
- 唯一碼點:為每個字符分配 全球唯一的數(shù)字編號(如
局限性:
Unicode 本身不規(guī)定存儲方式,直接按碼點存儲(如U+4E2D
需 2 字節(jié))會導(dǎo)致 空間浪費(如 ASCII 字符僅需 1 字節(jié),但 Unicode 需 2 字節(jié))。
UTF-8(Unicode Transformation Format - 8-bit)
定位:
Unicode 的可變長度編碼方式,是互聯(lián)網(wǎng)最主流的字符編碼(兼容 ASCII,節(jié)省存儲空間)。存儲規(guī)則:
- 可變字節(jié)數(shù):根據(jù)字符復(fù)雜度動態(tài)調(diào)整字節(jié)數(shù):
- 1字節(jié):ASCII 字符(范圍:
U+0000 ~ U+007F
,首位固定為0
,與 ASCII 完全兼容)。 - 2字節(jié):大部分歐洲語言、中東字符(范圍:
U+0080 ~ U+07FF
)。 - 3字節(jié):東亞文字(如中文、日文、韓文,范圍:
U+0800 ~ U+FFFF
)。 - 4字節(jié):罕見字符、emoji(范圍:
U+10000 ~ U+10FFFF
)。
- 1字節(jié):ASCII 字符(范圍:
- 字節(jié)結(jié)構(gòu)規(guī)則:
- 多字節(jié)字符的 首字節(jié) 用
1
標(biāo)識長度(如110xxxxx
表示2字節(jié),1110xxxx
表示3字節(jié))。 - 后續(xù)字節(jié) 固定以
10
開頭(如10xxxxxx
)。
- 多字節(jié)字符的 首字節(jié) 用
- 可變字節(jié)數(shù):根據(jù)字符復(fù)雜度動態(tài)調(diào)整字節(jié)數(shù):
優(yōu)勢:
- 兼容性:完全兼容 ASCII,舊系統(tǒng)可無縫升級。
- 節(jié)省空間:對常用字符(如英文)僅用 1 字節(jié),復(fù)雜字符按需擴(kuò)展。
對比總結(jié)
字符集 | 編碼方式 | 存儲空間特點 | 兼容性 | 典型應(yīng)用場景 |
---|---|---|---|---|
ASCII | 定長(1字節(jié)) | 僅支持128個字符 | 無擴(kuò)展支持 | 早期英文系統(tǒng) |
GBK | 混合(1/2字節(jié)) | 中文占2字節(jié),兼容ASCII | 僅支持中文及少數(shù)符號 | 中文Windows系統(tǒng) |
Unicode | 無(僅碼點) | 需配合UTF-8/16/32存儲 | 需轉(zhuǎn)換才能兼容舊系統(tǒng) | 跨語言標(biāo)準(zhǔn)(如Java內(nèi)部) |
UTF-8 | 變長(1-4字節(jié)) | 英文1字節(jié),中文3字節(jié) | 完全兼容ASCII | 互聯(lián)網(wǎng)、Linux/ macOS系統(tǒng) |
- 核心邏輯:UTF-8 通過可變長度編碼平衡了 全球字符覆蓋 和 存儲效率,成為全球化場景的首選編碼。
- 注意:字符編碼是使用的字符集,和解碼時使用的字符集必須一致,否則會出現(xiàn)亂碼。
編碼與解碼
字符串編碼與解碼方法總結(jié)
- (1)編碼:
String → 字節(jié)數(shù)組
方法簽名 | 說明 |
---|---|
byte[] getBytes() | 用平臺默認(rèn)字符集,將字符串編碼為字節(jié)數(shù)組 |
byte[] getBytes(String charsetName) | 用指定字符集(如"UTF-8" ),將字符串編碼為字節(jié)數(shù)組 |
- (2)解碼:
字節(jié)數(shù)組 → String
構(gòu)造方法簽名 | 說明 |
---|---|
String(byte[] bytes) | 用平臺默認(rèn)字符集,解碼字節(jié)數(shù)組為字符串 |
String(byte[] bytes, String charsetName) | 用指定字符集(如"UTF-8" ),解碼字節(jié)數(shù)組為字符串 |
示例代碼(Java)
import java.io.UnsupportedEncodingException; public class SimpleCharsetExample { public static void main(String[] args) { String text = "你好"; try { // 編碼:String → byte[] byte[] utf8Bytes = text.getBytes("UTF-8"); // UTF-8編碼,1個中文占3字節(jié) byte[] gbkBytes = text.getBytes("GBK"); // GBK編碼,1個中文占2字節(jié) System.out.println("UTF-8字節(jié)數(shù):" + utf8Bytes.length); // 輸出:6 System.out.println("GBK字節(jié)數(shù):" + gbkBytes.length); // 輸出:4 // 解碼:byte[] → String String decodedUtf8 = new String(utf8Bytes, "UTF-8"); // 正確解碼 String decodedGbk = new String(gbkBytes, "GBK"); // 正確解碼 String wrongDecode = new String(utf8Bytes, "GBK"); // 錯誤解碼(亂碼) System.out.println("UTF-8解碼:" + decodedUtf8); // 輸出:你好 System.out.println("GBK解碼:" + decodedGbk); // 輸出:你好 System.out.println("錯誤解碼:" + wrongDecode); // 輸出亂碼:浣犲ソ } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } }
核心注意事項
字符集必須一致:
編碼用UTF-8
,解碼也必須用UTF-8
;若編碼和解碼字符集不同,必然出現(xiàn)亂碼(如示例中用GBK
解碼UTF-8
字節(jié))。平臺默認(rèn)字符集的風(fēng)險:
getBytes()
和new String(byte[])
依賴系統(tǒng)默認(rèn)字符集(Windows 多為GBK
,Linux/Mac 多為UTF-8
),跨平臺易出問題,建議始終顯式指定字符集(如"UTF-8"
)。異常處理:
方法會拋出UnsupportedEncodingException
(如傳入不存在的字符集"UTF8"
,少寫橫線),需捕獲或聲明拋出。
總結(jié)
到此這篇關(guān)于Java IO流必備之File、遞歸與字符集的文章就介紹到這了,更多相關(guān)Java IO流File、遞歸與字符集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot如何統(tǒng)一設(shè)置時區(qū)
這篇文章主要介紹了springboot如何統(tǒng)一設(shè)置時區(qū)問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-01-01Java 枚舉類和自定義枚舉類和enum聲明及實現(xiàn)接口的操作
這篇文章主要介紹了Java 枚舉類和自定義枚舉類和enum聲明及實現(xiàn)接口的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-02-02Java+Nginx實現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù)
本篇文章的內(nèi)容是介紹Java+Nginx如何實現(xiàn)POP、IMAP、SMTP郵箱代理服務(wù),步驟詳細(xì),思路清新,需要的朋友可以參考下2015-07-07idea中提示Class 'xxx' is never us
這篇文章主要介紹了idea中提示Class 'xxx' is never used的解決方案,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01Java實現(xiàn)上傳和下載功能(支持多個文件同時上傳)
這篇文章主要介紹了Java實現(xiàn)上傳和下載功能,支持多個文件同時上傳,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-12-12SpringBoot注解@EnableScheduling定時任務(wù)詳細(xì)解析
這篇文章主要介紹了SpringBoot注解@EnableScheduling定時任務(wù)詳細(xì)解析,@EnableScheduling 開啟對定時任務(wù)的支持,啟動類里面使用@EnableScheduling 注解開啟功能,自動掃描,需要的朋友可以參考下2024-01-01IntelliJ IDEA 詳細(xì)圖解最常用的配置(適合剛剛用的新人)
這篇文章主要介紹了IntelliJ IDEA 詳細(xì)圖解最常用的配置,本篇教程非常適合剛剛用的新人,本文圖文并茂給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-08-08