![web bjsp19周五-課件第10章_第1頁](http://file4.renrendoc.com/view/f9bc5fa5088cd29e8f9d23ad64b09f81/f9bc5fa5088cd29e8f9d23ad64b09f811.gif)
![web bjsp19周五-課件第10章_第2頁](http://file4.renrendoc.com/view/f9bc5fa5088cd29e8f9d23ad64b09f81/f9bc5fa5088cd29e8f9d23ad64b09f812.gif)
![web bjsp19周五-課件第10章_第3頁](http://file4.renrendoc.com/view/f9bc5fa5088cd29e8f9d23ad64b09f81/f9bc5fa5088cd29e8f9d23ad64b09f813.gif)
![web bjsp19周五-課件第10章_第4頁](http://file4.renrendoc.com/view/f9bc5fa5088cd29e8f9d23ad64b09f81/f9bc5fa5088cd29e8f9d23ad64b09f814.gif)
![web bjsp19周五-課件第10章_第5頁](http://file4.renrendoc.com/view/f9bc5fa5088cd29e8f9d23ad64b09f81/f9bc5fa5088cd29e8f9d23ad64b09f815.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
10.1File類10.2基本輸入/輸出流類10.3字節(jié)文件輸入/輸出流的讀/寫10.4字符文件輸入/輸出流的讀/寫10.5文件的隨機輸入/輸出流的讀/寫10.6文件的上傳和下載習(xí)題10第10章JSP中的文件操作
在計算機系統(tǒng)中,需要長期保留的數(shù)據(jù)是以文件的形式存放在磁盤、磁帶等外部存儲設(shè)備中的。程序運行時常常要從文件中讀取數(shù)據(jù),同時也要把需要長期保留的數(shù)據(jù)寫入文件中。所以,文件操作是計算機程序中不可缺少的一部分。而目錄是管理文件的特殊機制,同類文件保存在同一目錄下可以簡化文件的管理,提高工作效率。
Java語言的java.io包中的File類是專門用來管理磁盤文件和目錄的。每個File類的對象表示一個磁盤文件或目錄,其對象屬性中包含了文件或目錄的相關(guān)信息,例如文件或目錄的名稱、文件的長度、目錄中所含文件的個數(shù)等。調(diào)用File類的方法則可以完成對文件或目錄的日常管理工作,例如創(chuàng)建文件或目錄、刪除文件或目錄、查看文件的有關(guān)信息等。10.1File類
java.io.File類的父類是java.lang.Object。用于創(chuàng)建File類對象的構(gòu)造方法有三個,它們分別是:
publicFile(Stringpath); //使用指定路徑構(gòu)造一個File對象
publicFile(Stringpath,Stringname); //使用指定路徑和字符串構(gòu)造一個File對象
publicFile(Filedir,Stringname,); //使用指定文件目錄和字符串構(gòu)造一個File對象10.1.1獲取文件屬性的成員方法
使用File類提供的成員方法可以獲得文件本身的一些信息。
File類的常用成員方法如表10.1所示。
表10.1File類的常用成員方法續(xù)表10.1.2應(yīng)用舉例
1.獲取文件的屬性
【示例程序c10_1.jsp】獲取文件的文件名、長度、大小等特性。
<%@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>"+"絕對路徑:"+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>"+"最后修改時間:"+newDate(f.lastModified()));
%>
</BODY>
</HTML>
該JSP程序的運行結(jié)果如圖10.1所示。
圖10.1c10_1.jsp的運行結(jié)果
2.創(chuàng)建目錄
【示例程序c10_2.jsp】在ch10目錄下創(chuàng)建一個名為abc的目錄。
<%@pagecontentType="text/html;charset=GB2312"%>
<%@pageimport="java.io.*"%>
<HTML>
<HEAD><TITLE>創(chuàng)建目錄</TITLE></HEAD>
<BODY>
創(chuàng)建目錄
<%
圖10.2c10_2.jsp的運行結(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程序的運行結(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程序的運行結(jié)果如圖10.3所示。
圖10.3c10_3.jsp的運行結(jié)果
當(dāng)服務(wù)器需要將客戶提交的信息保存到文件或根據(jù)客戶的要求將服務(wù)器的文件內(nèi)容顯示到客戶端時,JSP就通過Java的輸入/輸出流來實現(xiàn)文件的讀/寫操作。在Java語言中,輸入/輸出操作是使用流來實現(xiàn)的。流(stream)是指數(shù)據(jù)在計算機各部件之間的流動,它包括輸入流與輸出流。10.2基本輸入/輸出流類輸入流(InputStream)表示從外部設(shè)備(鍵盤、鼠標、文件等)到計算機的數(shù)據(jù)流動;輸出流(OutputStream)表示從計算機到外部設(shè)備(顯示器、打印機、磁盤文件等)的數(shù)據(jù)流動。Java的輸入/輸出類庫java.io包提供了若干輸入流和輸出流類。利用輸入流類可以建立輸入流對象,利用輸入流類提供的成員方法可以從輸入設(shè)備上將數(shù)據(jù)讀入到程序中;利用輸出流類可以建立輸出流對象,利用輸出流類提供的成員方法可以將程序中產(chǎn)生的數(shù)據(jù)寫到輸出設(shè)備上。流是數(shù)據(jù)的有序序列,它既可以是未加工的原始二進制數(shù)據(jù),也可以是經(jīng)過一定編碼處理后的符合某種規(guī)定格式的特定數(shù)據(jù),如字節(jié)流序列、字符流序列等。數(shù)據(jù)的性質(zhì)、格式不同,則對流的處理方法也不同,因此,Java的輸入/輸出類庫中有不同的流類來對應(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)頁中,經(jīng)常會用到文件的讀/寫操作。例如,從已經(jīng)存在的數(shù)據(jù)文件中讀入數(shù)據(jù),或者將程序中產(chǎn)生的大量數(shù)據(jù)寫入磁盤文件中。這時就需要使用文件輸入/輸出流類。Java系統(tǒng)提供的FileInputStream類是用于讀取文件中的字節(jié)數(shù)據(jù)的字節(jié)文件輸入流類;FileOutputStream類是用于向文件寫入字節(jié)數(shù)據(jù)的字節(jié)文件輸出流類。表10.2列出了FileInputStream類和FileOutputStream類的構(gòu)造方法,表10.3列出了這兩個類的常用成員方法。10.3字節(jié)文件輸入/輸出流的讀/寫
表10.2FileInputStream類和FileOutputStream類的構(gòu)造方法表10.3FileInputStream類和FileOutputStream類的常用成員方法10.3.2字節(jié)文件的讀/寫
利用字節(jié)文件輸入/輸出流完成磁盤文件的讀/寫,首先要利用文件名字符串或File對象創(chuàng)建輸入/輸出流對象,其次是從文件輸入/輸出流中讀/寫數(shù)據(jù)。從文件輸入/輸出流中讀/寫數(shù)據(jù)有以下兩種方式。
1.用文件輸入/輸出類自身的讀/寫功能完成文件的讀/寫操作
FileInputStream類和FileOutputStream類自身的讀/寫功能是直接從父類InputStream和OutputStream那里繼承來的,并未做任何功能的擴充。如表10.3中的read(
)、write(
)等方法,都只能完成以字節(jié)為單位的原始二進制數(shù)據(jù)的讀/寫。
【示例程序c10_4.jsp】直接利用FileInputStream類和FileOutputStream類完成從數(shù)組中讀入數(shù)據(jù)并寫入文件中,再從寫入的文件中讀出數(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)前目錄下建目錄,也可用絕對
//目錄
if(!filePath.exists())filePath.mkdir(); //若目錄不存在,則建立
Filefl=newFile(filePath,"d1.txt"); //在指定目錄下建文件類對象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>
該示例程序的運行結(jié)果如圖10.4所示。
圖10.4c10_4.jsp的運行結(jié)果
2.配合其它功能較強的輸入/輸出流完成文件的讀/寫操作
為了提高讀/寫的效率及讀/寫功能,以FileInputStream和FileOutputStream為數(shù)據(jù)源,完成與磁盤文件的映射連接后,再創(chuàng)建其它流類的對象,如DataInputStream類和DataOutputStream類,或BufferedInputStream類和BufferedOutputStream類,這樣就可以配合其它功能較強的輸入/輸出流完成文件的讀/寫操作。其使用方式如下。
(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語言教學(xué)";
FilefilePath=newFile("F:/xiti/ch10/WebContent");
Filefl=newFile(filePath,"t1.txt");//在指定目錄下建文件類對象
try{
FileOutputStreamfout=newFileOutputStream(fl);
DataOutputStreamdataout=newDataOutputStream(fout);//文件輸出流對象為參數(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>
該示例程序的運行結(jié)果如圖10.5所示。
圖10.5c10_5.jsp的運行結(jié)果
10.4.1FileReader類和FileWriter類
FileReader類和FileWriter類用于讀取文件和向文件寫入字符數(shù)據(jù)。表10.6列出了FileReader類和FileWriter類的構(gòu)造方法。FileReader類和Filewriter類的常用成員方法是直接從父類Reader類和Writer類繼承的,請參閱表10.7和表10.8。10.4字符文件輸入/輸出流的讀/寫
表10.6FileReader類和FileWriter類的構(gòu)造方法表10.7Reader類的常用成員方法表10.8Writer類的常用成員方法10.4.2字符文件的讀/寫
利用字符文件輸入/輸出流完成磁盤文件的讀/寫,首先要利用文件名字符串或File對象創(chuàng)建輸入/輸出流對象,其次是從文件輸入/輸出流中讀/寫數(shù)據(jù)。
FileReader類是Reader派生的對象,該類的所有成員方法都從Reader類繼承,F(xiàn)ileWriter類是Writer派生的對象,該類的所有成員方法都從Writer類繼承,因此,字符文件的讀/寫方法是由Reader和Writer類提供的成員方法來完成。為了提高讀/寫的效率及讀/寫功能,使用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));下面通過例子來說明其應(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"); //在指定目錄下建文件類對象
FiletargetFile=newFile(filePath,"data2.txt"); //在指定目錄下建文件類對象
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錯誤!");}
%>
</BODY></HTML>
該示例程序的運行結(jié)果如圖10.6所示。
圖10.6c10_6.jsp的運行結(jié)果
前面介紹的文件存取方式屬于順序存取,即只能從文件的起始位置向后順序讀/寫。java.io包提供的RandomAccessFile類是隨機文件訪問類,該類的對象可以引用與文件位置指針有關(guān)的成員方法,讀/寫任意位置的數(shù)據(jù),實現(xiàn)對文件的隨機讀/寫操作。文件的隨機存取要比順序存取更加靈活。10.5文件的隨機輸入/輸出流的讀/寫10.5.1RandomAccessFile類
java.io.RandomAccessFile類的構(gòu)造方法有兩個:
(1)
RandomAccessFile(Stringname,Stringmode)。使用指定的字符串和模式參數(shù)創(chuàng)建一個RandomAccessFile類對象。
(2)
RandomAccessFile(Filef,Stringmode)。使用指定的文件對象和模式參數(shù)創(chuàng)建一個RandomAccessFile類對象。在RandomAccessFile類的構(gòu)造方法中,除了指定文件的路徑外,還必須指定文件的存取模式。存取模式有讀模式和讀/寫模式兩種:“r”代表以只讀方式打開文件;“rw”代表以讀/寫方式打開文件,這時用一個對象就可以同時實現(xiàn)讀/寫兩種操作。需要注意的是,創(chuàng)建RandomAccessFile對象時,可能產(chǎn)生兩種異常:當(dāng)指定的文件不存在時,系統(tǒng)將拋出FileNotFoundException異常;若試圖用讀/寫方式打開具有只讀屬性的文件或出現(xiàn)了其它輸入/輸出錯誤時,則會拋出IOException異常。10.5.2RandomAccessFile類中的常用成員方法
RandomAccessFile類中的常用成員方法見表10.9。
表10.9RandomAccessFile類中的常用成員方法續(xù)表續(xù)表10.5.3文件位置指針的操作
RandomAccessFile類的對象可以引用與文件位置指針有關(guān)的各種成員方法,在任意位置實現(xiàn)數(shù)據(jù)讀/寫。RandomAccessFile類對象的文件位置指針遵循以下規(guī)律。
(1)新建RandomAccessFile類對象時,文件位置指針位于文件的開頭處。
(2)每次讀/寫操作之后,文件位置指針都后移相應(yīng)個讀/寫的字節(jié)數(shù)。
(3)利用seek()方法可以移動文件位置指針到一個新的位置。
(4)利用getPointer()方法可獲得本文件當(dāng)前的文件指針位置。
(5)利用length()方法可得到文件的字節(jié)長度,利用getPointer()方法和length()方法可以判斷讀取的文件是否到文件尾部。下面通過實現(xiàn)網(wǎng)上提交作業(yè)的例子來說明其應(yīng)用方法。
下面的例子中,首先顯示一個如圖10.7所示的網(wǎng)上交作業(yè)的JSP頁面,在這個頁面上學(xué)生們提交學(xué)號、名字和作業(yè),然后單擊“確定”按鈕。提交后,JSP頁面訪問Servlet,Servlet將學(xué)生的作業(yè)送入文本文件(zuoye.txt),并且再從文件中讀出該學(xué)生提交的內(nèi)容顯示到頁面中。
圖10.7jiaoZuoYe.jsp的運行結(jié)果
【示例程序jiaoZuoYe.jsp】網(wǎng)上提交作業(yè)的JSP頁面。
<%@pagecontentType="text/html;charset=GBK"%>
<HTML><HEAD><TITLE>交作業(yè)</TITLE></HEAD>
<BODY>
<CENTER>交Java程序作業(yè)</CENTER><HR>
<FORMMETHOD="post"ACTION="ZuoYe_Servlet">
<P>學(xué)號:<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】這個Servlet從JSP頁面讀取學(xué)生提交的作業(yè)數(shù)據(jù),將這些數(shù)據(jù)寫入文本文件(zuoye.txt)。然后,再從文件中讀出該學(xué)生提交的內(nèi)容顯示到頁面中。
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclassZuoYe_ServletextendsHttpServlet
{
//響應(yīng)POST請求
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è)在交,請等待<BR>");
out.println("</BODY></HTML>");
}
//處理GET請求
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException
{doPost(request,response); }
}
該示例程序的運行結(jié)果如圖10.8所示。
圖10.8ZuoYe_Servlet.java的運行結(jié)果
在進行Web開發(fā)時,很多時候都離不開與用戶的文件交流。例如,把軟件上傳到下載網(wǎng)站中,或者從某個網(wǎng)站下載文件。本節(jié)介紹基于JSP+Servlet技術(shù)的文件上傳和下載程序的開發(fā)。
10.6.1文件上傳
基于JSP+Servlet技術(shù)的文件上傳程序由兩個程序文件組成:一個是供用戶選擇上傳文件的JSP界面程序,另一個是實施文件上傳功能的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>
說明:利用JSP頁面上傳文件給Servlet時,必須在該JSP頁面的<FORM>標記中將“enctype”屬性的值設(shè)成“multipart/form-data”;其次,表單中必須含有type=file類型的<INPUT>標記。
2.將文件上傳的Servlet程序Upload.java
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
publicclassUploadextendsHttpServlet
{
//響應(yīng)POST請求
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中,長度賦給temp
{target.write(buff,0,temp);}//將buff[]從0位置開始,長度為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請求
publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)
throwsServletException,IOException
{doPost(request,response); }
}說明:
(1)
InputStreamsource=request.getInputStream();語句表示獲得客戶端的一個輸入流,通過這個輸入流讀入客戶上傳的全部信息,包括文件的內(nèi)容以及表單的信息。
圖10.9SelectFile.jsp的運行結(jié)果
(2)
Filef=newFile(Ph,"text2.txt");語句指出文件上傳的位置(路徑)和文件名。本例將文件上傳至F:/xiti/ch10/WebContent目錄中,并以text2.txt為文件名保存。
3.運行測試
執(zhí)行SelectFile.jsp程序,首先出現(xiàn)如圖10.9所示的界面。在這個界面上單擊“瀏覽”按鈕,彈出如圖10.10所示的“選擇文件”對話框。在這個對話框中指定要上傳的文件后,單擊“打開”按鈕,返回圖10.9。這時再單擊“上傳”按鈕,則執(zhí)行Upload.java程序,實施文件上傳功能。文件上傳完成后,出現(xiàn)如圖10.11所示界面。打開text2.txt文件,其結(jié)果如圖10.12所示。圖10.9SelectFile.jsp的運行結(jié)果
圖10.10“選擇文件”對話框
圖10.11Upload.java的運行結(jié)果
圖10.12存入text2.txt文件的內(nèi)容10.6.2文件下載
與上傳文件類似,基于JSP+Servlet技術(shù)的下載文件程序也由兩個程序文件組成:一個是供用戶選擇下載文件的JSP界面程序,另一個是實施文件下載功能的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");
//客戶使用保存文件的對話框
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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年青島道路運輸從業(yè)資格證考試題和答案
- 基于深度強化學(xué)習(xí)的城軌列車自動駕駛多目標控制研究
- 基于群智能優(yōu)化的三維WSNs節(jié)點定位算法研究
- 改進粒子群優(yōu)化算法在無人機運動目標搜索中的應(yīng)用研究
- 一年級下冊36《我的假期計劃》心理健康教學(xué)設(shè)計
- 2025年教科新版選修6歷史下冊月考試卷含答案
- 智能手機應(yīng)用內(nèi)廣告投放合同(2篇)
- 智能公交系統(tǒng)招標合同(2篇)
- 機動租車協(xié)議書(2篇)
- 2025年浙教版八年級地理上冊月考試卷
- 期中測試卷-2024-2025學(xué)年統(tǒng)編版語文五年級上冊
- 新教材人教版高中物理選擇性必修第三冊全冊各章節(jié)知識點考點
- CJT 354-2010 城市軌道交通車輛空調(diào)、采暖及通風(fēng)裝置技術(shù)條件
- 暑假作業(yè) 11 高二英語語法填空20篇(原卷版)-【暑假分層作業(yè)】2024年高二英語暑假培優(yōu)練(人教版2019)
- 2024年江西省南昌市南昌縣中考一模數(shù)學(xué)試題(含解析)
- 繪本的分鏡設(shè)計-分鏡的編排
- 查干淖爾一號井環(huán)評
- 體檢中心分析報告
- 人教版初中英語七八九全部單詞(打印版)
- 最高人民法院婚姻法司法解釋(二)的理解與適用
- 關(guān)于醫(yī)保應(yīng)急預(yù)案
評論
0/150
提交評論