【转】文本文件和二进制文件区别及java中字节流和字符流归纳
首先在物理上文本文件和二進制文件并沒有區別,都是以二進制01的形式存放于存儲介質中,他們的區別只是邏輯上的區別,這兩種方式只是在編碼層次上有差別。文本文件是基于字符編碼的文件,常見的編碼有ASCII編碼,UNICODE編碼等等。二進制文件是基于值編碼的文件,你可以根據具體應用,指定某個值是什么意思(這樣一個過程,可以看作是自定義編碼)。
對于讀到的二進制流的解釋方式可以分為按文本方式和按二進制方式打開,按文本方式比如ASCII碼形式解釋,就把讀到的二進制流每8比特8比特的翻譯,存儲是反過程,如果按照二進制的方式打開,則沒有任何編碼解碼的過程。
一:c的文本讀寫和二進制讀寫基本沒有區別,只是文本讀寫會對回車換行進行轉化,二進制讀寫不會有轉化的過程。
二:Java提供了很多進行文件輸入輸出的類,這些類可以分為文本I/O類和二進制I/O類。文本I/O將數據解釋成字符的序列,二進制I/O將數據解釋成原始的二進制數。文本在文件中如何存儲依賴于文件的編碼方式。Java對文本I/O提供自動編碼與解碼
在文本文件中存儲的數據是以人能讀懂的方式表示的,而在二進制文件中存儲的數據是用二進制形式來表示的。人讀不懂二進制文件,它們是為程序讀取而設計的。例如,Java源程序存儲在文本文件中,可以使用文本編輯器閱讀,但是Java的類存儲在二進制文件中,使用Java虛擬機閱讀。二進制文件的好處是處理它們的效率比文本文件高
文本文件是字符的序列構成的,二進制文件是由位的序列構成的。例如,十進制整數199在文本文件中是以三個字符序列‘1’、‘9’、‘9’來存儲的,而在二進制文件中它是以byte類型的值C7存儲的
1、文本輸入輸出
Java用于文本輸入輸出的類:
Reader:一個讀取字符的抽象基類
Writer:一個向文件中寫入字符的抽象基類
FileReader:以主機上默認的編碼方式從文件中讀取字符的類
FileWriter:以主機上的默認編碼方式向文件中寫入字符的類
BufferedReader:一個從緩沖區讀取字符的類
BufferedWriter:一個向緩沖區寫入字符的類
PrintWriter:以文本方式輸出基本類型值、字符和字符串
PrintStream:與PrintWriter類似,只是向控制臺輸出
PrintWriter類和PrintSream類可以將對象、字符串和數值以文本的方式輸出
out是定義在System類中類型為PrintStream的一個靜態變量。默認情況下,out表示標準輸出設備,也就是屏幕。可以使用System.setOut(PrintStream)設置新的out
InputStreamReader類:以指定的編碼方案從文件中讀取字符的類
OutpitStreamWriter類:以指定的編碼方案向文件中寫入字符的類
InputStreamReader類和OutpitStreamWriter類用于實現字符和字節之間的轉化。寫入OutpitStreamWriter的字符用指定的編碼方案翻譯為字節,同樣,從InputStreamReader類讀出的字符用指定的編碼方案解碼為字符。可以使用InputStreamReader類和OutpitStreamWriter類的構造函數指定編碼方案,如果沒有指定它,采用系統默認的編碼方案
InputStreamReader類和OutpitStreamWriter類的getEncoding()方法返回這個數據流使用的編碼方案名稱
java程序使用的是統一碼(Unicode),從FileReader流中讀取一個字符時,返回該字符的統一碼。字符在文件中的編碼可能不是統一碼,Java自動將統一碼轉換為文件指定的編碼
2、二進制輸入輸出
文本輸入輸出需要進行編碼與解碼操作,向文件寫入字符時,Java虛擬機將輸出字符的統一碼轉化為文件指定的編碼,對應地,從文件讀取字符時,將文件中指定的編碼轉化為統一碼。二進制輸入輸出不要求這些轉化,向文件寫入字節,就是將源字節復制到文件中,從文件讀取字節,就是將文件中的字節原樣返回
例如,假設使用文本I/O將字符‘9’寫入文件。由于字符‘9’的統一碼是0x0039,所以會根據文件的編碼方案將統一碼為0x0039轉化成新的編碼。如果用二進制I/O將一個值存入文件,那么該整數在內存中的精確值被復制到文件中
由于二進制I/O不需要編碼和解碼,所以要比文件I/O效率高。二進制文件與主機的編碼方案無關,因而是可移植的,所以Java程序可以在任何機器上訪問Java程序創建的二進制文件。這也是把Java的類文件存儲為二進制文件的原因,因為Java類文件可以在任何具有Java虛擬機的機器上運行
Java用于二進制輸入輸出的類:
InputStream:用于字節輸入流的抽象基類
OutputStream:用于字節輸出流的抽象基類
FileInputStream:一個從文件讀取字節的類
FileOutputStream:一個向文件寫入字節的類
DataInputStream:用于讀取基本類型數據值和字符串的類
DataOutputStream:用于輸出基本類型數據值和字符串的類
BufferedInputStream:一個從緩沖區讀取字節的類
BufferedOutputStream:一個向緩沖區內寫入字節的類
FilterInputStream類和FilterOutputStream類:
過濾器數據流是為某種目的過濾字節的數據流。基本字節數如流提供的讀取方法只能用來讀取字節。如果想要讀取整數值、雙精度值或字符串,需要一個過濾器類來包裝輸入流。使用過濾器類就可以讀取整數值雙精度值或字符串,而不僅僅是字節或字符
DataInputStream擴展了FilterInputStream類并實現了DataInput接口,實現了定義在DataInput接口中讀取基本類型值和字符串的方法
DataOutputStream擴展了FilterOutputStream類并實現了DataOutput接口,實現了定義在DataOutput接口中輸出基本類型值和字符串的方法
3、小結
從本質上說所有文件都是二進制文件,文本I/O是在二進制I/O基礎上提供的一層抽象,它封裝了字符的編碼和解碼過程。在文本I/O中自動進行編碼與解碼。對于二進制輸入,要想能夠以正確的類型和正確的順序讀取,并須準確地了解數據是如何讓寫入的
將一個字節寫入字節流時,字節的確切值發送到輸出流。將一個字符寫入字符流時,字符按照編碼方案轉換成它對應的數值。
從字節流中讀取一個字節時,是從輸入流讀出一個字節的值。而從字符流中讀取一個字符時,讀取稽幾個字節依賴于編碼系統
ACSII碼占8位,Java使用的是16位的Unicode碼。當一個統一碼無法轉換為ACSII碼時,轉換為字符‘?’。例如,如果想把統一碼‘u03b1’寫到字符流中,送入到字符流的是數值63(表示字符‘?’)。
文本文件依賴于主機所使用的編碼系統,所以將一個文本文件從一臺機器轉到另一臺機器上時,如果兩臺機器的編碼不同,可能會出現錯誤
總結
以上是生活随笔為你收集整理的【转】文本文件和二进制文件区别及java中字节流和字符流归纳的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 千元级亮机卡大战开始 Intel显卡驱动
- 下一篇: 【转】谈谈c#中异步编程模型的变迁**