理解JAVa處理文本文件及字節文件的方式

在計算機中保存的數據都只是二進制符號並按字節爲單位來保存,對計算機看來字符A並不是字符A,而只是一個沒有意義的二進制數字是一個字節。我們利用JAVA的IO類進行讀寫數據的時候所提供的大部份的方法都是採用讀寫字節的方式,而且通過這種讀寫字節的方法是可以保存任可類型的數據的,因爲任數據類型在計算機中都是字節碼,前提是你要先將你寫入的數據先轉換成字節類型再通過輸出流類輸出,而要使得讀取出來的數據對我們的程序有意義,我們必須將讀取出來的字節按它保存時所表達的意義轉換回來,如:保存的時候是char型的,那麼我們就要把讀取出來的字節數據類型轉換成char類型還原它來所表達的意義,要不如果直接輸出這個字節數據所得的僅僅是一個16進制的符號,對我們來說是沒有意義的。所以,在JAVA裏字節類型是一種萬能的數據類型,也是數據在計算機裏的真正面目。

JAVA的IO類爲了方便我們輸入輸出那些基本的數據類型,基本上在各種的IO類裏都提供了針對專門各種的基本數據類型的讀寫方法,這些方法其實是已經封裝了那些轉換代碼了,如:readInt writeInt 等,但似乎就是沒有提供讀寫STRING類型的方法,原因是JAVA提供了專門讀寫文本字符的IO類,如:reader writer這兩個抽像基類,以及由其派生出來的子類都是專門用來讀寫文本字符的。因此,如果你要讀取文本文件的都話就不要去用inputstrem outStrem這一系列的IO類了,而要使用reader writer 這系列的類了,因爲它們不是針對文本的,如果非要用不可的話,你就要在程序中設定專門的程序代碼來做這些字符的轉換了。如下代碼所示:

RandomAccessFile ra=new RandomAccessFile("c://1.txt","rw");  //RandomAccessFile類不支持字符的直接讀寫的

String s=new String("hello world"); 

ra.write(s.getBytes()); //將String轉換成字節類型

byte buf[]=new byte[1024];   //定義一個字節數組用以接收讀取到的字節數據

raf.read(buf,0,512);  //RandomAccessFile類不支持字符的直接讀取
  
System.out.println("name:"+new String(buf));  //將讀取出來的字節數據轉換成String並輸出。

這裏還有一個問題,那就是字符編碼的問題,在JAVA虛擬機上字符是以UNICODE的格式來表示的,而我們的機器則是以本地機字符集對字符編碼的,所以存在同一個字符有兩種不同的表示,因此,當我們想以GB2312也就是簡體中文的格式來把這些字符保存在文件上,並以簡體中文的格式在顯示器(輸出流)上顯示這些字符,那麼我們只得先將UNICODE格式的String轉換成GB2312格式的字符編碼即s.getBytes(),其實這個方法的作用是用本地的字符編碼將UNICODE格式的字符編碼轉換成GB2312的編碼,除非你的機器本地編碼是採用UNICODE格式,否則這樣的轉換是免不了的,即使採用包裝類也只是用方法來把這個轉換過程隱藏了。JAVA採用UNICODE來做爲JVM的字符編碼,是因爲UNICODE是全球的統一標準,有助於JAVA 的跨平臺實現,但無奈現實中還是有很多系統仍然採用各自國家的字符編碼,因此JAVA不得不提供一種方法來進行UNICODE與當地字符編碼的轉換。

發佈了13 篇原創文章 · 獲贊 1 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章