亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java?IO流必備之File、遞歸與字符集舉例詳解

 更新時間:2025年06月10日 10:28:24   作者:EnigmaCoder  
Java?IO輸入輸出是我們?nèi)粘i_發(fā)中必不可少的一部分,無論是讀寫文件、傳輸數(shù)據(jù)、處理日志,IO?都是底層支持,這篇文章主要介紹了Java?IO流必備之File、遞歸與字符集的相關(guān)資料,需要的朋友可以參考下

File

  • Filejava.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

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)。
  • 局限性
    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)。
    • 字節(jié)結(jié)構(gòu)規(guī)則
      • 多字節(jié)字符的 首字節(jié) 用 1 標(biāo)識長度(如 110xxxxx 表示2字節(jié),1110xxxx 表示3字節(jié))。
      • 后續(xù)字節(jié) 固定以 10 開頭(如 10xxxxxx)。
  • 優(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)文章

最新評論