----------------------- android教育訓練、java教育訓練、java學習型技術部落格、期待與您交流! ----------------------
IO(input output)流
IO流用來處理裝置之間的資料傳輸,Java對資料的操作是通過流的方式,這些流對象都在IO包中;
流按操作資料分為兩種:位元組流和字元流
按流向分為:輸入流和輸出流
位元組流的抽象基類:
InputStream,OutputStream
字元流的抽象基類:
Reader,Writer
注:由這四個類派生出來的子類名稱都是以其父類名稱作為子類名的字尾的
如: InputStream的子類FileInputStream
Reader 的子類FileReader
Writer類是一個抽象類不能被執行個體化。它提供了一些抽象方法需子類實作
abstract void close()
關閉此流,但要先重新整理它。
abstract void flush()
重新整理該流的緩沖。
void write(char[] cbuf)
寫入字元數組。
abstract void write(char[] cbuf, int off, int len)
寫入字元數組的某一部分。
void write(int c)
寫入單個字元。
void write(String str)
寫入字元串。
void write(String str, int off, int len)
寫入字元串的某一部分。
FileWriter字元流類:該類直接繼承與OutputStreamWriter
的子類,OutputStreamWriter直接繼承于Writer
構造方法摘要
FileWriter(File file)
根據給定的 File 對象構造一個 FileWriter 對象。
FileWriter(File file, boolean append)
根據給定的 File 對象構造一個 FileWriter 對象。
FileWriter(FileDescriptor fd)
構造與某個檔案描述符相關聯的 FileWriter 對象。
FileWriter(String fileName)
根據給定的檔案名構造一個 FileWriter 對象。
FileWriter(String fileName, boolean append)
根據給定的檔案名以及訓示是否附加寫入資料的 boolean 值來構造 FileWriter 對象。
FileWriter類沒有無參數構造函數,建立一個FileWriter對象就必須要明确要操作的檔案,而且該檔案會被建立到指定目
錄下。如果該目錄下已經同名檔案,同名檔案将被覆寫。
調用Write()方法是向流中寫資料,流存在與記憶體中有一定大小的緩沖區,當寫入的資料沒能把緩沖區寫滿時,這些資料
就會一直存在于流中而不會寫入磁盤上的檔案中,要想讓其寫入檔案中可以調用flush()方法,該方法的作用就是重新整理緩
沖區,将其中的資料寫到檔案中,也可以調用close()方法,該方法的作用是關閉流資源,在關閉流之前會重新整理緩沖區,
将緩沖區中的資料寫入到相應的檔案中去。
write(),flush(),close(),這三個方法都會抛出IOException異常,要求我們必須聲明抛出或者處理。
标準的IO異常處理:
demo:
import java.io.*;
class IOExceptionDemo{
public static void main(String [] args){
FileWriter fw = null;//定義在異常處理代碼塊外面
try{
fw = new FileWriter("qiufeng.txt");//會引發異常
fw.write("haha");//會引發異常
}catch(IOException e){
System.out.println(e);
}finally{
if(fw!=null)//判斷fw是否為空
try{
fw.close();//會引發異常
}catch(IOException e){
System.out.println(e.toString());
}
}
}
}
Reader:字元輸入流的基類,是一個抽象類
直接已知子類:
BufferedReader, CharArrayReader, FilterReader, InputStreamReader, PipedReader, StringReader
用于讀取字元流的抽象類。子類必須實作的方法隻有 read(char[], int, int) 和 close()。但是,多數子類将重寫此處
定義的一些方法,以提供更高的效率和/或其他功能。
建立一個檔案讀取流對象,和指定名稱的檔案相關聯。要保證該檔案是已經存在的,如果不存在,會發生異常
FileNotFoundException
調用read()方法讀取其中的内容,讀到流的末尾傳回-1;
字元流緩沖區:
緩沖區的出現提高了對資料的讀寫效率。對于應的有兩個類:
BufferedWriter
BufferedReader
緩沖區要集合流才可以使用。在流的基礎上對流的功能進行加強
在建立緩沖區之前,必須要先有流對象。
BufferedWriter
隻要将需要的給提高效率的流對象作為參數傳遞給緩沖區的構造函數即可。
關閉該緩沖區就是在關閉緩沖區中的流對象。
是以不需要再對流對象進行關閉。
該緩沖區類提供了一個跨平台的的換行符。newLine();
BufferedReader
1.建立一個檔案讀取流對象
FileReader fr = new FileReader("bufreader.txt");
2.為了提高效率。加入緩沖技術,将字元流對象做為參數傳遞給緩沖對象的構造函數
BufferedReader bfr = new BufferedReader(fr);
3.緩沖區提供了一個一次讀一行的方法readline(),友善對文本資料的讀取,當傳回null時表示讀到檔案的末尾,它隻返
回終止符之前的字元,不包括換行符;
String str = null;
while((str= bfr.readLine())!=null)
{
System.out.println(str);
}
4.關閉該緩沖區
fr.close();
流操作規律:
1.明确源和目的
源:輸入流。InputStream Reader
目的:輸出流。OutputStream Writer
2.操作的資料是否是純文字
是:字元流
不是:位元組流。
3.當明确體系後在明确要使用那個具體的對象。
通過裝置來進行區分:
源裝置:記憶體,硬碟,鍵盤
目的裝置:記憶體,硬碟,控制台。
File 類:用來将檔案或者檔案夾封裝成對象的類,友善了對檔案與檔案夾的操作,File對象可以作為參數傳遞給流的構
造函數。
其中有一個字段static String separator 是與平台無關的目錄分隔符
方法:
1.建立
boolean createNewFile():在指定位置建立檔案,如果該檔案已經存在,則不建立,傳回false ,和輸出流不一樣,
輸出流對象一建立就建立檔案,而且檔案如果已經存在會被覆寫。
boolean mkdir():建立檔案夾。
boolean mkdirs():建立多級檔案夾。
2.删除。
boolean delete():删除失敗傳回false.如果檔案正在被使用,則删除不了傳回false
void deleteOnExit():在程式退出時删除指定檔案。
3.判斷。
boolean exists():判斷檔案是否存在。
isFile():判斷是否是檔案
isDirectory():判斷是否是目錄
isHidden():判斷檔案是否隐藏
isAbsolute():判斷是否是絕對路徑
4.擷取資訊
String getName():擷取檔案名稱
String getPath():擷取路徑 相對路徑
String getParent():擷取父目錄,如果File對象是相對路徑傳回null ,如果有上次目錄就傳回上一層目錄
String getAbsolutePath():擷取絕對路徑
其他方法:
boolean renameTo(File dest) 重新命名此抽象路徑名表示的檔案。
long length() 傳回由此抽象路徑名表示的檔案的長度。
String[] list() 傳回一個字元串數組,這些字元串指定此抽象路徑名表示的目錄中的檔案和目錄。
File[] listFiles() 傳回一個抽象路徑名數組,這些路徑名表示此抽象路徑名表示的目錄中的檔案。
SequenceInputStream類:InputStream的子類,将兩個或多個InputStrem對象轉換成單一的InputStrem
PipedInputStream管道流:連接配接PipedInputStream構成管道,常用于線程之間的通信
DataInputStrem 和DataOutputStream :可以操作基本類型的資料
RandomAccessFile類:該類是一個獨立的IO包中的類,它不是InputStream或者OutputStream繼承體系層次結構中的一部
分,除了實作了DataInput和DataOutput接口之外,它和這兩個層次結構沒有任何關聯,它是獨立的,直接繼承Object.從
本質上來說,RandomAccessFile的工作方式類似與把DataInputStream和DataOutputStream組合起來使用,還添加了一些
方法,其中方法getFilePointer()用于查找目前檔案所處的位置,seek()用于在檔案内移至新的位置,length()用于判斷
檔案的最大尺寸。另外,其構造器還需要第二個參數用來訓示我們隻是“随即讀”(r)還是“即讀又寫”(rw).它并不支援
隻寫檔案。
ObjectInputStream和ObjectOutputStream:用于對象序列化,對象的持久化存儲。可以被序列化的對象必須實作
Serialiable,如果不想對對象内的某個字段不想被序列化,可以用transient 關鍵字修飾
字元編碼:
字元流的出現為了友善操作字元,位元組流向字元流的轉換是通過InputStreamReader和OutputStreamWriter實作的,在這
兩個對象進行構造的時候可以加入字元集。
編碼表:
計算機隻能識别二進制資料,其實就是兩個不同的電信号狀态,高電平(1)和低電平(0),為了友善計算機識别各個國
家的文字。就将各個國家的文字用數字來表示,并形成一一對應,這樣就構成了一張表,就是編碼表。
常見的編碼表:
ASCII:美國标準資訊交換碼。用一個位元組的7位就可以表示。
ISO8859-1:拉丁碼表。歐洲碼表,用一個位元組的8位表示。
GB2312:中國的中文編碼表。
GBK:中國的中文編碼表更新,融合了更多的中文字元号。
Unicode:國際标準碼,融合了多種文字。所有文字都用兩個位元組來表示,Java語言使用的就是unicode
UTF-8:最多用三個位元組來表示一個字元
編碼:字元串變為位元組數組 String -->str.getBytes[]
解碼:位元組數組變成字元串 byte[] --> String new String(byte[])
----------------------- android教育訓練、java教育訓練、java學習型技術部落格、期待與您交流! ----------------------
詳情請檢視:http://edu.csdn.net/heima