精品午夜福利中文字av_国产成人综合网_av毛片免费观看网站_欧美影视国产综合_野花香视频中文免费观看_亚洲无码要在线视频_又粗又大又用力大交换好大好爽小静_欧美贵妇v办公室高跟鞋_亚洲国产高清a∨网站_免费中文少妇亚洲

知ing

Java語(yǔ)言程序設(shè)計(jì)(第三版)

邵麗萍,邵光亞,張后揚(yáng) 編 / 清華大學(xué)出版社

拼命菇?jīng)鯜 上傳

查看本書

7.1  Applet類
  Applet是種特殊的Java程序,經(jīng)過(guò)編譯后可被嵌入到HTML文件中,并由Web瀏覽器內(nèi)置的Java解釋器執(zhí)行。所有Applet都繼承自同一個(gè)類java.appelt.Applet,這個(gè)類是Java語(yǔ)言的基礎(chǔ)類,有關(guān)Applet的所有特性都被定義在這個(gè)類中。
7.1.1  Applet的特點(diǎn)

Applet
Application
運(yùn)行環(huán)境
在瀏覽器中運(yùn)行,或用appletviewer命令
單獨(dú)運(yùn)行
入口
從init( )方法開始
從main( )開始
來(lái)源
從網(wǎng)上來(lái)
放在本地
  出于安全考慮,Java設(shè)計(jì)者對(duì)Applet做了一些必要的限制。P129
  有關(guān)Applet的安全機(jī)制通常被設(shè)置在瀏覽器中。大多數(shù)瀏覽器都會(huì)禁止Applet執(zhí)行下列操作:
 ?。?)在運(yùn)行時(shí)調(diào)用其他程序
 ?。?)文件讀寫操作
  (3)裝載動(dòng)態(tài)連接庫(kù)和調(diào)用任何本地方法
 ?。?)試圖打開一個(gè)socket進(jìn)行網(wǎng)絡(luò)通信,但是所連接的主機(jī)并不是提供Applet的主機(jī)。
  另一方面,java.applet包提供了Application所不具備的一些API接口。
7.1.2  Applet和HTML的關(guān)系
  HTML可以沒有Applet,但很多重要功能將無(wú)法實(shí)現(xiàn),而Applet有賴于HTML才能運(yùn)行,二者共同為Internet這個(gè)虛擬世界增添光彩。
7.1.3  Applet的生命周期與主要活動(dòng)
例P131  import java.applet.Applet;
    import java.awt.Graphics;
    public class SC extends Applet{
     StringBuffer buffer=new StringBuffer();
      public void init( )  {addWords("初始化……");} //與位置順序無(wú)關(guān)
     public void start( )  {addWords("開始……");}  //與位置順序無(wú)關(guān)
     public void stop( )   {addWords("停止……");}  //關(guān)閉窗口后執(zhí)行
     public void destroy( )  {addWords("清除……");} //關(guān)閉窗口后執(zhí)行
     void addWords(String s)
       {System.out.println(s); //在DOS界面顯示
        buffer.append(s); 
        repaint();} //自動(dòng)調(diào)用paint方法
     public void  paint(Graphics g) {
       g.drawString(buffer.toString(),5,15);}} //在圖形界面顯示內(nèi)容
  1.初始化(init)
  當(dāng)Applet首次加載(或重新加載)時(shí),要進(jìn)行初始化操作。初始化可進(jìn)行建立添加到程序中的對(duì)象、設(shè)置對(duì)象初始狀態(tài)、為成員變量賦初值、加載圖像或字體等操作,這些可通過(guò)覆蓋init方法來(lái)實(shí)現(xiàn)。
  當(dāng)然程序也可以沒有init方法。
  2.開始運(yùn)行(start)
  Applet在初始化完成后即被調(diào)用,如果運(yùn)行已被停止,還可以再次啟動(dòng)。盡管在一個(gè)生命周期中,Applet可以多次開始運(yùn)行,但初始化只能進(jìn)行一次。
  start方法可以在下列情況下自動(dòng)執(zhí)行多次:
* 瀏覽器載入小應(yīng)用程序并執(zhí)行init( )之后;
* 離開上述Web頁(yè)之后,又重新回來(lái)時(shí);(用back后退,forword前進(jìn)按鈕)
* 瀏覽器的窗口最小化后又恢復(fù)時(shí)。
  在start方法中可以開始運(yùn)行Applet的功能,也可以啟動(dòng)一個(gè)或多個(gè)線程來(lái)完成任務(wù)。一般情況下,如果覆蓋了start方法就要覆蓋stop方法
  3.停止運(yùn)行(stop)
  stop方法可以在下列情況下自動(dòng)執(zhí)行多次:
