本文目錄一覽:
如何理解java中的流概念
一、概念
Java中對文件的操作是以流的方式進行的。流是Java內存中的一組有序數據序列。Java將數據從源(文件、內存、鍵盤、網絡)讀入到內存中,形成了流,然後將這些流還可以寫到另外的目的地(文件、內存、控制台、網絡),之所以稱為流,是因為這個數據序列在不同時刻所操作的是源的不同部分。
二、分類
流的分類,Java的流分類比較豐富,剛接觸的人看了後會感覺很暈。流分類的方式很多:
1、按照輸入的方向分,輸入流和輸出流,輸入輸出的參照對象是Java程序。
2、按照處理數據的單位不同分,位元組流和字符流,位元組流讀取的最小單位是一個位元組(1byte=8bit),而字符流一次可以讀取一個字符(1char = 2byte = 16bit)。
3、按照功能的不同分,分節點流和處理流,節點流是直接從一個源讀寫數據的流(這個流沒有經過包裝和修飾),處理流是在對節點流封裝的基礎上的一種流,FileInputStream是一個接點流,可以直接從文件讀取數據,但是BufferedInputStream可以包裝 FileInputStream,使得其有緩衝功能。
其實除了以上三種分類外,還有一些常常聽到的一些分類比如:對象流、緩衝流、壓縮流、文件流等等。其實都是節點流和處理流的子分類。當然你也可以創建新的流類型,只要你需要。
三、流分類的關係
不管流的分類是多麼的豐富和複雜,其根源來自於四個基本的類。這個四個類的關係如下:
位元組流 字符流
輸入流 InputStream Reader
輸出流 OutputStream Writer
!– EndFragment–
四、位元組流和字符流的相互轉換
1、從位元組流到字符流:InputStreamReader、OutputStreamWriter類可以實現。
2、從字符流到位元組流:可以從字符流中獲取char[]數組,轉換為String,然後調用String的API函數getBytes() 獲取到byte[],然後就可以通過ByteArrayInputStream、ByteArrayOutputStream來實現到位元組流的轉換。
java裏面的節點流和處理流是什麼意思?
在JAVA中的流按流動方向可以分為輸入流及輸出流兩種,按流的處理位置可分為節點流和包裝流。輸入流,輸出流是以程序為參考點來說的,所謂的輸入流就是程序從中獲取數據的流,輸出流就是程序要其寫數據的流。在輸入流的一邊是程序,而另一邊就是流的數據源。而輸出流的一邊則目標,一邊就是程序。其實流可以想像成是一條長河,在上游有一水庫提供水源,河邊住着一戶人,隨時都可以從河邊取到水,同時,這戶人也可以把一些廢水倒進河裡,使得廢水可以流進大海。這裡所提到河就是一個數據的流動通道,而水庫就好比是計算機上的一切數據源,包括磁盤文件,內存,IO設備,鍵盤等等,JAVA提供了非常完善的輸入流類來把這些數據源掛接到流上使得程序能從這些輸入流中獲取所需的數據。河邊上的用戶就是程序,它能隨時隨地從流中取得數據,只要有數據源掛接到這個通道上可以。而大海就是程序處理完數據後要流向的目的地,這些目的地包抱磁盤文件,內存,IO設備,顯示器等,這些目的地只是相對程序來說的,它們也可能是別的進程的輸入流。如下例子,將數據輸出到別的文件,再從文件中讀出數據\x0d\x0aFilef=newFile(「1.test」);\x0d\x0aTry{FileOutputStreamout=newFileOutStream(f);\x0d\x0aBytebuf[]=」helloworld」.getBytes();Out.write(buf);\x0d\x0aOut.close();}catch(Exceptione){\x0d\x0aSystem.out.println(e.getMessage());\x0d\x0a}try\x0d\x0a{FileInputStreamin=newFileInputStream(f);\x0d\x0abytebuf[]=newbyte[1024];intlen=in.read(buf);\x0d\x0aSystem.out.println(newString(buf,0,len));}\x0d\x0acatch(Exceptione){\x0d\x0aSystem.out.println(e.getMessage());}\x0d\x0a程序用於直接操作目標設備所對應的類叫節點流類,程序也可以通過一個間接流類去調用節點流類,以達到更加靈活方便地讀寫各種類型的數據,這個間接流類就是包裝流類。
java中有幾種類型的流
Java中的流分為兩種,一種是位元組流,另一種是字符流,分別由四個抽象類來表示(每種流包括輸入和輸出兩種所以一共四個):InputStream,OutputStream,Reader,Writer。Java中其他多種多樣變化的流均是由它們派生出來的.
字符流和位元組流是根據處理數據的不同來區分的。位元組流按照8位傳輸,位元組流是最基本的,所有文件的儲存是都是位元組(byte)的儲存,在磁盤上保留的並不是文件的字符而是先把字符編碼成位元組,再儲存這些位元組到磁盤。
1.位元組流可用於任何類型的對象,包括二進制對象,而字符流只能處理字符或者字符串;
2. 位元組流提供了處理任何類型的IO操作的功能,但它不能直接處理Unicode字符,而字符流就可以。
讀文本的時候用字符流,例如txt文件。讀非文本文件的時候用位元組流,例如mp3。理論上任何文件都能夠用位元組流讀取,但當讀取的是文本數據時,為了能還原成文本你必須再經過一個轉換的工序,相對來說字符流就省了這個麻煩,可以有方法直接讀取。
字符流處理的單元為2個位元組的Unicode字符,分別操作字符、字符數組或字符串,而位元組流處理單元為1個位元組, 操作位元組和位元組數組。所以字符流是由Java虛擬機將位元組轉化為2個位元組的Unicode字符為單位的字符而成的,所以它對多國語言支持性比較好!
原創文章,作者:DTEN,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/149841.html