JAVA學習筆記(五)-檔案和安全性

來源:互聯網
上載者:User
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對象。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.