java學習之【轉載】java io小結

我在網上找到一篇關於java 小結的文章,感覺不錯,就直接貼了下來,以下是全文:

http://topic.csdn.net/u/20100607/21/e3a9b768-2059-4213-85ab-b1aa32d072a8.html 寫道
回調(又稱爲callback):可以理解爲一個接口提供一些方法給其他類用,但同時其他類在調用它時,它又調用其他類給它的條件(重寫)。

單獨一個隨機訪問文件類: RondomAccessFile類允許隨機訪問文件同時擁有讀和寫的功能。
其中方法: close(),read(),writer(),seek(),getFilePointer()這需要注意:這是在有seek()前提下。
流:
一.I/O 流(java 如何實現與外界數據的交流)
流定義:
任何有能力產出數據的數據源對象或者有能力接收數據的數據源對象。他屏蔽了實際的I/O設備處理數據的細節。
1.Input/Output:指跨越出了JVM 的邊界,與外界數據的源頭或者目標數據源進行數據交換。

2.流的分類:
按流向分爲輸入流和輸出流;
按傳輸單位分爲字節流(Stream)結尾的和字符流(Reader和Writer);
按功能還可以分爲節點流和過濾流。
節點流:負責數據源和程序之間建立連接;(相當於裸槍)
過濾流:用於給節點增加功能。(相當於功能零部件)
過濾流的構造方式是以其他流位參數構造(這樣的設計模式稱爲裝飾模式)。
注:I/O流是一類很寶貴的資源,使用完後必須調用close()方法關閉流並釋放資源。在關閉流時只用關閉最外層的流。
3.File 類(java.io.*)可表示一個文件,也有可能是一個目錄
(在JAVA 中文件和目錄都屬於這個類中,而且區分不是非常的明顯
4.Java.io 下的方法是對磁盤上的文件進行磁盤操作,但是無法讀取文件的內容。
注意:創建一個文件對象和創建一個文件在JAVA 中是兩個不同的概念。前者是在虛擬機中創建了一個文件,
但卻並沒有將它真正地創建到OS 的文件系統中,隨着虛擬機的關閉,這個創建的對象也就消失了。
而創建一個文件纔是在系統中真正地建立一個文件。

二File類:我們猛看起來像是文件,其實他也可以指代一個文件集,當作爲文件集時我們可以對此調用List方法。
這個類的常用構造有:File("路徑"),File(“前邊路徑”,“後邊路徑”)File(File,“路徑”)
這個類的常用方法:exists(),delete(),getName(),getPath(),isDirectory(),isFile(),length(),
listFile(FileFilter),主要用來過濾文件這裏有(可以用來嵌套內部類)
mkdir(),mkdirs(),toString(),
FileFilter接口只有accept方法,其返回值爲Boolean型,可以在其裏邊寫一些正則表達式來對文件進行篩選。
這裏需要注意的是傳入accept的參數必須是final類型(匿名內部類的要求),這樣他才能使用該類範圍之外的隊像。
順便講講:內部類優點 高聚攏性,缺點在於不易閱讀,謹慎使用。
三 字節流:
InputStream/OutputStream 所有輸入輸入流的父類,是抽象類。
子類有:FileInputStream/FileOutputStream(節點流)(注意FileInputStream(path名,boolean)Boolean爲true 表示拼接)
DataInputStream/DataOutputStream 數據輸入流允許應用程序以與"機器無關方式"
從底層輸入流中讀取基本 Java 數據類型 (8種基本類型,加一種String)讀入寫出時類型必須一致
BufferedInputStream/BufferedOutputStream 字節緩衝流 用於給節點流增加一個緩衝的功能。(典型的犧牲空間換時間)
1.字節輸入流:io包中的InputStream爲所有字節輸入流的父類。
Int read();讀入一個字節(每次一個);
可先使用new byte[]=數組,調用read(byte[] b)
read (byte[])返回值可以表示有效數;read (byte[])返回值爲-1 表示結束。
2.在流中close()方法由程序員控制。因爲輸入輸出流已經超越了JVM的邊界,所以有時可能無法回收資源。
原則:凡是跨出虛擬機邊界的資源都要求程序員自己關閉,不要指望垃圾回收。
四、字節流的字符編碼:
字符編碼把字符轉換成數字存儲到計算機中,按ASCii 將字母映射爲整數。
把數字從計算機轉換成相應的字符的過程稱爲解碼。
亂碼的根源在於編解碼方式不統一。在世界上任何一種編碼方式中都會向上兼容ASCII碼。所以英文沒有亂碼。
編碼方式的分類:
ASCII(數字、英文):1 個字符佔一個字節(所有的編碼集都兼容ASCII)
ISO8859-1(歐洲):1 個字符佔一個字節
GB-2312/GBK:1 個字符佔兩個字節。GB代表國家標準。
GBK是在GB-2312上增加的一類新的編碼方式,也是現在最常用的漢字編碼方式。
Unicode: 1 個字符佔兩個字節(網絡傳輸速度慢)
UTF-8:變長字節,對於英文一個字節,漢字三個字節。
原則:保證編解碼方式的統一,才能不至於出現錯誤。
I/O學習種常範的兩個錯誤 1。忘了加flush2.沒有加換行。
五。字符流
Reader/Writer所有字符流的父類
其子類有
InputStreamReader/OutputStreamWriter 稱爲從字節流到字符流的橋轉換類。這個類可以設定字符轉換方式
FileReader/FileWriter (FileInputStream/FileOutputStream和InputStreamReader/OutputStreamWriter)的組合,只能是本地默認編碼
Bufferedreader/BufferedWriter 字符緩衝流,其特有方法readLine()讀取一個文本行,newLine()表示Writer到下一個文本行
六 。
一.對象序列化
1. 定義:把一個對象通過I/O流寫到文件(持久性介質)上的過程叫做對象的序列化。
2. 序列化接口:Serializable
此接口沒有任何的方法,這樣的接口稱爲標記接口。
3. 不是所有對象都能序列化的,只有實現了Serializable的類,他的實例對象纔是可序列化的。
4. 在Java種定義了一套序列化規範,對象的編碼和解碼方式都是已經定義好的。
5. class ObjectOutputStream 和ObjectInputStream也是過濾流,使節點流直接獲得輸出對象。
[email protected]
最有用的方法:
(1)writeObject(Object b)
(2)readObject();該方法返回的是讀到的一個對象,但是需要我們注意的是,該方法不會以返回null表示讀到文件末尾。
而是當讀到文件末尾時會拋出一個IOException;
6. 序列化一個對象並不一定會序列化該對象的父類對象
7. 瞬間屬性(臨時屬性)不參與序列化過程。
8. 所有屬性必須都是可序列化的,特別是當有些屬性本身也是對象的時候,要尤其注意這一點。序列化的集合就要求集合中的每一個元素都是可序列化的。
9. 用兩次序列化把兩個對象寫到文件中去(以追加的方式),
和用一次序列化把兩個對象寫進文件的大小是不一樣的。
因爲每次追加時都會要在文件中加入一個開始標記和結束標記。所以對於對象的序列化不能以追加的方式寫到文件中。
 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章