* 離開小應(yīng)用程序所在Web頁(yè)時(shí);(用back后退,forword前進(jìn)按鈕)
* 刷新該頁(yè)面時(shí);(重新reload該頁(yè)面時(shí))
* 關(guān)閉該Web頁(yè)時(shí);
* 最小化瀏覽器時(shí)。
  4.清除(destory)
  關(guān)閉該Web頁(yè)時(shí)執(zhí)行一次
  5.畫出(顯示)(paint)
  如果需要Applet顯示一些內(nèi)容的話,必須覆蓋paint方法進(jìn)行寫屏。不論所顯示的內(nèi)容是文字、線條、背景色,還是一幅圖形,都必須在paint方法中完成。
  paint方法也是小應(yīng)用程序執(zhí)行時(shí)自動(dòng)調(diào)用的方法,當(dāng)下列情況下會(huì)發(fā)生paint方法的自動(dòng)調(diào)用:
* 第一次加載含有小應(yīng)用程序的Web時(shí);
* Web頁(yè)被覆蓋后又重新顯示時(shí);
* 瀏覽器顯示區(qū)域被縮小/放大時(shí)。
  首先引用:import java.awt.Graphics
  方法:    public void paint(Graphics  g){……}
  6.刷新(repaint)
  repaint方法:是小應(yīng)用程序從java.awt.Component中繼承來(lái)的方法,它首先激活update( )方法(也是在java.awt.Component中定義),清除顯示區(qū)域的所有顯示內(nèi)容,再調(diào)用paint( )方法重繪顯示區(qū)域。
7.1.4  HTML和Applet的參數(shù)傳遞
* 在網(wǎng)頁(yè)中,必須使用<param>的標(biāo)識(shí)來(lái)指定參數(shù)的名稱和參數(shù)的內(nèi)容值。格式:<param  name=參數(shù)名  value=參數(shù)值>
* 在Applet程序中必須使用getParameter( )方法來(lái)取得參數(shù)的內(nèi)容。格式:public  String  getParameter(“參數(shù)名”)
例:P133
  import java.applet.Applet;
  import java.awt.Graphics;
  public class SC extends Applet{
     String string=null;
     int x,y;
    public void init(){
    string=getParameter("message");
    x=Integer.parseInt(getParameter("xPos"));//寫成(int)”30”錯(cuò)
  y=Integer.parseInt(getParameter("yPos"));}//可以不用Integer.parseInt
    public void paint(Graphics s){
      if (string!=null)
        s.drawString(string,x,y);
        s.drawString("參數(shù)X為: "+x,30,60);
        s.drawString("參數(shù)Y為: "+y,30,90);}}
7.1.5  Applet標(biāo)簽屬性
  參見P135
7.2  字符串類
  在Java中字符串被定義為一個(gè)類,無(wú)論是字符串常量還是變量,都必須先生成String類的實(shí)例對(duì)象然后才能使用。
  包java.lang中封裝了兩個(gè)字符串類String(java.lang.String)和StringBuffer,分別用于處理不變字符串和可變字符串。這兩個(gè)類都被聲明為final。因此不能被繼承
7.2.1  字符串與字符串類
  用雙引號(hào)括起來(lái)的字符串是字符串常量,又稱為無(wú)名字符串對(duì)象,由Java自動(dòng)創(chuàng)建。
  例:P137
  說(shuō)明:s.charAt(i)   //返回字符串的第i個(gè)字符
     buffer.append(char  a)  // 將字符參數(shù)添加到對(duì)象buffer尾部
     buffer.toString( )  //將StringBuffer類型轉(zhuǎn)換成String類型再返回。
7.2.2  字符串類的構(gòu)造方法
  例P139
  import java.io.*;
  import java.applet.Applet;
  import java.awt.Graphics;
  public class SC extends Applet{
    byte b[]={'A',' ','b','y','t',' ','a','r','r','a','y'};
    char c[]={'A',' ','c','h','a','r',' ','r','r','a','y'};
    String s1,s2,s3,s4,s5,s6,s7,s8,s9;
    StringBuffer b1,b2,b3;
  
    public void init(){
     b1=new StringBuffer();
     b2=new StringBuffer(10);
     b3=new StringBuffer("A string buffer");//寫成b3="A string buffer"錯(cuò)
     s1=new String();
     s2=new String("A string"); // 寫成s2="A string" 對(duì)
     s3=new String(b3); // 寫成s3=b3;錯(cuò)
     s4=new String(b);
     s5=new String(b,2,4);
     try{
        s6=new String(b,2,10,"GBK");
        s7=new String(b,"GBK");
     }catch (UnsupportedEncodingException e) {}
     s8=new String(c);
     s9=new String(c,2,4);}
  public void paint(Graphics g)
    { g.drawString("s1="+s1,20,20);
      g.drawString("s2="+s2,20,35);
      g.drawString("s3="+s3,20,50);
      g.drawString("s4="+s4,20,65);
      g.drawString("s5="+s5,20,80);
      g.drawString("s6="+s6,20,95);
      g.drawString("s7="+s7,150,20);
      g.drawString("s8="+s8,150,35);
      g.drawString("s9="+s9,150,50);
      g.drawString("b1="+b1.toString(),150,65);
      g.drawString("b2="+b2.toString(),150,80);
      g.drawString("b3="+b3.toString(),150,95);  } }
