web bjsp19周五-課件第10章_第1頁(yè)
web bjsp19周五-課件第10章_第2頁(yè)
web bjsp19周五-課件第10章_第3頁(yè)
web bjsp19周五-課件第10章_第4頁(yè)
web bjsp19周五-課件第10章_第5頁(yè)
已閱讀5頁(yè),還剩104頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

10.1File類10.2基本輸入/輸出流類10.3字節(jié)文件輸入/輸出流的讀/寫10.4字符文件輸入/輸出流的讀/寫10.5文件的隨機(jī)輸入/輸出流的讀/寫10.6文件的上傳和下載習(xí)題10第10章JSP中的文件操作

在計(jì)算機(jī)系統(tǒng)中,需要長(zhǎng)期保留的數(shù)據(jù)是以文件的形式存放在磁盤、磁帶等外部存儲(chǔ)設(shè)備中的。程序運(yùn)行時(shí)常常要從文件中讀取數(shù)據(jù),同時(shí)也要把需要長(zhǎng)期保留的數(shù)據(jù)寫入文件中。所以,文件操作是計(jì)算機(jī)程序中不可缺少的一部分。而目錄是管理文件的特殊機(jī)制,同類文件保存在同一目錄下可以簡(jiǎn)化文件的管理,提高工作效率。

Java語(yǔ)言的java.io包中的File類是專門用來(lái)管理磁盤文件和目錄的。每個(gè)File類的對(duì)象表示一個(gè)磁盤文件或目錄,其對(duì)象屬性中包含了文件或目錄的相關(guān)信息,例如文件或目錄的名稱、文件的長(zhǎng)度、目錄中所含文件的個(gè)數(shù)等。調(diào)用File類的方法則可以完成對(duì)文件或目錄的日常管理工作,例如創(chuàng)建文件或目錄、刪除文件或目錄、查看文件的有關(guān)信息等。10.1File類

java.io.File類的父類是java.lang.Object。用于創(chuàng)建File類對(duì)象的構(gòu)造方法有三個(gè),它們分別是:

publicFile(Stringpath); //使用指定路徑構(gòu)造一個(gè)File對(duì)象

publicFile(Stringpath,Stringname); //使用指定路徑和字符串構(gòu)造一個(gè)File對(duì)象

publicFile(Filedir,Stringname,); //使用指定文件目錄和字符串構(gòu)造一個(gè)File對(duì)象10.1.1獲取文件屬性的成員方法

使用File類提供的成員方法可以獲得文件本身的一些信息。

File類的常用成員方法如表10.1所示。

表10.1File類的常用成員方法續(xù)表10.1.2應(yīng)用舉例

1.獲取文件的屬性

【示例程序c10_1.jsp】獲取文件的文件名、長(zhǎng)度、大小等特性。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<%@pageimport="java.util.*"%>

<HTML><HEAD><TITLE>獲取文件的屬性</TITLE></HEAD>

<BODY>

獲取文件的屬性

<%

StringPath="F:\\xiti\\ch3\\WebContent";

Filef=newFile(Path,"c3_1.jsp");

out.println("<BR>"+"路徑:"+f.getParent());

out.println("<BR>"+"文件名:"+f.getName());

out.println("<BR>"+"絕對(duì)路徑:"+f.getAbsolutePath());

out.println("<BR>"+"文件大小:"+f.length());

out.println("<BR>"+"是否為文件:"+(f.isFile()?"是":"否"));

out.println("<BR>"+"是否為目錄:"+(f.isDirectory()?"是":"否"));

out.println("<BR>"+"是否為隱藏:"+(f.isHidden()?"是":"否"));

out.println("<BR>"+"是否可讀取:"+(f.canRead()?"是":"否"));

out.println("<BR>"+"是否可寫入:"+(f.canWrite()?"是":"否"));

out.println("<BR>"+"最后修改時(shí)間:"+newDate(f.lastModified()));

%>

</BODY>

</HTML>

該JSP程序的運(yùn)行結(jié)果如圖10.1所示。

圖10.1c10_1.jsp的運(yùn)行結(jié)果

2.創(chuàng)建目錄

