Java字元流與位元組流區別與用法分析

NO IMAGE

本文例項講述了Java字元流與位元組流區別與用法。分享給大家供大家參考,具體如下:

位元組流與字元流主要的區別是他們的的處理方式

流分類:

1.Java的位元組流

InputStream是所有位元組輸入流的祖先,而OutputStream是所有位元組輸出流的祖先。

2.Java的字元流

Reader是所有讀取字串輸入流的祖先,而writer是所有輸出字串的祖先。

InputStream,OutputStream,Reader,writer都是抽象類。所以不能直接new
位元組流是最基本的,所有的InputStream和OutputStream的子類都是,主要用在處理二進位制資料,它是按位元組來處理的
但實際中很多的資料是文字,又提出了字元流的概念,它是按虛擬機器的encode來處理,也就是要進行字符集的轉化
這兩個之間通過 InputStreamReader,OutputStreamWriter來關聯,實際上是通過byte[]和String來關聯

在實際開發中出現的漢字問題實際上都是在字元流和位元組流之間轉化不統一而造成的

在從位元組流轉化為字元流時,實際上就是byte[]轉化為String時,


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 他們具有緩衝區
例如:讀取檔案 從位元組流輸入到字元流輸入
定義一個位元組流:


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;
}
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; }

例如:寫入檔案 從位元組流輸出到字元流輸出


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  將字串轉化為位元組流


/**/ ///  <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  將位元組流轉化為字串


/**/ ///  <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程式設計有所幫助。

您可能感興趣的文章:

Java檔案(io)程式設計之檔案字元流使用方法詳解Java 中IO流字元流詳解及例項詳解Java中字元流與位元組流的區別java程式設計中位元組流轉換成字元流的實現方法Java字元流和位元組流對檔案操作的區別詳解Java中字元流與位元組流的區別Java程式設計中位元組流與字元流IO操作示例java字元流緩衝區詳解