7.2.3  String類的應(yīng)用
  1.求字符串長(zhǎng)度(length)
    格式:public  int  length( )
    例:System.out.println("管理學(xué)院".length( ));  // 4
      System.out.println("GLXY".length( )); // 4 "GLXY".length( )則錯(cuò)
       char c[]={'G','L','X','Y'};
       System.out.println(c.length);    // 4 ,c.length( )則錯(cuò)
  2.字符串連接
    格式:public  String  concat(String str )
    例:  String str="hello";
        str=str.concat("Hi");    // 與 str+”Hi” 等價(jià)
       System.out.println(str);  // helloHi
    別:“+”還可以把一個(gè)非字符串的數(shù)值連接至字符串尾部,編譯器將自動(dòng)把非字符串轉(zhuǎn)換為字符串再進(jìn)行連接。
  3.字符串截取
    格式:public char charAt(int  index)
    功能:返回第index個(gè)字符
    格式:public String substring(int  start  [int  end])
    功能:從第start開始截取字符串,end代表結(jié)束位置
  例:  String s1="安徽城管學(xué)院",s2=s1;
     System.out.println(s1.charAt(2));  //  城
     s1=s1.substring(2);
     System.out.println(s1);   //  城管學(xué)院
     System.out.println(s2.substring(2,4));  // 城管
  4.字符串比較
    格式: boolean  equals(Object  object)
        boolean  equalsIgnoreCase(String  str) // 忽略大小寫
        int  compareTo(Object  object)
        int  compareTo(String  str)
        int  compareToIgnoreCase(String  str) // 忽略大小寫
  例:  String s1="ABCD",s2="ABC",s3="abc";
     System.out.println(s1.equals(s2));  // false
     System.out.println(s2.equals(s3));  // false
     System.out.println(s2.equalsIgnoreCase(s3));  // true
     System.out.println("A".compareTo("B"));  // -1 “A”比“B”小
     System.out.println("B".compareTo("A"));  // 1“B”比“A”大
     System.out.println("ABC".compareTo("abc")); //-32 小,是負(fù)數(shù)
     System.out.println("ABC".compareToIgnoreCase("abc"));//0 相同
  說(shuō)明:運(yùn)算符“==”比較兩個(gè)對(duì)象是否引用同一個(gè)實(shí)例,而equals( )則比較兩個(gè)字符串中對(duì)應(yīng)的每個(gè)字符值是否相同。
  例: Sting a=”ABC” ,B=”ABC” ,C=”abc” ,D=”AB”
       A==B  //   true
         A==C  //   false
         A==D  //   false
  5.拷貝到字符串
    格式1:static String copyValueOf(char[] data)
    格式2:static String copyValueOf(char[] data ,int offset ,int count)
    功能:將字符數(shù)組的內(nèi)容拷貝到字符串中
  例:char c[]={'A','B','C','D','E'};
    String s1="XYZ",s2=s1;
    s1=s1.copyValueOf(c);     //  s1值是“ABCDE”
    s2=s2.copyValueOf(c,1,3);  //  s2值是“BCD”
    s3=substring(c,3);   // 錯(cuò)
    s3=c;             // 錯(cuò)   
    Sting  s1= new  String(c)
    Sting  s1= new  String(c,2,3)
    
  6.字符串大小寫轉(zhuǎn)換
  例:String s1="Abc",s2,s3;
    s2=s1.toUpperCase( );  // s2值是“ABC”
    s3=s1.toLowerCase( );  // s3值是“abc”
  7.字符串檢索
    格式:int  indexOf(char  ch)   // 首次出現(xiàn)位置
       int  indexOf(String  str)
       int  lastIndexOf(char  ch)  // 最后出現(xiàn)的位置
       int  lastIndexOf(String  str)
    功能:在一個(gè)字符串中檢索指定字符或子串,返回所在位置的整數(shù),若找不到則返回為-1。
  例:String s1="ABABab";
    System.out.println(s1.indexOf('a'));      // 4
    System.out.println(s1.indexOf("AB"));   // 0
    System.out.println(s1.lastIndexOf('A'));  // 2
  8.字符串轉(zhuǎn)換為數(shù)組
  字符串可以轉(zhuǎn)換為字節(jié)數(shù)組或字符數(shù)組。
    格式:byte  []getBytes( ) //按系統(tǒng)默認(rèn)字符集編碼轉(zhuǎn)換為字節(jié)數(shù)組
       byte  []getBytes(String enc ) //基中enc為字符集編碼
       char  []toCharArray( )   // 轉(zhuǎn)換為字符數(shù)組
  例:  byte b[]; char c[];
     String s="計(jì)算機(jī)";
     b=s.getBytes();
     c=s.toCharArray();
     System.out.println(b);  //  [B@17943a4
     System.out.println(c);  // 計(jì)算機(jī)
  9.轉(zhuǎn)換為字符串
  String類提供了一組valueOf方法用來(lái)將其他數(shù)據(jù)類型轉(zhuǎn)換成字符串,其參數(shù)可以是任何數(shù)據(jù)類型(byte類型除外),它們都是靜態(tài)的,也就是說(shuō)不必創(chuàng)建實(shí)例化對(duì)象即可直接調(diào)用這些方法。
  格式: String.valueOf(數(shù)據(jù)類型)
  例:char c[]={'A','B','C','D','E'};
    String s="Help",s1,s2,s3;
    s1=String.valueOf(c,1,3);  // “BCD”
    s2=String.valueOf(true);   //  “true”
    s3=String.valueOf(95.5);   //  “95.5”
  同時(shí),類Integer,Double,Float和Long中也提供了方法valueOf( )把一個(gè)字符串轉(zhuǎn)化為對(duì)應(yīng)的數(shù)字類型。
  例:String s="35";
    Integer i=Integer.valueOf(s);   //  35
    Double d=Double.valueOf(s);  //  35.0
  10.字符串替換(補(bǔ)充)
    格式:public String replace(char oldChar ,char newChar)
    功能:把字符串中出現(xiàn)的所有指定字符轉(zhuǎn)換成新字符
  例:String s1="ABACAD",s2;
    s2=s1.replace('A','Z');   //  “ZBZCZD”