【示例程序c10_2.jsp】在ch10目錄下創(chuàng)建一個(gè)名為abc的目錄。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML>

<HEAD><TITLE>創(chuàng)建目錄</TITLE></HEAD>

<BODY>

創(chuàng)建目錄

<%

圖10.2c10_2.jsp的運(yùn)行結(jié)果

StringPath=“F:\\xiti\\ch10\\WebContent”;

Filedir=newFile(Path,“abc”);

dir.mkdir();

out.println(“<BR>”+“目錄名:"+dir.getName();)

out.println("<BR>"+"是否為目錄:"+(dir.isDirectory()?"是":"否"));

%>

</BODY></HTML>

該JSP程序的運(yùn)行結(jié)果如圖10.2所示。

3.刪除目錄和文件

【示例程序c10_3.jsp】將ch10目錄下的abc目錄及t.txt文件刪除。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML>

<HEAD><TITLE>刪除文件和目錄</TITLE></HEAD>

<BODY>

刪除文件和目錄

<%

StringPath="F:\\xiti\\ch10\\WebContent";

Filedir=newFile(Path,"abc");

Filef=newFile(Path,"t.txt");

dir.delete();//刪除abc目錄

out.println("<BR>"+"abc目錄已被刪除");

f.delete();//刪除t.txt文件

out.println("<BR>"+"文件t.txt已被刪除");

%>

</BODY>

</HTML>

該JSP程序的運(yùn)行結(jié)果如圖10.3所示。

圖10.3c10_3.jsp的運(yùn)行結(jié)果

當(dāng)服務(wù)器需要將客戶提交的信息保存到文件或根據(jù)客戶的要求將服務(wù)器的文件內(nèi)容顯示到客戶端時(shí),JSP就通過(guò)Java的輸入/輸出流來(lái)實(shí)現(xiàn)文件的讀/寫操作。在Java語(yǔ)言中,輸入/輸出操作是使用流來(lái)實(shí)現(xiàn)的。流(stream)是指數(shù)據(jù)在計(jì)算機(jī)各部件之間的流動(dòng),它包括輸入流與輸出流。10.2基本輸入/輸出流類輸入流(InputStream)表示從外部設(shè)備(鍵盤、鼠標(biāo)、文件等)到計(jì)算機(jī)的數(shù)據(jù)流動(dòng);輸出流(OutputStream)表示從計(jì)算機(jī)到外部設(shè)備(顯示器、打印機(jī)、磁盤文件等)的數(shù)據(jù)流動(dòng)。Java的輸入/輸出類庫(kù)java.io包提供了若干輸入流和輸出流類。利用輸入流類可以建立輸入流對(duì)象,利用輸入流類提供的成員方法可以從輸入設(shè)備上將數(shù)據(jù)讀入到程序中;利用輸出流類可以建立輸出流對(duì)象,利用輸出流類提供的成員方法可以將程序中產(chǎn)生的數(shù)據(jù)寫到輸出設(shè)備上。流是數(shù)據(jù)的有序序列,它既可以是未加工的原始二進(jìn)制數(shù)據(jù),也可以是經(jīng)過(guò)一定編碼處理后的符合某種規(guī)定格式的特定數(shù)據(jù),如字節(jié)流序列、字符流序列等。數(shù)據(jù)的性質(zhì)、格式不同,則對(duì)流的處理方法也不同,因此,Java的輸入/輸出類庫(kù)中有不同的流類來(lái)對(duì)應(yīng)不同性質(zhì)的輸入/輸出流。在java.io包中基本輸入/輸出流類可按讀/寫數(shù)據(jù)的不同類型分為兩種:字節(jié)流和字符流。

字節(jié)流用于讀/寫字節(jié)類型的數(shù)據(jù)(包括ASCII表中的字符)。字節(jié)流類可分為表示輸入流的InputStream類及其子類和表示輸出流的OutputStream類及其子類。

字符流用于讀/寫Unicode字符。它包括表示輸入流的Reader類及其子類和表示輸出流的Writer類及其子類。10.2.1InputStream類

InputStream類是用于讀取字節(jié)型數(shù)據(jù)的輸入流類,該類的繼承結(jié)構(gòu)如下:

java.lang.Object

java.io.InputStream

java.io.FileInputStream

java.io.FilterInputStream

java.io.DataInputStream

java.io.BufferedInputStream

…10.2.2OutputStream類

OutputStream類是用于輸出字節(jié)型數(shù)據(jù)的輸出流類,該類的繼承結(jié)構(gòu)如下:

java.lang.Object

java.io.OutputStream

java.io.FileOutputStream

java.io.FilterOutputStream

java.io.PrintStream

java.io.DataOutputStream

java.io.BufferedOutputStream10.2.3Reade類

Reader類是用于讀Unicode字符的字符流類,該類的繼承結(jié)構(gòu)如下:

java.lang.Object

java.io.Reader

java.io.InputStreamReader

java.io.FileReader

java.io.BufferedReader

java.io.LineNumberReader

…10.2.4Writer類

Writer類是用于讀Unicode字符的字符流類,該類的繼承結(jié)構(gòu)如下:

java.lang.Object

java.io.Writer

java.io.OutputStreamWriter

java.io.FileWriter

java.io.BufferedWriter

10.3.1FileInputStream類和FileOutputStream類

在網(wǎng)頁(yè)中,經(jīng)常會(huì)用到文件的讀/寫操作。例如,從已經(jīng)存在的數(shù)據(jù)文件中讀入數(shù)據(jù),或者將程序中產(chǎn)生的大量數(shù)據(jù)寫入磁盤文件中。這時(shí)就需要使用文件輸入/輸出流類。Java系統(tǒng)提供的FileInputStream類是用于讀取文件中的字節(jié)數(shù)據(jù)的字節(jié)文件輸入流類;FileOutputStream類是用于向文件寫入字節(jié)數(shù)據(jù)的字節(jié)文件輸出流類。表10.2列出了FileInputStream類和FileOutputStream類的構(gòu)造方法,表10.3列出了這兩個(gè)類的常用成員方法。10.3字節(jié)文件輸入/輸出流的讀/寫

表10.2FileInputStream類和FileOutputStream類的構(gòu)造方法表10.3FileInputStream類和FileOutputStream類的常用成員方法10.3.2字節(jié)文件的讀/寫

利用字節(jié)文件輸入/輸出流完成磁盤文件的讀/寫,首先要利用文件名字符串或File對(duì)象創(chuàng)建輸入/輸出流對(duì)象,其次是從文件輸入/輸出流中讀/寫數(shù)據(jù)。從文件輸入/輸出流中讀/寫數(shù)據(jù)有以下兩種方式。

1.用文件輸入/輸出類自身的讀/寫功能完成文件的讀/寫操作

FileInputStream類和FileOutputStream類自身的讀/寫功能是直接從父類InputStream和OutputStream那里繼承來(lái)的,并未做任何功能的擴(kuò)充。如表10.3中的read(

)、write(

)等方法,都只能完成以字節(jié)為單位的原始二進(jìn)制數(shù)據(jù)的讀/寫。

【示例程序c10_4.jsp】直接利用FileInputStream類和FileOutputStream類完成從數(shù)組中讀入數(shù)據(jù)并寫入文件中,再?gòu)膶懭氲奈募凶x出數(shù)據(jù),輸出到顯示器上。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML><HEAD><TITLE>字節(jié)流讀寫文件</TITLE></HEAD>

