本文實例講述了Java字符流與字節流區別與用法。分享給大家供大家參考,具體如下:
字節流與字符流主要的區別是他們的的處理方式
流分類:
1.Java的字節流
InputStream是所有字節輸入流的祖先,而OutputStream是所有字節輸出流的祖先。
2.Java的字符流
Reader是所有讀取字符串輸入流的祖先,而writer是所有輸出字符串的祖先。
InputStream,OutputStream,Reader,writer都是抽象類。所以不能直接new
字節流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進制數據,它是按字節來處理的
但實際中很多的數據是文本,又提出了字符流的概念,它是按虛擬機的encode來處理,也就是要進行字符集的轉化
這兩個之間通過 InputStreamReader,OutputStreamWriter來關聯,實際上是通過byte[]和String來關聯
在實際開發中出現的漢字問題實際上都是在字符流和字節流之間轉化不統一而造成的
在從字節流轉化為字符流時,實際上就是byte[]轉化為String時,
1
|
public String( byte bytes[], String charsetName) |
有一個關鍵的參數字符集編碼,通常我們都省略了,那系統就用操作系統的lang
而在字符流轉化為字節流時,實際上是String轉化為byte[]時,
byte[] String.getBytes(String charsetName)
也是一樣的道理
至于java.io中還出現了許多其他的流,按主要是為了提高性能和使用方便,
如:BufferedInputStream,PipedInputStream等
具體實現
字節流 FileInputStream FileOutputStream
字符流 FileReader FileWriter
字符流處理的單元為2個字節的Unicode字符,分別操作字符、字符數組或字符串,而字節流處理單元為1個字節,操作字節和字節數組。所以字符流是由Java虛擬機將字節轉化為2個字節的Unicode字符為單位的字符而成的,所以它對多國語言支持性比較好!如果是音頻文件、圖片、歌曲,就用字節流好點,如果是關系到中文(文本)的,用字符流好點.
所有文件的儲存是都是字節(byte)的儲存,在磁盤上保留的并不是文件的字符而是先把字符編碼成字節,再儲存這些字節到磁盤。在讀取文件(特別是文本文件)時,也是一個字節一個字節地讀取以形成字節序列.
字節流可用于任何類型的對象,包括二進制對象,而字符流只能處理字符或者字符串; 2. 字節流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以。
字節流轉換成字符流可以用 InputSteamReader OutputStreamWriter
轉換成BufferdReader BufferedWriter 他們具有緩沖區
例如:讀取文件 從字節流輸入到字符流輸入
定義一個字節流:
1
2
3
4
5
6
|
FileInputStream fileInputStream = new FileInputStream( "d:/text.txt" ); // 定義一個指向D:/TEXT.TXT 的字節流 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); //字節流轉換成InputStreamReader BufferedReader bufferedReader = new BufferedReader(inputSteamReader); //InputStreamReader 轉換成帶緩存的bufferedReader |
可以把讀出來的內容賦值給字符
1
2
3
4
5
6
|
String ss = new String(); String s; while ((s = bufferedReader.readLine())!= null ){ ss += s; } FileInputStream fileInputStream = new FileInputStream( "d:/text.txt" ); // 定義一個指向D:/TEXT.TXT 的字節流 InputStreamReader inputStreamReader = new InputStreamReader(fileInputStream); //字節流轉換成InputStreamReader BufferedReader bufferedReader = new BufferedReader(inputSteamReader); //InputStreamReader 轉換成帶緩存的bufferedReader 可以把讀出來的內容賦值給字符 String ss = new String(); String s; while((s = bufferedReader.readLine())!=null){ ss += s; } |
例如:寫入文件 從字節流輸出到字符流輸出
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
FileOutputStream fileOutputStream = new FileOutputStream( "d:/text.txt" ); //定義一個指向D:/TEXT.TXT文件 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter); bufferedWriter.write(s); bufferedWriter.close(); outputStreamWriter.close(); fileOutputStream.close(); FileOutputStream fileOutputStream = new FileOutputStream( "d:/text.txt" ); //定義一個指向D:/TEXT.TXT文件 OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream); BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter); bufferedWriter.write(s); bufferedWriter.close(); outputStreamWriter.close(); fileOutputStream.close(); |
例程:
將字符串轉化為字節流 #region 將字符串轉化為字節流
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/**/ /// <summary> /// 將字符串轉化為字節流 /// </summary> /// <param name="_Source"> 字串 </param> /// <returns> 字節流 </returns> public static byte [] String2Bytes( string strSource) { System.IO.MemoryStream memoryStream = new System.IO.MemoryStream(); System.IO.BinaryWriter binaryWriter = new System.IO.BinaryWriter(memoryStream); binaryWriter.Write( strSource ); byte [] buffer = memoryStream.GetBuffer(); return buffer; } #endregion |
將字節流轉化為字符串 #region 將字節流轉化為字符串
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
/**/ /// <summary> /// 將字節流轉化為字符串 /// </summary> /// <param name="bytData"> 字節流 </param> /// <returns> 字串 </returns> public static string Bytes2String( byte [] bytData) { // 字節流->字符串 System.IO.MemoryStream memoryStream2 = new System.IO.MemoryStream(bytData); System.IO.BinaryReader binaryReader = new System.IO.BinaryReader(memoryStream2); string s2 = binaryReader.ReadString(); return s2; } #endregion |
希望本文所述對大家java程序設計有所幫助。