7.2.4  StringBuffer類的應(yīng)用
  StringBuffer表示可變字符串,可以在其中插入字符或在末尾添加字符。如果超出已分配的緩沖區(qū),系統(tǒng)會(huì)自動(dòng)地為它分配額外空間。
  1.a(chǎn)ppend方法
  格式:public synchronized StringBuffer append(數(shù)據(jù))
  功能:在已有字符串末尾添加一個(gè)字符串str
  例:P144    char data[]={'a','b','c','d','e'};
        StringBuffer buffer=new StringBuffer();
        buffer.append(100);
        buffer.append('*');
        buffer.append(2.50F);
        buffer.append(" is equal to ");
        buffer.append(250.000);
        buffer.append(' ');
        buffer.append(data);
        buffer.append(' ');
        buffer.append(data,2,3);
        System.out.print(buffer);
    運(yùn)行結(jié)果:100*2.5 is equal to 250.0 abcde cde
    String s=”ab”;
    StringBuffer b=”XYZ”;  //錯(cuò)
    StringBuffer b=new StringBuffer(“XYZ”);
    s=b ;  //  錯(cuò)
    s=b.toSting() //  “XYZ”
    b=s;  //錯(cuò)
    int i=b.length();
    b=b.replace(0,s);  //將字符串s值給bs
  2.insert方法
  格式:public synchronized StringBuffer insert(插入位置,數(shù)據(jù))
  功能:在插入位置處插入數(shù)據(jù),總長(zhǎng)度增加
  例P144    char data[]={'a','b','c','d','e'};
       StringBuffer buffer=new StringBuffer();
       buffer.insert(0,100);
       buffer.insert(0,2.5F);
       buffer.insert(3,'*');
       buffer.insert(0,250.0);
       buffer.insert(5," is equal to ");
       System.out.print(buffer);
  運(yùn)行結(jié)果:250.0 is equal to 2.5*100
  3.其他方法
  public StringBuffer delete(int start ,int end)  //刪除子串,不包括end位字符
  public StringBuffer deleteCharAt(int index)  //刪除index位置上的字符
  public StringBuffer replace(int start,int end,String str)  //替換子串,字符串長(zhǎng)度可增長(zhǎng)或減短
  StringBuffer reverse( )  //翻轉(zhuǎn)字符串
  例P144:StringBuffer buffer=new StringBuffer("安徽城市管理學(xué)院");
      buffer=buffer.delete(0,2);  // 城市管理學(xué)院
      buffer=buffer.replace(2,4,"職業(yè)"); // 城市職業(yè)學(xué)院
      buffer=buffer.reverse();  // 院學(xué)業(yè)職市城
      buffer=buffer.deleteCharAt(1);  // 院業(yè)職市城
