9.1 Java.io概述
1. 資料流是一個連續的位元組塊。從概念上講,流的一端可以和資料來源或資料接收其相連,另一端可 以認為與java.io包中的類相連。
2. 同資料來源相連的流用來從源中讀取資料,同這種流相連的java.I/O類能從流中讀取位元組,流能從 資料來源中補充位元組,這種流稱為輸入資料流
3. 同資料接收器相連的流用來向接收器中寫資料,同這種流相連的java.I/O類能向流中插入位元組, 流將位元組送到資料接收器。
4. 位元組級輸入/出類結構層次:
InputStream OutputStream
FileInputStream FileOutputSteam
FilterInputStream FilterOutputStream
BufferedInputStream BufferedOutputStream
DataInputStream DataOutputStream
5. 字元級輸入/出類結構層次:
Reader Writer
BufferedReader BufferedWirter
LineNumberReader PrinterWriter
InputStreamReader OutputStreamWriter
FileReader FileWriter
6. 對象級輸入/出類結構層次:
InputStream OutputStream
ObjectInputStream ObjectOutputStream
9.2 儲存和讀取位元組級資料:
1.DataOutputStream向輸出資料流中寫一個Java的基礎資料型別 (Elementary Data Type),所寫的資料的方式是可移植的,即 與具體作業系統無關。
2.FileOutputStream類將輸出資料流與一個檔案串連,從而為寫資料到檔案中做準備。
3.如果用一個已存在的檔案名稱建立一個FileOutputStream對象,則這個檔案將在無任何警告的情 況下被一個新的空檔案所取代。我們可以實用File或FileDialog類提供的方法來確保不會發生 偶然刪除重要檔案的失誤。
4.使用DataOutputStream類與FileOutputStream類向檔案寫資料的方法:
5.DataInputStream類以與機器無關的方式從一個輸入資料流中讀Java的基礎資料型別 (Elementary Data Type)。任何一個方 法讀取資料時超過流的尾部,將產生一個EOFException異常。
6.FileInputStream類從以存在的檔案中讀取位元組,並返回一個與檔案相連的輸入資料流。
7.使用DataInputStream類與FileOutputStream類從檔案讀取資料的方法:
8.BufferedOutputStream類增強了批量資料輸出的到另一個輸出資料流的功能,資料首先寫到一個內 部緩衝區中,只有緩衝區寫滿之後才一次性寫入流中,當關閉流時,如果緩衝未滿,就強迫將數 據壓入輸入資料流中,所有關於輸出資料流操作的方法都是自動進行緩衝的。
9.使用DataOutputStream類與FileOutputStream類與BufferedOutputStream類向檔案寫數 據的方法:
10.File類用來代表一個檔案,一個目錄名或一個目錄名和檔案名稱的組合。所用到的檔案名稱使用高 度系統相關的。
11.相關API:
getName(): 擷取檔案名稱 getPath():擷取路徑
exists(): 判斷指定檔案是否存在 isDirectory():判斷是否路徑
isFile(): 判斷是否檔案 listFiles():返回指定目錄下的檔案對象數組
12.可以使用System..getProperty(“user.dir”)來確保如果使用者沒有提供目錄,則使用當前的 目錄。
13.按特定的方法排序方法如下:
1). 建立一個類實現接Comparator, 在類中實現該介面中的抽象方法compare (Object o1, Object o2)
2). 在主程式中調用Arrays類的Sort (Object a [ ], Comparator c)方法,對數組a 中的對象按介面中的方法進行排序。
9.3 儲存和讀取字元資料:
1. BufferedReader類從字元輸入資料流中讀取文本,在必要時將字元存入緩衝。只要文字中含有換 行符、斷行符號符或是斷行符號換行,則認為是一行文本結束,如果在流中沒有這些符號,則readLine 方法返回null而並不拋出一個異常。
2. FileReader類可以非常方便地將一個檔案串連到其他需要以Reader作為輸入參數的類上。
3. 使用BufferedReader類與FileReader類,向檔案寫資料的方法:
4. FileDialog類中有標準的“檔案|開啟”,“檔案|儲存”對話方塊,可以通過他們選擇檔案來讀或 寫,該對話方塊是模態對話方塊,一旦通過setVisible或show開啟後,只有通過選擇一個檔案或 取消才能使她消失。該對話方塊含有確定和取消按鈕,如果使用者選擇了取消,則getFile()方法 將返回null,如果該對話方塊的建立模式為SAVE,則在覆蓋一個已有檔案之前必須經過使用者的確 認。
5. 相關API:
getDirectory(): 擷取檔案的路徑 getFile(): 擷取檔案名稱
6. BufferedWriter類用來建立一個字元緩衝輸出資料流,它主要為其他類通過一個字元輸入資料流。
7. PrintWriter類為格式化字元流提供了一些實用方法,該類的方法沒有拋出任何異常,而是使 用checkError來檢查則調用該方法之前是否出現了錯誤。
8. FileWriter類把字元輸出資料流與檔案串連起來,FileWriter會毫無提示的刪除一個已存在的文 件,所以通過File類或FileDialog類提供的方法,確保不會意外地刪除使用者的重要檔案。
9.使用PrintWriter類,BufferedWirter類,FileWriter類向檔案寫資料的方法:
9.3 儲存和讀取對象資料
1. LinkedList類:可以被當成堆棧、隊列、雙向隊列使用
2. 常用API:
add(int index,Object element):向列表中添加對象
get(int index):返回指定位置的對象
contains(Object o):判斷LinkedList中是否含有指定的對象
index(Object o):返回對象的下標
set(int index,Object o):用指定對象代替指定位置上的原對象
remove(int index):移除指定位置對象
3. Iterator介面通過提高順序訪問列表元素的方法簡化類Java標準的列表結構所有的順序處理的 過程。
4. Java API定義類Iterator如下:
boolean hasNext(): 判斷當前指標是否已指向列表的末尾。
Object next():返回當前的對象,並使一個內部指標指向列表中的下一個元素。
5. Iterator對象可以通過Iterator方法來建立,Iterator方法是List介面中的方法,因而它 是所有的標準Java列表結構的一部分。Iterator允許通過一個快速簡單的for迴圈連續處理 一個表中的元素。
for (Iterator iterator=List.iterator ();iterator.hasNext();)
System.out.println (iterator.next ());
6. ObjectOutputStream類用來將原始的資料類型和整個對象寫入到流中。為了向 ObjectOutputStream中寫入對象,該對象所屬的類必須是實現了java.io.Serializable 介面,寫一個對象的預設機制是寫它的原始類、類的特徵、類中非瞬態(non-transient)即非 靜態成員變數。一個類實現Serializable介面的目的是使該類的對象可以寫入到 ObjectOutputStream流中,並且可以通過ObjectOutputStream流讀取這些對象。
7. ObjectInputStream類被用來讀取原來用ObjectOutputStream寫入到流中的未經處理資料類型 和整個對象,同時還要使用Java的類型轉換機制來恢複對象的類型。
8. 序列化使用非常方便,然而也引入了一個安全問題,因為儲存則磁碟中的的資料與對象獨立,無 法保護資料不被修改,該資料被重新讀取的時候就會產生無效的時間。而且私人資料則對象中是 受保護的,不能在外部處理它,而一旦寫入磁碟就可能暴露於外部操作之下。
9. 如果對象和安全性很重要,可以不使用預設的序列化對象方法,而是通過覆蓋原有符來自訂序 列化。
public void readObject (ObjectInputStream in) throws IOException,ClassNotFoundException
{/*自訂讀取對象的方法*/}
public void writeObject (ObjectOutputStream out) throws IOException
{/*自訂寫對象的方法*/}
public void writeObject (ObjectOutputStream out) throws IOException
{throw NoAccessException}
9.4 Applet的檔案操作和與安全性
1. 在一個Java類執行前,JVM必須對其進行安全性檢查和違例檢查。甚至在運行過程中,每個 Java類還要受到安全管理器的控制,使它只能訪問它有權訪問的資源。如果它試圖訪問它無權 訪問的資源,安全管理器將拒絕該請求,並拋出一個SecurityException異常。
2. 自訂的安全管理器則Web瀏覽器中不能使用,在Web瀏覽器中使用Applet必須服從Web瀏覽器 的安全限制。
3. Applet在“沙箱”中執行,也就是說,Applet可以在電腦中預先劃定的地區執行,而且不允 許超越該範圍。安全管理器對其進行監督,如果Applet試圖訪問“沙箱”以外的資源,安全管理 器將拒絕訪問並拋出異常。對Applet的安全限制有:
1). Applet不能直接讀寫檔案
2). Applet只能通過它所在的主機才能進行網路連接
3). Applet不能執行它所在主機的本地程式 (即用其他語言編寫的程式)
4). Applet不能讀取和修改系統的屬性。
5). Applet執行時出現視窗,該視窗看起來與標準視窗不同
6). Applet不能定義本地方法 (即用其他英語編寫的方法)。
4. 只要檔案被明確地聲明為“公有檔案”,Applet就能從該檔案讀取資料,所謂“公有檔案”是位於 Web伺服器公有地可讀檔案夾內的檔案。
5.在Applet中讀取檔案的方法:
1). 資料檔案和Applet必須在物理位置上位於同一台機器上。
2). 資料檔案和Applet要麼在本地機器上,要麼在Web伺服器的公用地區
3). 必須使用URL類串連到資料檔案,而不能使用FileInputStream。
4). 該方法僅適用與輸入資料流,不適用與輸出資料流。
6.InputStreamReader類是位元組流到字元流的橋樑,它讀入位元組並把他們轉換為字元,它使用該 平台的預設編碼,也可指定另外的編碼。
7.與FileReader一樣,InputStreamReader可串連一個BufferedReader,能取得更好的效率
9.5 系統I/O流
1. System類保護類3個靜態成員變數,他們描述類3個通用的流。這些流隨時都是開啟的,並準備 傳送和接受資料。
2. System.out:PrintStream類型 System.in: InputStream類型 System.err:PrintStream類型
3. setOut(PrintStream out):重新指定System.out為輸出資料流out
setIn(InputStream in): 重新指定System..in為輸入資料流 in
setErr(PrintStream out):重新指定System..err為輸出資料流out
4. 重新導向System..out或System.err對那些需要列印出狀態和調試資訊的程式很有用。
9.6 RandomAccessFile
1. RandomAccessFile類的執行個體能支援同時讀寫檔案。
2. 對該類的所有讀操作,如還沒有讀完指定的位元組數,但檔案指標已執行了檔案末尾,將會拋出一 個OFException異常,如果是由於其他原因不能讀,就會拋出一個IOException而不是 EOFExeption;
特別是如果檔案關閉後再進行讀寫操作,也會拋出一個IOException。
3. 使用RandomAccessFile除了可以讀寫檔案中任意位置的位元組外,還可以讀寫文本和Java的基 本資料類型。
4. 常用API:
randomAccessFile(String filename,String mode):mode為操作方式,說明該檔案是”r”,或”rw”方式
randomAccessFile(File file,String mode):file為指定的檔案對象
read():從檔案中讀取資料
read(Byte[] b):從當前指標位置開始讀取資料到數組直至滿為止
readLine():讀取當前檔案的下一行文本
seek():設定當前檔案指標
9.7 其他
1. 裝載並顯示映像的步驟:
1).擷取影像檔的路徑,檔案名稱:
URL url=new URL (URL context, String filename) //context可以通過getCodeBase()獲得
2).通過預設的Toolkit擷取影像檔:
image=Toolkit.getDefaultToolkit (). getImage (url)
3).將圖片添加到MediaTracker類的對象中並載入:
MediaTracker tracker=new MediaTracker (this);
Tracker.addImage(image,0); //將圖片添加到tracker中,並且設定優先權為0(最高)
Tracker.waitForAll(); //掛起任何操作,直到所有映像被完全載入
4).調用畫圖方法畫圖:
repaint ()
2. 由於載入圖片時可能會觸發異常,故需要捕捉
3. 通過getImage(URL url)擷取的圖片格式只能是GIF,JPEA,PNG之一。
4. Inset類的對象用來指定一個容器的邊框格式,即容器與邊框的距離空間,該空間可以是邊框, 空白區,標題。其構造方法為new Inset(int top,int left,int bottom,int right)
5. getInset()方法規定了在由一個布局管理器布局時,組建可以接受多少填充內容。
6. 帶標題的三維邊框畫法:
w=getFontMetrics(font).stringWidth(title); //返回用指定的字型顯示的字串度
h=getFontMetrics(font).getMaxAscent()+1; //返回用指定字型顯示的字型高度
d=h/2; //用於指定畫圖起點或邊框的間距
bgColor=Color.white; //用於指定圖片的背景
font=new Font(“Helvetica”,Font.BOLD,12);//用於指定顯示的字型
public void paint (Graphics g){
g.setColor(Color.gray);
g.drawRect(d,d,getSize().width-2*d,getSize().height-2*d); //用於畫出組件的邊框
g.setColor(Color.black);
g.drawLine (getSize ().width-d+1,d
getSize().width-d+1,getSize().height-d+1); //用於畫出組件的三維邊框(豎)
g.drawLine (d, getSize().height-d+1
getSize().width-d+1,getSize().height-d+1); //用於畫出組件的三維邊框(橫)
g.setFont(font);
g.setColor(bgColor);
g.fillRect((int)(1.5*h)-5,0,w+10,h+2); //用於畫出標題所在的邊框
g.setColor(Color.black);
g.drawString(title,(int)(1.5*h),h-2); //用於在邊框中顯示標題
}
7.常用的畫圖API:
1). drawLine (int x1, int y1, int x2, int y2) :
在點(x1,y1)和點(x2,y2)之間畫一條直線
2).drawRect(int x, int y, int width, int height):
以點(x,y)為原點畫一個寬為width,高為height的矩形
3). drawRoundRect (int x, int y, int width, int height, int arcWidth, int arcHeight) :
從點(x,y)開始畫一個寬為width,高為height,四角的水平、垂直弧度直徑為arcWidth,arcHeight矩形
3). draw3Drect (int x, int y, int width, int height, boolean raised) :
以點(x,y)為原點畫一個寬為width,高為height的3D矩形,raised決定了矩形是否為突起或凹陷
4). drawString (String str, int x, int y) :
從點(x,y)處開始寫字串
5). drawImage (Image img, int x, int y, ImageObserver observer) :
在點(x,y)處開始儘可能的畫圖,並將資訊及時返回給相應的ImageObserver對象。