<BODY>

<H3>字節(jié)流讀寫文件</H3><HR>

<%

byteb[]="將此字符串輸入temp目錄的d1.txt到文件中<BR>thisisaString".getBytes();

FilefilePath=newFile(“F:/xiti/ch10/WebContent/temp”); //在當(dāng)前目錄下建目錄,也可用絕對(duì)

//目錄

if(!filePath.exists())filePath.mkdir(); //若目錄不存在,則建立

Filefl=newFile(filePath,"d1.txt"); //在指定目錄下建文件類對(duì)象d1.txt

try{

FileOutputStreamfout=newFileOutputStream(fl);

fout.write(b);//將字符串寫入d1.txt

fout.close();

out.println("<BR>"+"\n打印從磁盤讀入的數(shù)據(jù)"+"<BR>");

FileInputStreamfin=newFileInputStream(fl);

intn=0;

bytec[]=newbyte[80];

while((n=fin.read(c))!=-1)//磁盤文件讀入程序

{Stringstr=newString(c,0,n);

out.print(str);

}

fin.close();

}//try結(jié)束

catch(IOExceptione)

{out.println("<BR>"+"IOException");}

%>

</BODY></HTML>

該示例程序的運(yùn)行結(jié)果如圖10.4所示。

圖10.4c10_4.jsp的運(yùn)行結(jié)果

