本篇文章為大家帶來了關於java的相關知識,其中主要介紹了Java在創建文件時指定編碼的實現方法,文中通過示例代碼介紹的非常詳細,對大家的學習或工作有一定的參考學習價值,希望對大家有幫助。
推薦學習:《java影片教學》
前言:最近,學習了Java IO串流的相關的知識,想透過讀寫文件的方式練習和鞏固所學。在使用File類別建立檔案時,突然想到,我該如何指定檔案使用的編碼呢?進而想到,應該如何查看一個檔案的編碼呢?
先去網路上找答案,結果如下:
FileInputStream fis=new FileInputStream(“xxxx.txt”); OutputStreamWriter osw=new OutputStreamWriter(fis,“UTF-8”);
上面的程式碼大概意思是在寫入檔案時,寫入的字元使用UTF-8編碼,和我預想的不一樣,我想在建立文件的同時指定編碼。像下面這樣,
File myfile = new File("test.txt”, “UTF-8”); if (!myfile.exists()) myfile.createNewFile();
於是,我去查看Java API 8官方文檔,File沒有提供可以指定字元編碼的建構函數。
同時也沒提供set或get等其他存取字元字元編碼的方法,說明字元編碼不是檔案的固有屬性。像是檔案建立時間,檔案修改時間,是否可讀、可寫入、可執行,這些都是檔案的固有屬性,或是元訊息,它們是檔案的一部分。
我們知道,電腦中儲存的任何資訊都是01串,文字也不例外。
對於字元的處理包含兩個過程:編碼和解碼
#編碼:把字元"映射「到01字串
解碼:把01字串"映射「到字元
不同的字元編碼,例如GBK、UTF-8,編碼和解碼使用的規則不同。
對於同樣的文字字串:“中國”,使用UTF-8編碼保存,一般使用三個位元組保存一個漢字,(底層的01字串的16進位形式)。
使用GBK編碼儲存,使用兩個位元組表示一個漢字。
當我們在文字編輯器中寫好文字儲存時,編輯器會根據你設定的字元編碼類型將文字」對應「成01串。
你設定的字元類型,只是編輯器把文字編碼成成10串的轉換規則而已,並不是文字的屬性。
在編輯器開啟文字檔時,顯示的不是底層的01串,而是文字,是因為編輯器使用某種文字編碼,把01串解碼為字元。如果,解碼時,使用的字元編碼和編碼時的一致或相容,就可以正確顯示文字。如果解碼時,使用的字元編碼和編碼時的不一致或不相容,就會亂碼。
例如,我有一個文字檔案使用的是GBK編碼,內容是」明月幾時有“,
# #我使用VS code (微軟的一款非常好用的文字編輯器)開啟文件,用術語說,就是解碼文件。其預設使用的文字編碼是UTF-8,解碼相同。但是,因為我的文字底層是GBK編碼的01串(兩個位元組一個字元),使用UTF-8解碼01串,由於編碼,解碼不一致,必然會導致亂碼。這時,只要手動選擇對應的GBK編碼,解碼檔案就不會亂碼了。 亂碼也從側面說明了,字元編碼不是檔案的固有屬性。
扯了這麼多,就是為了說明這一點:字元編碼就是解碼和編碼時用的規則,不是檔案的固有屬性。
我不禁產生疑惑,為什麼當初不把字元編碼設定為檔案屬性的一部分呢?假設可以設置,並且設定為GBK,那麼作業系統需要維護改功能。像一個文件是不可寫的,那麼有程式試圖寫文件,作業系統會拒絕寫入一樣,作業系統必須寫入的位元組必須是滿足GBK編碼要求,那麼每次寫入字節,作業系統都需要檢查該位元組的合法性,這需要非常大的效能開銷,甚至是無法實現的,因為有些特殊位元組即可以表示GBK,也可以表示UTF-8,是有歧義的。在說,做這一些的意義是什麼,為了編輯器可以在開啟檔案的時候,可以根據編碼屬性選擇正確的編碼嗎?沒有必要,智慧的編輯器,可以根據內容的前幾個字節,推斷出你的01串使用了什麼編碼。另外,你也可以手動設定解碼所用的字元編碼。
在建立檔案的時候,無法指定檔案的編碼。在將文字寫入(例如文字編輯器的Ctrl S
儲存,本質執行的就是寫入操作)檔案時,可以選擇將文字轉換為01串的編碼規則。
針對Java程序,程式碼如下,正是文章最開始提及的程式碼:
FileInputStream fis=new FileInputStream(“xxxx.txt”); OutputStreamWriter osw=new OutputStreamWriter(fis,“UTF-8”);
推薦學習:《java影片教學》
以上是Java在建立文件時指定編碼的實作方法的詳細內容。更多資訊請關注PHP中文網其他相關文章!