版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《TPS豐田生產(chǎn)方式》課件
- 決定銷售業(yè)績(jī)的重要心態(tài)(課件)
- LNG氣化站應(yīng)急備用氣源自用建設(shè)項(xiàng)目可行性研究報(bào)告模板-立項(xiàng)備案
- 一年級(jí)語(yǔ)文上冊(cè)拼音aoe
- 2024年江蘇省招聘社區(qū)工作者題庫(kù)及參考答案
- 單位管理制度收錄大合集【人員管理篇】十篇
- 單位管理制度品讀選集【職員管理】十篇
- 樓梯 欄桿 欄板(一)22J403-1
- 果凍袋行業(yè)行業(yè)發(fā)展趨勢(shì)及投資戰(zhàn)略研究分析報(bào)告
- 中國(guó)返利網(wǎng)站行業(yè)市場(chǎng)調(diào)研分析及投資戰(zhàn)略咨詢報(bào)告
- 員工待崗期滿考核方案
- 部編人教版六年級(jí)下冊(cè)小學(xué)語(yǔ)文全冊(cè)教案(教學(xué)設(shè)計(jì))(新課標(biāo)核心素養(yǎng)教案)
- 進(jìn)駐商場(chǎng)計(jì)劃書
- 建筑施工材料供應(yīng)鏈管理與控制
- 代理人培養(yǎng)計(jì)劃書
- 傳播學(xué)理論復(fù)習(xí)資料
- 鄉(xiāng)鎮(zhèn)污水處理調(diào)研報(bào)告
- 沈從文先生在西南聯(lián)大全文
- 紀(jì)檢涉案財(cái)物管理規(guī)定
- 低溫雨雪冰凍災(zāi)害應(yīng)急救援準(zhǔn)備
- 《企業(yè)信息管理》2023期末試題及答案
評(píng)論
0/150
提交評(píng)論