2.配合其它功能較強(qiáng)的輸入/輸出流完成文件的讀/寫操作

為了提高讀/寫的效率及讀/寫功能,以FileInputStream和FileOutputStream為數(shù)據(jù)源,完成與磁盤文件的映射連接后,再創(chuàng)建其它流類的對(duì)象,如DataInputStream類和DataOutputStream類,或BufferedInputStream類和BufferedOutputStream類,這樣就可以配合其它功能較強(qiáng)的輸入/輸出流完成文件的讀/寫操作。其使用方式如下。

(1)字節(jié)讀文件操作。

Filef1=newFile("TextFile1");

DataInputStreamdin=newDataInputStream(newFileInputStream(f1));

BufferedInputStreambin=newBufferedInputStream(newFileInputStream(f1));

(2)字節(jié)寫文件操作。

Filef2=newFile("TextFile2");

DataOutputStreamdout=newDataOutputStream(newFileOutputStream(f2));

BufferedOutputStreambout=newBufferedOutputStream(newFileOutputStream(f2));

DataInputStream類提供的常用成員方法如表10.4所示。

表10.4DataInputStream類的常用成員方法續(xù)表

DataOutputStream類提供的常用成員方法如表10.5所示。

表10.5DataOutputStream類的常用成員方法【示例程序c10_5.jsp】用FileInputStream和FileOutputStream類輸入/輸出流,再套接上DataInputStream類和DataOutputStream類輸入/輸出流完成文件的讀/寫操作。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML>

<HEAD><TITLE>字節(jié)流讀寫文件</TITLE></HEAD>

<BODY>

<H3>字節(jié)流讀寫文件</H3><HR><%

booleanlo=true;shortsi=-32768;

inti=65534;longl=134567;

floatf=(float)1.4567;doubled=3.;

Stringstr1="ABCD";Stringstr2="Java語(yǔ)言教學(xué)";

FilefilePath=newFile("F:/xiti/ch10/WebContent");

Filefl=newFile(filePath,"t1.txt");//在指定目錄下建文件類對(duì)象

try{

FileOutputStreamfout=newFileOutputStream(fl);

DataOutputStreamdataout=newDataOutputStream(fout);//文件輸出流對(duì)象為參數(shù)

dataout.writeBoolean(lo);dataout.writeShort(si);dataout.writeByte(i);

dataout.writeInt(i);dataout.writeLong(l);dataout.writeFloat(f);

dataout.writeDouble(d);dataout.writeBytes(str1);dataout.writeUTF(str2);

dataout.close();

out.println("<BR>"+"\n打印從磁盤讀入的數(shù)據(jù)"+"<BR>");

FileInputStreamfin=newFileInputStream(fl);

DataInputStreamin=newDataInputStream(fin);

out.println("<BR>"+"Blooeanlo="+in.readBoolean());

out.println("<BR>"+"Shortsi="+in.readShort());

out.println("<BR>"+"Bytei="+in.readByte());

out.println("<BR>"+"Inti="+in.readInt());

out.println("<BR>"+"Longl="+in.readLong());

out.println("<BR>"+"Floatf="+in.readFloat());

out.println("<BR>"+"Doubled="+in.readDouble());

byteb[]=newbyte[4];

in.readFully(b);

System.out.print("str1=");

for(intj=0;j<4;j++)System.out.print((char)b[j]);

out.println();

out.println("<BR>"+"str2="+in.readUTF());

fin.close();

}//try結(jié)束

catch(IOExceptione){out.println("<BR>"+"IOException");}

%>

</BODY></HTML>

該示例程序的運(yùn)行結(jié)果如圖10.5所示。

圖10.5c10_5.jsp的運(yùn)行結(jié)果

10.4.1FileReader類和FileWriter類