7.3  輸入輸出流類
7.3.1  數(shù)據(jù)流概念
  1.?dāng)?shù)據(jù)流
  數(shù)據(jù)流是指一組有順序的、有起點(diǎn)和終點(diǎn)的字節(jié)集合,實(shí)際上是一個(gè)數(shù)據(jù)序列,它可以看成是數(shù)據(jù)的導(dǎo)管。輸入就是讀取數(shù)據(jù)流,輸出則是寫入數(shù)據(jù)流。處理過(guò)程:打開流、讀取或?qū)懭肓?、關(guān)閉流。
  Java程序不直接操縱I/O設(shè)備,而是在程序和設(shè)備之間加入了一個(gè)中間介質(zhì),這就是數(shù)據(jù)流,采用數(shù)據(jù)流的目的就是使程序的輸入輸出操作獨(dú)立于具體設(shè)備,程序一旦建立了數(shù)據(jù)流,就可以不用理會(huì)起點(diǎn)或終點(diǎn)是何種設(shè)備。
  Java提供許多數(shù)據(jù)流的類和方法,封裝在java.io包中,編程時(shí)用它處理輸入輸出,只要在程序前面加上語(yǔ)句:import  java.io.*: ,即可使用其中的各種I/O方法。
  2.輸入流與輸出流
  建立數(shù)據(jù)流實(shí)際上就是建立數(shù)據(jù)傳輸通道,將起點(diǎn)和終點(diǎn)連接起來(lái)。
  輸入流可從鍵盤或文件獲得數(shù)據(jù),輸出流可向顯示器屏幕、打印機(jī)或文件中傳輸數(shù)據(jù)。Java中最基本的流類有2個(gè):基本輸入流InputStream,基本輸出流OutputStream
  3.緩沖流
  對(duì)數(shù)據(jù)流的每次操作是以字節(jié)為單位進(jìn)行的,為了提高數(shù)據(jù)傳輸效率,通常使用緩沖流(buffered stream),即為一個(gè)流配有一個(gè)緩沖區(qū)(buffer),一個(gè)緩沖區(qū)就是專門用于傳送數(shù)據(jù)的一塊內(nèi)存。
  當(dāng)向一個(gè)緩沖流寫入數(shù)據(jù)時(shí),系統(tǒng)將數(shù)據(jù)發(fā)送到緩沖區(qū),而不是直接發(fā)送外部設(shè)備,緩沖區(qū)自動(dòng)記錄數(shù)據(jù),當(dāng)緩沖區(qū)滿時(shí),系統(tǒng)將數(shù)據(jù)全部發(fā)送到相應(yīng)設(shè)備。
  當(dāng)從一個(gè)緩沖流讀取數(shù)據(jù)時(shí),系統(tǒng)實(shí)際是從緩沖區(qū)中讀取數(shù)據(jù)。當(dāng)緩沖區(qū)空時(shí),系統(tǒng)將從相應(yīng)設(shè)備自動(dòng)讀取盡可能多的數(shù)據(jù)充滿緩沖區(qū)。
7.3.2  Java的標(biāo)準(zhǔn)數(shù)據(jù)流
  標(biāo)準(zhǔn)輸入指鍵盤輸入;標(biāo)準(zhǔn)輸出指輸出到顯示器。
  標(biāo)準(zhǔn)輸入輸出功能是通過(guò)Java中的系統(tǒng)類System實(shí)現(xiàn)的。它在java.lang包中,是一個(gè)最終類,有3個(gè)公共的靜態(tài)的成員變量:in , out , err可在程序中直接調(diào)用它們。
  1.標(biāo)準(zhǔn)輸入System.in
  System.in作為InputStream類的對(duì)象實(shí)現(xiàn)標(biāo)準(zhǔn)輸入,可以調(diào)用它的read方法來(lái)讀取鍵盤數(shù)據(jù)。read方法有3種格式:
  public int read( ) // 讀入一個(gè)字節(jié),作為整數(shù)返回
  public int read(byte b[]) throws IOException
  public int read(byte b[],int off,int len) //?從輸入流中讀取長(zhǎng)度為len的數(shù)據(jù),寫入字節(jié)數(shù)組b中從索引off開始綿位置 (不作要求)
  如果輸入流結(jié)束,返回-1。發(fā)生I/O錯(cuò)時(shí),會(huì)拋出IOException異常。
例:byte a[]=new byte[10]; byte b[]=new byte[10];
  System.in.read(a); System.in.read(b,1,2); //若輸入abcdef回車abcdef回車 
  System.out.println((char)a[2]);   // c
  System.out.println((char)b[0]);   // 空
  System.out.println((char)b[1]);   // a
  System.out.println((char)b[2]);   // b
  System.out.println((char)b[3]);   // 空
  2.標(biāo)準(zhǔn)輸出System.out
  格式:void write(int b);
  功能:將指定字節(jié)b寫入輸出流,如果b的值大于255,則只輸出它的低位字節(jié)所表示的值
  格式:void write(byte b[]);
  功能:把字節(jié)數(shù)組中的b.length個(gè)字節(jié)寫入輸出流
  格式:void write(byte b[],int off,int len);
  功能:把字節(jié)數(shù)組b中從索引off開始的len個(gè)字節(jié)寫入輸出流
  可以調(diào)用它的print(不換行輸出) , println(換行輸出) , 或write方法來(lái)輸出各種類型的數(shù)據(jù)。它們不產(chǎn)生輸出異常。
  write方法用來(lái)輸出字節(jié)數(shù)組,在輸出時(shí)不換行,在輸出單個(gè)字節(jié)時(shí),并不能立即顯示出來(lái),必須調(diào)用flush方法或close方法強(qiáng)制回顯。
  例:byte a[]=new byte[15];
    System.in.read(a);  // 輸入abced
    System.out.println(a); // 輸出[B@480457 亂碼
    System.out.write(a);  // 輸出abced
    System.out.write(a,1,2);  // 輸出bc
    System.out.println(a[1]); // 98
    System.out.write(a[1]);  // b
    System.out.println();  //強(qiáng)制回顯示,也可用System.out.close() ; System.out.flush( )方法;
  注:(1)從鍵盤輸入字符串后,保存在緩沖區(qū)中的元素還要上兩個(gè)元素‘\r’(回車鍵),元素值為ASCII碼值。
 ?。?)read方法返回值為int,為實(shí)際讀入的字節(jié)個(gè)數(shù)。
 ?。?)read會(huì)產(chǎn)生輸入異常,要么放在try…catch塊中執(zhí)行,要么令mai方法將異常拋出(throws IOException)
  
  long skip(long n) ;  (補(bǔ)充)
  輸入流的當(dāng)前讀取位置向前移動(dòng)n字節(jié),并返回實(shí)際跳過(guò)的字節(jié)數(shù)
  例:P48  System.in.skip(2);
