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