FileReader類和FileWriter類用于讀取文件和向文件寫入字符數(shù)據(jù)。表10.6列出了FileReader類和FileWriter類的構(gòu)造方法。FileReader類和Filewriter類的常用成員方法是直接從父類Reader類和Writer類繼承的,請(qǐng)參閱表10.7和表10.8。10.4字符文件輸入/輸出流的讀/寫

表10.6FileReader類和FileWriter類的構(gòu)造方法表10.7Reader類的常用成員方法表10.8Writer類的常用成員方法10.4.2字符文件的讀/寫

利用字符文件輸入/輸出流完成磁盤文件的讀/寫,首先要利用文件名字符串或File對(duì)象創(chuàng)建輸入/輸出流對(duì)象,其次是從文件輸入/輸出流中讀/寫數(shù)據(jù)。

FileReader類是Reader派生的對(duì)象,該類的所有成員方法都從Reader類繼承,F(xiàn)ileWriter類是Writer派生的對(duì)象,該類的所有成員方法都從Writer類繼承,因此,字符文件的讀/寫方法是由Reader和Writer類提供的成員方法來(lái)完成。為了提高讀/寫的效率及讀/寫功能,使用FileReader類輸入流套接BufferedReader類緩沖區(qū)輸入流、FileWriter類輸出流套接BufferedWriter類緩沖區(qū)輸出流的策略,可以加快復(fù)制文件的速度。其使用方式如下。

(1)字節(jié)讀文件操作。

Filef1=newFile("TextFile1");

BufferedReaderbin=newBufferedReader(newFileReader(f1));

(2)字節(jié)寫文件操作。

Filef2=newFile("TextFile2");

BufferedWriterbout=newBufferedWriter(newFileWriter(f2));下面通過(guò)例子來(lái)說(shuō)明其應(yīng)用。

【示例程序c10_6.jsp】將data1.txt復(fù)制到data2.txt文件中。

<%@pagecontentType="text/html;charset=GB2312"%>

<%@pageimport="java.io.*"%>

<HTML><HEAD><TITLE>字符文件的復(fù)制</TITLE></HEAD>

<BODY>

<H3>字符文件讀寫</H3><HR>

<%

FilefilePath=newFile("F:/xiti/ch10/WebContent");

FilesourceFile=newFile(filePath,"data1.txt"); //在指定目錄下建文件類對(duì)象

FiletargetFile=newFile(filePath,"data2.txt"); //在指定目錄下建文件類對(duì)象

Stringtemp;

try

{

BufferedReadersource=newBufferedReader(newFileReader(sourceFile));

BufferedWritertarget=newBufferedWriter(newFileWriter(targetFile));

while((temp=source.readLine())!=null)

{target.write(temp);

target.newLine();

target.flush();

}

out.println("<BR>"+"復(fù)制文件完成!!!");

source.close();

target.close();

}

catch(IOExceptionE){out.println("<BR>"+"I/O錯(cuò)誤!");}

%>

</BODY></HTML>

該示例程序的運(yùn)行結(jié)果如圖10.6所示。

圖10.6c10_6.jsp的運(yùn)行結(jié)果

前面介紹的文件存取方式屬于順序存取,即只能從文件的起始位置向后順序讀/寫。java.io包提供的RandomAccessFile類是隨機(jī)文件訪問(wèn)類,該類的對(duì)象可以引用與文件位置指針有關(guān)的成員方法,讀/寫任意位置的數(shù)據(jù),實(shí)現(xiàn)對(duì)文件的隨機(jī)讀/寫操作。文件的隨機(jī)存取要比順序存取更加靈活。10.5文件的隨機(jī)輸入/輸出流的讀/寫10.5.1RandomAccessFile類

java.io.RandomAccessFile類的構(gòu)造方法有兩個(gè):

(1)

RandomAccessFile(Stringname,Stringmode)。使用指定的字符串和模式參數(shù)創(chuàng)建一個(gè)RandomAccessFile類對(duì)象。

(2)