7.3.3  java.io包中的數(shù)據(jù)流類及文件類
  java.io包封裝了大量的數(shù)據(jù)流類,支持基于字節(jié)流(byte stream)的數(shù)據(jù)流(這種流對(duì)于16位的Unicode碼表示的字符流的處理很不方便)和基于字符流(character stream)(以16位Unicode碼形式表示)的數(shù)據(jù)流。
  表7.1~7.4 見P148
  為了全面管理文件系統(tǒng),Java還提供了兩個(gè)文件類:一般文件File和隨機(jī)文件類RandomAccessFile。前者提供操作系統(tǒng)目錄管理的功能,允許用戶訪問(wèn)文件屬性和路徑等。可以順序訪問(wèn)文件。后者用于對(duì)文件以隨機(jī)操作方式讀寫數(shù)據(jù)。
7.3.4  數(shù)據(jù)流的應(yīng)用
例:P150   import java.io.* ;
      public class SC{
public static void main(String arg[]) throws IOException{
  FileReader in=new FileReader("P3.java"); //建立文件輸入流,打開P3.java
  BufferedReader bin=new BufferedReader(in); //建立緩沖輸入流
  FileWriter out=new FileWriter("Hello.txt",true);// 建立文件輸出流,true表示將數(shù)據(jù)保存在文件尾部
      String str;
      while((str=bin.readLine())!=null){ //讀入一行
         System.out.println(str);
         out.write(str+"\n") ;  }// 寫入"Hello.txt"
      in.close();
      out.close();   }}
表7.9 字符文件流類的構(gòu)造 P151
名      稱
說(shuō)      明
FileReader(String name)
name代表文件名,可包含路徑
FileReader(File file)
file是文件類對(duì)象
FileReader(FileDescriptor  fdobj)
fdobj代表一個(gè)打開的I/O設(shè)備
FileWriter(File file)
file是文件類對(duì)象
FileWriter(String name,booleam a)
a取真則將數(shù)據(jù)添加在文件尾部
  如果要選擇地讀寫文件,例如讀寫一行或幾行,隨機(jī)文件RandomAccessFile可實(shí)現(xiàn)這種操作,它能從文件的不同位置讀寫不同長(zhǎng)度的數(shù)據(jù)。
