IO總結

回調(又稱爲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的邊界,因此有時可能沒法回收資源。
         原則:凡是跨出虛擬機邊界的資源都要求程序員本身關閉,不要期望垃圾回收。  
4、字節流的字符編碼:
     字符編碼把字符轉換成數字存儲到計算機中,按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也是過濾流,使節點流直接得到輸出對象。
       ganbin@tarena.com.cn
      最有用的方法:
    (1)writeObject(Object b)
    (2)readObject();該方法返回的是讀到的一個對象,可是須要咱們注意的是,該方法不會以返回null表示讀到文件末尾。
     而是當讀到文件末尾時會拋出一個IOException;
    6. 序列化一個對象並不必定會序列化該對象的父類對象
    7. 瞬間屬性(臨時屬性)不參與序列化過程。
    8. 全部屬性必須都是可序列化的,特別是當有些屬性自己也是對象的時候,要尤爲注意這一點。序列化的集合就要求集合中的每個元素都是可序列化的。
    9. 用兩次序列化把兩個對象寫到文件中去(以追加的方式),
    和用一次序列化把兩個對象寫進文件的大小是不同的。
    由於每次追加時都會要在文件中加入一個開始標記和結束標記。因此對於對象的序列化不能以追加的方式寫到文件中。 java

 

流的分類:
  按數據方向分:輸入流和輸出流
    輸入流:InputStream/Reader
    OutputStream/Writer
  按數據類型分:字節流和字符流
   字節流:InputStream/OutputStream
   字符流:Reader/Writer
  按流的功能分:節點流和處理流
   節點流用操做數據的來源。
   處理流用來封裝節點流,從而給節點流增長一個功能,不能獨立存在,在關閉流時若是使用了處理流,只需關閉最外層的流就能夠了。
   區分節點流和處理流的小方法:
    看構造器,節點流參數爲數據來源,而處理流參數爲其餘流。

選擇流的思路:
  先考慮是輸入流仍是輸出流,
  再考慮是字節流仍是字符流,
  最後考慮是節點流仍是處理流。
  
字符流:Reader和Writer全部字符流的父類型
  Java技術使用Unicode來表示字符串和字符,並且提供16位版本的流,以便用相似的方法處理字符。 
  若是構造了一個鏈接到流的Reader和Writer,轉換規則會在使用缺省平臺所定義的字節編碼和Unicode之間切換。 
  
橋樑流:InputStreamReader和OutputStreamWriter(字節流轉化成字符流的橋轉換器)
  這兩個類不是用於直接輸入輸出的,他是將字節流轉換成字符流的橋轉換器,並能夠指定編解碼方式。
   
逐行讀寫流:BufferedReader/BufferedWriter
  以上兩個都是過濾流,須要用其餘的節點流來做參數構造對象。
  BufferedReader的方法:readLine():String ,當他的返回值是null時,就表示讀取完畢了。要注意,再寫入時要注意寫換行符,不然會出現阻塞。
  BufferedWriter的方法:newLine() ,這個方法會寫出一個換行符。
  
管道流:線程交互的時候使用 (J2ME中不支持)
  PipedInputStream/PipedOutputStream
   傳送輸出流能夠鏈接到傳送輸入流,以建立通訊管道。傳送輸出流是管道的發送端。一般,數據由某個線程寫入 PipedOutputStream 對象,並由其餘線程從鏈接的 PipedInputStream 讀取。
  注意:管道輸出流和管道輸入流須要對接。
   
數據流:DataInputStream和DataOutputStream
  經過流來讀寫Java基本類,注意DataInputStream和DataOutputStream的方法是成對的。 
  支持直接輸出輸入各類數據類型。
  注意:使用DataOutputStream/DataInputStream時,要注意寫入順序和讀取順序相同,不然會將沒有分割寫入的信息分割不正確而讀取出錯誤的數據。
  
Properties類:針對屬性文件(*.properties,內容是name=value,都是做爲鍵值對出現)進行操做,在java.util包下  (J2ME中不支持)
  load(InputStream inStream) 
            從輸入流中讀取屬性列表(鍵和元素對)。
           getProperty(String key) 
            用指定的鍵在此屬性列表中搜索屬性。
相關文章
相關標籤/搜索