RandomAccessFile(Filef,Stringmode)。使用指定的文件對(duì)象和模式參數(shù)創(chuàng)建一個(gè)RandomAccessFile類對(duì)象。在RandomAccessFile類的構(gòu)造方法中,除了指定文件的路徑外,還必須指定文件的存取模式。存取模式有讀模式和讀/寫模式兩種:“r”代表以只讀方式打開(kāi)文件;“rw”代表以讀/寫方式打開(kāi)文件,這時(shí)用一個(gè)對(duì)象就可以同時(shí)實(shí)現(xiàn)讀/寫兩種操作。需要注意的是,創(chuàng)建RandomAccessFile對(duì)象時(shí),可能產(chǎn)生兩種異常:當(dāng)指定的文件不存在時(shí),系統(tǒng)將拋出FileNotFoundException異常;若試圖用讀/寫方式打開(kāi)具有只讀屬性的文件或出現(xiàn)了其它輸入/輸出錯(cuò)誤時(shí),則會(huì)拋出IOException異常。10.5.2RandomAccessFile類中的常用成員方法

RandomAccessFile類中的常用成員方法見(jiàn)表10.9。

表10.9RandomAccessFile類中的常用成員方法續(xù)表續(xù)表10.5.3文件位置指針的操作

RandomAccessFile類的對(duì)象可以引用與文件位置指針有關(guān)的各種成員方法,在任意位置實(shí)現(xiàn)數(shù)據(jù)讀/寫。RandomAccessFile類對(duì)象的文件位置指針遵循以下規(guī)律。

(1)新建RandomAccessFile類對(duì)象時(shí),文件位置指針位于文件的開(kāi)頭處。

(2)每次讀/寫操作之后,文件位置指針都后移相應(yīng)個(gè)讀/寫的字節(jié)數(shù)。

(3)利用seek()方法可以移動(dòng)文件位置指針到一個(gè)新的位置。

(4)利用getPointer()方法可獲得本文件當(dāng)前的文件指針位置。

(5)利用length()方法可得到文件的字節(jié)長(zhǎng)度,利用getPointer()方法和length()方法可以判斷讀取的文件是否到文件尾部。下面通過(guò)實(shí)現(xiàn)網(wǎng)上提交作業(yè)的例子來(lái)說(shuō)明其應(yīng)用方法。

下面的例子中,首先顯示一個(gè)如圖10.7所示的網(wǎng)上交作業(yè)的JSP頁(yè)面,在這個(gè)頁(yè)面上學(xué)生們提交學(xué)號(hào)、名字和作業(yè),然后單擊“確定”按鈕。提交后,JSP頁(yè)面訪問(wèn)Servlet,Servlet將學(xué)生的作業(yè)送入文本文件(zuoye.txt),并且再?gòu)奈募凶x出該學(xué)生提交的內(nèi)容顯示到頁(yè)面中。

圖10.7jiaoZuoYe.jsp的運(yùn)行結(jié)果

【示例程序jiaoZuoYe.jsp】網(wǎng)上提交作業(yè)的JSP頁(yè)面。

<%@pagecontentType="text/html;charset=GBK"%>

<HTML><HEAD><TITLE>交作業(yè)</TITLE></HEAD>

<BODY>

<CENTER>交Java程序作業(yè)</CENTER><HR>

<FORMMETHOD="post"ACTION="ZuoYe_Servlet">

<P>學(xué)號(hào):<INPUTTYPE="no"NAME="myNo"></P>

<P>姓名:<INPUTTYPE="name"NAME="myName"SIZE=25></P>

<P><TEXTAREAname="zuoye"ROWS="12"COLS="80"WRAP="physical"></TEXTAREA></P>

<P><INPUTTYPE="submit"VALUE="確定">

<INPUTTYPE="reset"value="清除"></P>

</FORM>

</BODY>

</HTML>

【示例程序ZuoYe_Servlet.java】這個(gè)Servlet從JSP頁(yè)面讀取學(xué)生提交的作業(yè)數(shù)據(jù),將這些數(shù)據(jù)寫入文本文件(zuoye.txt)。然后,再?gòu)奈募凶x出該學(xué)生提交的內(nèi)容顯示到頁(yè)面中。

importjava.io.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassZuoYe_ServletextendsHttpServlet