例P151     import java.io.* ;
      public class SC{
public static void main(String arg[]) {
String str[]={"First line\n","Second line\n","last line\n"};
try{
  RandomAccessFile rf=new RandomAccessFile("hello.txt","rw");
  System.out.println("\n文件的指針位置為:"+rf.getFilePointer());
  System.out.println("文件的長(zhǎng)度為:"+rf.length());
  rf.seek(rf.length());
  System.out.println("文件指針現(xiàn)在的位置為:"+rf.getFilePointer());
  for (int i=0;i<3;i++)
     rf.writeBytes(str[i]);// 字符串轉(zhuǎn)換為字節(jié)串添加到文件末尾
  rf.seek(0);
  System.out.println("\n文件現(xiàn)在內(nèi)容:");
  String s;
  while((s=rf.readLine())!=null)
    System.out.println(s);
  rf.close();  }
catch(FileNotFoundException fnoe){}
catch(IOException ioe){}          }}
7.3.5  文件(補(bǔ)充)
  1.創(chuàng)建文件
  格式:File pathname=new File(args[0])
  功能:以路徑文件名來(lái)建立文件對(duì)象
  格式:File f=new File(pathname.getPath , fileNames[i])
  功能:以路徑+文件名創(chuàng)建文件對(duì)象
  2.File類提供的方法
  (1)對(duì)文件名操作提供方法
  public String getName( )  //得到一個(gè)不包含路徑的文件名
  public String getParent( )  //得到文件上一級(jí)的目錄名
  public File getParenFile( )  //得到文件對(duì)象父路徑名
  public String getPath( )  //返回文件路徑名字符串,即路徑文件名
  public String[] list( )  //返回一個(gè)字符串?dāng)?shù)組,為該文件所在目錄下的所有文件名列表,如:String fileName[]=pathName.list( )
  public String getCanonicalPath( ) throws IOException  //返回該文件對(duì)象與系統(tǒng)平臺(tái)相關(guān)的絕對(duì)路徑,與getAbsoluttPath( )同。
  public String renameTo(File newName )  //返回重命名后的文件名
  public String getAbsolutePath( )  //返回文件絕對(duì)路徑名
  (2)測(cè)試文件屬性操作提供方法
  public boolean isDirectory( ) //測(cè)定是否是目錄,如果File代表一個(gè)目錄,則返回true,否則返回false
  public boolean isFile( ) //測(cè)定是否是文件
  public boolean isAbsolute( ) //測(cè)定是否是絕對(duì)文件
  public boolean exists( ) //測(cè)定文件是否存在
  public boolean canRead( ) //測(cè)定是否是可讀文件
  public boolean canWrite( ) //測(cè)定是否是可寫文件
 ?。?)測(cè)試文件屬性操作提供方法
  public boolean delete( ) // 刪除當(dāng)前文件并釋放資源
  public void deleteOnExit( ) // 執(zhí)行完后,刪除文件
  public long length( ) // 返回文件字節(jié)長(zhǎng)度
  public long lastModified( ) //返回文件最后修改時(shí)間
  (4)為目錄操作提供的方法
  public boolean mkdir( )  //創(chuàng)建目錄
  public boolean mkdir( )  //創(chuàng)建包含父目錄的目錄
  public String[] list( )  // 返回當(dāng)前目錄下的文件
  public String[] list(FilenameFilter filter) // 返回當(dāng)前目錄下經(jīng)過(guò)濾后的文件
  public static File[] listRoots( ) // 返回根目錄結(jié)構(gòu)
 ?。?)其他方法
  public int hashCode( ) // 返回文件名的哈希碼
  public boolean setLastModified(long time) //設(shè)置文件最后修改時(shí)間
  public boolean setReadOnly( ) //設(shè)置文件只讀屬性
  
  例:功能:顯示指定目錄下的子目錄,如執(zhí)行java SC c:\
  import java.io.* ;
  public class SC{
  public static void main(String args[]) {
  if(args.length==0) args=new String[]{".."} ;//命令行缺省值
  try {
     File pathName=new File(args[0]); //取命令行參數(shù)
     String fileNames[]=pathName.list(); //取pathName下所有文件名列表
     for (int i=0;i<fileNames.length;i++)
      { File f=new File(pathName.getPath(),fileNames[i]);//創(chuàng)建路徑和文件名創(chuàng)建文件對(duì)象f
  if(f.isDirectory()) //判斷是否是目錄
  {System.out.println(f.getCanonicalPath()); //輸出絕對(duì)路徑
  main(new String[] {f.getPath()}) ; //取下一級(jí)子目錄
  }}}
catch(IOException e)
   { e.printStackTrace(  );   }}}
7.4  其他常用類
  數(shù)學(xué)函數(shù)類Math,提供了基本數(shù)學(xué)運(yùn)算;日期類Date,Calendar和DateFormat,提供了日期和時(shí)間操作;隨機(jī)數(shù)類Random提供了隨機(jī)數(shù)生成器;向量類Vector提供了類似于可變長(zhǎng)數(shù)組的操作。
7.4.1  數(shù)學(xué)函數(shù)類Math
  Math是一個(gè)最終類,可直接在程序中加Math前綴調(diào)用,其成員變量和常用成員方法如下:
  static double E    // 數(shù)學(xué)常量e
  static double PI    // 圓周率Л
  static double sin(double a)    // 正弦函數(shù),參數(shù)為弧度
  static double cos(double a)    // 余弦函數(shù),參數(shù)為弧度
  static double tan(double a)    // 正切函數(shù),參數(shù)為弧度
  static double toDegrees(double angrad)    // 弧度轉(zhuǎn)換為角度
  static double toRadians(double angdeg)    // 角度轉(zhuǎn)換為弧度
  static double exp(double a)    // 常數(shù)e的a次冪
  static double log(double a)    // 自然對(duì)數(shù)
  static double sqrt(double a)    // 平方根
  static double pow(double a,double b)    // a的b次方
  static double round(double a)    // 四舍五入
  static double round(float a)    // 四舍五入
  static double random( )    // 產(chǎn)生大于等于0.0小于1.0的隨機(jī)數(shù)
  static double abs(double a)    // 絕對(duì)值,參數(shù)可以是float,int,long
  static double max(double a,double b)    //最大值,參數(shù)可以是float,int,long
  static double min(double a,double b)    //最小值,參數(shù)可以是float,int,long
  例:System.out.println(Math.PI);       //  3.141592653589793
    System.out.println(Math.sqrt(9));   // 3.0
    System.out.println(Math.random());  //0.061703095869295566
    System.out.println(Math.round(7.5));  //  8
    System.out.println(Math.round(7.4));  //   7
    System.out.println(Math.max(9,4));   //   9  Math.max(9,4,10)則錯(cuò)