{

//響應(yīng)POST請(qǐng)求

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{

longfp;

Strings1,s2,s3;

response.setContentType(“text/html;charset=GB2312”); //設(shè)置響應(yīng)的MIME類型

PrintWriterout=response.getWriter(); //獲得向客戶發(fā)送數(shù)據(jù)的輸出流

out.println("<HTML><BODY>");

Stringuse="yes"; byteno[]=(request.getParameter("myNo")).getBytes("ISO-8859-1");

bytename[]=request.getParameter("myName").getBytes("ISO-8859-1");

bytecontent[]=request.getParameter("zuoye").getBytes("ISO-8859-1");

Filefl=newFile("F:/xiti/ch10/WebContent","zuoye.

txt");

//文件的操作放入同步塊中,通知其他用戶

if(use.startsWith("yes"))

{synchronized(fl)

{use="mang";

try{

RandomAccessFilefrw=newRandomAccessFile(fl,"rw");

fp=frw.length();

frw.seek(fp); //定位到文件尾

frw.write(no); //將字符串寫入zuoye.txt

frw.write(name);

frw.write(content);

frw.seek(0); //文件指針定位到文件尾

frw.seek(fp); //文件指針定位到fp處

frw.read(no);

s1=newString(no);

frw.read(name);

s2=newString(name);

frw.read(content);

s3=newString(content);

frw.close();

use="yes";

out.println("已交的作業(yè)是:<P>"+s1+"<BR>"+s2+"<BR>"+s3+"<P>");

}//try結(jié)束

catch(IOExceptione){out.println("交作業(yè)失敗<BR>");}

}

}

else

out.println("作業(yè)在交,請(qǐng)等待<BR>");

out.println("</BODY></HTML>");

}

//處理GET請(qǐng)求

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{doPost(request,response); }

}

該示例程序的運(yùn)行結(jié)果如圖10.8所示。

圖10.8ZuoYe_Servlet.java的運(yùn)行結(jié)果

在進(jìn)行Web開(kāi)發(fā)時(shí),很多時(shí)候都離不開(kāi)與用戶的文件交流。例如,把軟件上傳到下載網(wǎng)站中,或者從某個(gè)網(wǎng)站下載文件。本節(jié)介紹基于JSP+Servlet技術(shù)的文件上傳和下載程序的開(kāi)發(fā)。

10.6.1文件上傳

基于JSP+Servlet技術(shù)的文件上傳程序由兩個(gè)程序文件組成:一個(gè)是供用戶選擇上傳文件的JSP界面程序,另一個(gè)是實(shí)施文件上傳功能的Servlet程序。10.6文件的上傳和下載

1.客戶端上傳文件給服務(wù)器的JSP程序SelectFile.jsp

<%@pagecontentType="text/html;charset=GBK"%>

<HTML>

<HEAD><TITLE>fileupload</TITLE></HEAD>

<BODY>

<CENTER><H1><B>文件上傳</B></H1></CENTER><BR>

<FORMname="selectfile"enctype="multipart/form-data"method="post"action="Upload">

<P>文件名稱:

<INPUTtype="file"name="ulfile"size="20"maxlength="80">

</P><P>

<INPUTtype="submit"value="上傳"><INPUTtype="reset"value="清除"></P>

</FORM>

</BODY></HTML>

說(shuō)明:利用JSP頁(yè)面上傳文件給Servlet時(shí),必須在該JSP頁(yè)面的<FORM>標(biāo)記中將“enctype”屬性的值設(shè)成“multipart/form-data”;其次,表單中必須含有type=file類型的<INPUT>標(biāo)記。

2.將文件上傳的Servlet程序Upload.java

importjava.io.*;

importjavax.servlet.*;

importjavax.servlet.http.*;

publicclassUploadextendsHttpServlet

{

//響應(yīng)POST請(qǐng)求

protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{

response.setContentType("text/html;charset=GB2312"); //設(shè)置響應(yīng)的MIME類型

PrintWriterout=response.getWriter(); //獲得向客戶發(fā)送數(shù)據(jù)的輸出流

try{

InputStreamsource=request.getInputStream(); //獲得客戶上傳的輸入流

//將上傳的文件存入F:/xiti/ch10/WebContent/text2.txt中

StringPh="F:/xiti/ch10/WebContent";

Filef=newFile(Ph,"text2.txt"); //創(chuàng)建text2.txt文件

FileOutputStreamtarget=newFileOutputStream(f);

bytebuff[]=newbyte[1024];

inttemp;

while((temp=source.read(buff))!=-1)//讀輸入流的信息存放到buff中,長(zhǎng)度賦給temp

{target.write(buff,0,temp);}//將buff[]從0位置開(kāi)始,長(zhǎng)度為temp寫入text2.txt文件

source.close();

target.close();

out.println("<HTML><HEAD><TITLE>文件上傳</TITLE></HEAD><BODY>");

out.println("文件已上傳<BR>");

}

catch(Exceptione)

{out.println("文件不能上傳<BR>");}

out.println("</BODY></HTML>");

}

//處理GET請(qǐng)求

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{doPost(request,response); }

}說(shuō)明:

(1)

InputStreamsource=request.getInputStream();語(yǔ)句表示獲得客戶端的一個(gè)輸入流,通過(guò)這個(gè)輸入流讀入客戶上傳的全部信息,包括文件的內(nèi)容以及表單的信息。

圖10.9SelectFile.jsp的運(yùn)行結(jié)果

(2)

Filef=newFile(Ph,"text2.txt");語(yǔ)句指出文件上傳的位置(路徑)和文件名。本例將文件上傳至F:/xiti/ch10/WebContent目錄中,并以text2.txt為文件名保存。

3.運(yùn)行測(cè)試

執(zhí)行SelectFile.jsp程序,首先出現(xiàn)如圖10.9所示的界面。在這個(gè)界面上單擊“瀏覽”按鈕,彈出如圖10.10所示的“選擇文件”對(duì)話框。在這個(gè)對(duì)話框中指定要上傳的文件后,單擊“打開(kāi)”按鈕,返回圖10.9。這時(shí)再單擊“上傳”按鈕,則執(zhí)行Upload.java程序,實(shí)施文件上傳功能。文件上傳完成后,出現(xiàn)如圖10.11所示界面。打開(kāi)text2.txt文件,其結(jié)果如圖10.12所示。圖10.9SelectFile.jsp的運(yùn)行結(jié)果

圖10.10“選擇文件”對(duì)話框

圖10.11Upload.java的運(yùn)行結(jié)果

圖10.12存入text2.txt文件的內(nèi)容10.6.2文件下載

與上傳文件類似,基于JSP+Servlet技術(shù)的下載文件程序也由兩個(gè)程序文件組成:一個(gè)是供用戶選擇下載文件的JSP界面程序,另一個(gè)是實(shí)施文件下載功能的Servlet程序。

1.客戶端從服務(wù)器下載文件的JSP程序DownFile_JSP.jsp

<%@pagecontentType="text/html;charset=GBK"%>

<HTML><HEAD><TITLE>下載文件</TITLE></HEAD><BODY>

<CENTER><B>下載文件</B></CENTER><HR>

<P><Ahref="DownFile?filename=text1.txt">下載text1.txt</A></P>

<P><Ahref="DownFile?filename=c10_1.jsp">下載c10_1.jsp</A></P>

</BODY></HTML>

2.將下載的文件存入任意文件夾中的Servlet程序DownFile.java

importjava.io.*;

importjavax.servlet.ServletException;

importjavax.servlet.http.*;

publicclassDownFileextendsHttpServlet

{publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)

throwsServletException,IOException

{BufferedInputStreambis=null;

BufferedOutputStreambos=null;

try

{

Stringfilename=request.getParameter("filename");

Stringfilename2=newString(filename.getBytes("iso8859-1"),"gb2312");

//通知客戶文件的MIME類型

response.setContentType("application/x-msdownload");

//客戶使用保存文件的對(duì)話框

response.setHeader("Content-disposition","attachment;filename="+filename);

bis=newBufferedInputStream(newFileInputStream(getServletContext().getRealPath("/"+filename2)));

bos=newBufferedOutputStream(response.getOutputStream());

byte[]buff=newbyte[2048];

intbytesRead;

while((bytesRead=bis.read(buff))!=-1)

{bos.write(buff,0,byt

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論