7.4.2  日期類Math
  Java提供了3個(gè)日期類:
  Date      :用于創(chuàng)建日期對(duì)象并獲得日期
  Calendar  :可獲取和設(shè)置日期
  DateFormat:用于創(chuàng)建日期格式化器,由格式化器將日期轉(zhuǎn)換為各種日期格式串輸出
  Date和Calendar類在java.util包中,DateFormat類在java.text包中
  Java語(yǔ)言規(guī)定的基準(zhǔn)日期為1970.1.1 00:00:00格林威治(GMT)標(biāo)準(zhǔn)時(shí)
例P154  import java.text.*;
    import java.util.*;
    import java.awt.* ;
    import java.applet.*;
public class SC extends Applet {
 public void paint(Graphics g){
  Date today;
  Calendar now;
  DateFormat f1,f2;
  String s1,s2;
  today=new Date(); //獲取系統(tǒng)當(dāng)前日期
  g.drawString("字符串格式:"+today.toString(),20,20);
  f1=DateFormat.getInstance();  //以默認(rèn)格式生成格式化器
  s1=f1.format(today);       //將日期轉(zhuǎn)換為字符串
  g.drawString("系統(tǒng)格式:"+s1,20,40);
  //生成長(zhǎng)格式的中國(guó)日期格式化器
  f1=DateFormat.getDateInstance(DateFormat.LONG,Locale.CHINA);
  //生成長(zhǎng)格式的中國(guó)時(shí)間格式化器
  f2=DateFormat.getTimeInstance(DateFormat.LONG,Locale.CHINA);
  s1=f1.format(today);   //將日期轉(zhuǎn)換為日期字符串
  s2=f2.format(today); //將日期轉(zhuǎn)換為時(shí)間字符串
  g.drawString("中國(guó)格式:"+s1+" "+s2,20,60);
  now=Calendar.getInstance() ;//獲取系統(tǒng)時(shí)間
  s1=now.get(now.HOUR)+"時(shí)"+now.get(now.MINUTE)+"分"+now.get(now.SECOND)+"秒";
  g.drawString("調(diào)整前時(shí)間:"+s1,20,80);
  now.set(2001,2,15,9,9,9);
  today=now.getTime();
  g.drawString("調(diào)整后時(shí)間"+today.toString(),20,100);  }}
7.4.3  隨機(jī)數(shù)類Random
  為了使用Java程序有良好的可移植性,應(yīng)盡可能使用Random類來(lái)生成隨機(jī)數(shù),而不用Math.random( )。
  Random有兩個(gè)構(gòu)造方法:Random( )(使用系統(tǒng)時(shí)間為種子數(shù)),Random(long seed)。構(gòu)造方法只是創(chuàng)建了隨機(jī)數(shù)生成器,必須調(diào)用生成器的方法才能產(chǎn)生隨機(jī)數(shù)。Random具有nextBoolean,nextInt等方法。
  Random包含在java.util包中。
   例:Random r=new Random( );
     int i1=r.nextInt( );
     int i2=r.nextInt(20);   // 產(chǎn)生大于等于0小于20的隨機(jī)整數(shù)
     double d1=r.nextDouble( );    //產(chǎn)生大于等于0.0小于1.0的隨機(jī)數(shù)
     double d1=r.nextDouble(20.0);  // 錯(cuò)
7.4.4  向量類Vector
  Vector被設(shè)計(jì)成一個(gè)能不斷增長(zhǎng)的序列,用來(lái)保存對(duì)象引用。類似于可變長(zhǎng)數(shù)組,但功能更加強(qiáng)大,任何類型的對(duì)象都可以放入Vector。
  Vector包含在java.util包中,常用方法如下。
  Vector(int initCapacity,int increment) //構(gòu)造方法,指定初始容量和增量
  void addElement(Object obj) //在尾部添加元素,元素個(gè)數(shù)自動(dòng)增1
  boolean removeElement(Object obj) //刪除第一個(gè)與obj相同的元素
  void setElementAt(Object obj , int index) // 替換指定位置的元素
  Object elementAt(int index) //返回指定位置的元素
  int indexOf(Object obj) //返回指定元素obj在向量中的位置
  int size( ) //返回元素個(gè)數(shù)
  int capacity( ) //返回向量長(zhǎng)度
  void trimToSize( ) //按當(dāng)前元素個(gè)數(shù)縮減向量長(zhǎng)度
  Enumeration elements( ) //生成一個(gè)向量元素的枚舉
  例:P157
7.4.5  Class類與Runtime類
  通過(guò)Class類與Runtime類的方法可以獲得運(yùn)行時(shí)的信息,如當(dāng)前類名、超類名、包名、內(nèi)存空間以及操作系統(tǒng)名稱等
  例:P159

查看更多