第五讲 JSP中的文件操作(1) 教学目的 本讲主要讲述JSP中使用Java输入、输出流实现文件的读写 操作 。 知识要点

Slides:



Advertisements
Similar presentations
第二章 JSP 编译指令. 课程目标  JSP 编译指令  JSP 页面的表达式  JSP 页面的注释  JSP 页面的声明  Scriptlets.
Advertisements

Java Web 开发 授课人:张鸽. 第三讲 JSP 内置对象  JSP 有以下九种内置对象,包括:  ·request ,请求对象  ·response ,响应对象  ·pageContext ,页面上下文对象  ·session ,会话对象  ·application ,应用程序对象.
单元二:面向对象程序设计 任务二:借书卡程序设计.
3.2 Java的类 Java 类库的概念 语言规则——程序的书写规范 Java语言 类库——已有的有特定功能的Java程序模块
《计算机网络技术》 动态网页制作技术 常用HTML控件课程积件 杨 姝.
数据存储.
动态Web开发技术--JSP.
檔案處理.
第五章 JSP内置对象 第4章学习了页面组成元素和使用方法。本章学习JSP内置对象的使用。使用JSP内置对象,可以方便操作页面,访问页面环境,实现页面内、页面间、页面与环境之间的通讯。 学习目标 熟悉主要内置对象的概念 理解主要内置对象的作用域和生命期 理解主要内置对象的作用和关系 熟悉主要内置对象的使用方法.
基于JSP搭建Web应用程序.
第五章 字符串.
視窗程式設計 2. 視窗版面配置 Chih Hung Wang Reference:
第3章 JavaScript语言基础.
第二章 JAVA语言基础.
例外與檔案處理 例外處理 拋出例外 串流 Stream FileReader、FileWriter
輸入輸出 學習目標 瞭解串流與輸入輸出的關係 認識InputStream、OutputStream繼承架構
创意源自激情,技术成就梦想 畅翼创新俱乐部 2012年春俱乐部第三次技术培训 赵程.
Chin-Yi Tsai Java Chin-Yi Tsai
第7章 输入输出处理.
第3章 流与Java中的文件操作 孙焘.
JAVA 网络编程基础.
Hello World 體驗實作第一個JSP程式.
第四章 網頁表單與資料傳遞.
2.1 基本資料型別 2.2 變數 2.3 運算式與運算子 2.4 輸出與輸入資料 2.5 資料型別轉換 2.6 實例
第5章 面向对象程序设计 本章要点 5.1 面向对象程序设计概述 5.2 Java语言的面向对象程序设计 5.3 方法的使用和对象数组
API设计实例分析 通用IO API.
Java语言程序设计 清华大学出版社 第9章 网络通信.
数据库操作示例 import java.sql.*; //导入java.sql包 public class JDBCDemo {
专题4:JSP脚本和指令.
Java 第28讲:建立删除文件 主讲教师:李焱 讲师.
JSP自定义标签技术的分析与应用 ----Custom Tag 的分析与应用
2018/11/20 第一章 Java概述 武汉大学计算机学院计算机应用系 2018/11/20 14:33.
副程式概念與 檔案存取 函式與傳值 重構觀念 串流資料 檔案資料存取.
Multithread 多執行緒 I/O Lecturer:楊昌樺.
JAVA 程式設計與資料結構 第六章 輸出與輸入.
第十三章 文件和注册表操作.
電子商務網站建制技術與實習(II) 助教:江宜政 吳昇洋.
JAVA 编 程 技 术 主编 贾振华 2010年1月.
程式設計實作.
第四章 基本輸出入 Java應用程式的輸出入介面有三種,分別是命令提示字元視窗、AWT元件、及Swing元件。本單元先介紹命令提示字元視窗,AWT請看第16、17章,Swing請看第20章。 輸入 輸出.
抽象类 File类 String类 StringBuffer类
Java程序设计 第18章 二进制I/O.
西南科技大学网络教育系列课程 高级语程序设计(Java) 第九章 输入/输出流.
第六讲 JSP中的文件操作(2) 教学目的 本讲继续讲述JSP中使用Java输入、输出流实现文件的读写操作 。 1 文件上传 2 文件下载
第10章 儲存偏好設定、檔案與資料庫 10-1 存取偏好設定 10-2 檔案存取 10-3 關聯式資料庫與SQLite
第七章 输入/输出 标准输入输出 流式I/O基础 文件 随机存取文件 对象输入/输出流.
第12章 JSP的檔案與電子郵件處理 12-1 伺服端的檔案處理 12-2 伺服端檔案的讀取與寫入 12-3 客戶端的檔案上傳
PHP 程式流程控制結構.
王豐緒 銘傳大學資訊工程學系 問題:JAVA 物件檔輸出入.
例外處理與 物件序列化(Exception Handling and Serialization of Objects)
第 十二 章 C# 中的文件处理.
异常及处理.
4.2通讯服务模块线程之间传递信息 信息工程系 向模军 Tel: QQ:
第一章 JSP概述 study-thinking-action.
Java语言程序设计 清华大学出版社 第8章 输入输出流(1).
第3章 Java語法的JSP程式 3-1 Java語言的基礎 3-2 JSP程式的基本架構 3-3 Java的變數與資料型態
第二章Java基本程序设计.
Ch09 在網頁之間傳遞資訊 網頁程式設計.
Ch17 SharedPreference與檔案應用
2019/5/3 JAVA Socket(UDP).
第二章 Java语法基础.
第6章 PHP的数据采集.
第二章 Java基本语法 讲师:复凡.
PHP程式設計 五、程式流程控制結構 建國科技大學 資訊管理學系 饒瑞佶.
助教:廖啟盛 JAVA Socket(UDP) 助教:廖啟盛
第2章 Java语言基础.
HTML表单 JSP借由标签所构成的表单区块中,取得用户在其中特定字段输入的数据內容 。 JSP 动态网页新技术.
9 输入输出及文件操作.
表单页面 表单是用户利用浏览器对Web站点网络数据库进行查询的一种界面,用户利用表单可以输入信息或选择选项等,然后将这些信息提交给服务器进行处理。通过表单,既可以将浏览器的信息发送到Internet服务器上,同时表单也可以使用户与站点的浏览者交互或从浏览者那里收集信息。它是网页的设计者和使用者相互交流的工具。表单对象包括文本域(单行、多行、密码)、列表、菜单、复选框、单选框、按钮等。
第四章 jsp语法 4.1 jsp页面的基本结构 一个jsp页面可由五种元素组合而成: 普通的html标记符
Presentation transcript:

第五讲 JSP中的文件操作(1) 教学目的 本讲主要讲述JSP中使用Java输入、输出流实现文件的读写 操作 。 知识要点 1 Flie 对象 2 字节输入、输出流对象 3 字符输入、输出流对象 4 随机文件流

第五讲 JSP中的文件操作(1) 有时服务器需要将客户提交的信息保存到文件或根据客户的要求将服务器上的文件的内容显示到客户端。JSP通过Java的输入输出流来实现文件的读写操作。

5.1 File 类 File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件读写权限等,不涉及对文件的读写操作。 创建一个File对象的构造方法有3个: File(String filename); File(String directoryPath,String filename); File(File f, String filename); 其中,filename是文件名字,directoryPath是文件的路径,f是指定成一个目录的文件。 使用File(String filename)创建文件时,该文件被认为是与当前应用程序在同一目录中,由于JSP引擎是在bin下启动执行的,所以该文件被认为在下列目录中: D:\Tomcat\jakarta-tomcat-4.0\bin\ 。

5.1.1 获取文件的属性 经常使用File类的下列方法获取文件本身的一些信息: 5.1.1 获取文件的属性 经常使用File类的下列方法获取文件本身的一些信息: 1. public String getName(): 获取文件的名字。 2. public boolean canRead(): 判断文件是否是可读的。 3. public boolean canWrite(): 判断文件是否可被写入。 4. public boolean exits(): 判断文件是否存在。 5. public long length(): 获取文件的长度(单位是字节)。 6. public String getAbsolutePath():获取文件的绝对路径。 7. public String getParent(): 获取文件的父目录。 8. public boolean isFile(): 判断文件是否是一个正常文件,而不是目录. 9. public boolean isDirectroy(): 判断文件是否是一个目录。 10. public boolean isHidden(): 判断文件是否是隐藏文件。 11. public long lastModified(): 获取文件最后修改的时间(时间是从1970年午夜至文件最后修改时刻的毫秒数)。

在下面的例子1中,我们使用上述的一些方法,获取某些文件的信息。 Example5_1.jsp <%@ page contentType="text/html;charset=GB2312" %> <%@ page import="java.io.*"%> <HTML> <BODY bgcolor=cyan><Font Size=1> <%File f1=new File("D:\\Tomcat\\jakarta-tomcat-4.0\\webapps\\root","Example5_1.jsp"); File f2=new File("jasper.sh"); %> <P> 文件 Example5-1. jsp是可读的吗? <%=f1.canRead()%> <BR> <P>文件Example5_1.jsp的长度: <%=f1.length()%>字节 <P> jasper.sh是目录吗? <%=f2.isDirectory()%> <P> Example5-1.jsp的父目录是: <%=f1.getParent()%> <P>jasper.sh的绝对路径是: <%=f2.getAbsolutePath()%> </Font> </BODY> </HTML>

5.1.2 创建目录 (1)创建目录 File对象调用方法:public boolean mkdir()创建一个目录,如果创建成功返回true,否则返回false(如果该目录已经存在将返回false)。 在下面的例子2中,我们在Root下创建一个名字是Students的目录. <%@ page contentType="text/html;charset=GB2312" %> <%@ page import="java.io.*"%> <HTML> <BODY><Font Size=2> <% File dir=new File("D:/Tomcat/jakarta-tomcat-4.0/webapps/root","Students"); %> <P> 在root下创建一个新的目录:Student,<BR>成功创建了吗? <%=dir.mkdir()%> <P> Student是目录吗? <%=dir.isDirectory()%> </Font> </BODY> </HTML> 例子2

如果File对象是一个目录,那么该对象可以调用下述方法列出该目录下的文件和子目录: (2)列出目录中的文件 如果File对象是一个目录,那么该对象可以调用下述方法列出该目录下的文件和子目录: public String[] list(): 用字符串形式返回目录下的全部文件, public File [] listFiles():用File对象形式返回目录下的全部文件。 在下面的例子3中,输出了Root下的全部文件中的5个和全部子目录。 例子3 <%@ page contentType="text/html;charset=GB2312" %> <%@ page import="java.io.*"%> <HTML> <BODY><Font Size=2>

<% File dir=new File("D:/Tomcat/jakarta-tomcat-4.0/webapps/root"); File file[]=dir.listFiles(); %> <P> 列出root下的5个长度大于1000字节的文件和全部目录: <BR>目录有: <% for(int i=0;i<file.length;i++) {if(file[i].isDirectory()) out.print("<BR>"+file[i].toString()); } <P> 5个长度大于1000 字节的文件名字: <% for(int i=0,number=0;(i<file.length)&&(number<=5);i++) {if(file[i].length()>=1000) {out.print("<BR>"+file[i].toString()); number++; </Font> </BODY> </HTML> 续前页:

5.1.3 删除文件和目录 File对象调用方法public boolean delete()可以删除当前对象代表的文件或目录,如果File对象表示的是一个目录,则该目录必须是一个空目录,删除成功返回true。 下面的例子4删除Root目录下的A.java文件和Students目录。

例子4 <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <HTML> <BODY> <%File f=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root/","A.java"); File dir=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root","Students"); boolean b1=f.delete(); boolean b2=dir.delete(); %> <P>文件A.java成功删除了吗? <%=b1%> <P>目录Students成功删除了吗? <%=b2%> </BODY> </HTML>

5.2 使用字节流读写文件 Java的I/O流提供一条通道程序,可以使用这条通道把源中的数据送给目的地。把输入流的指向称做源,程序从指向源的输入流中读取源中的数据。而输出流的指向是数据要去的一个目的地,程序通过向输出流中写入数据把信息传递到目的地,如下图5.1、5.2所示。java.io包提供大量的流类。所有字节输入流类都是InputStream(输入流)抽象类的子类,而所有字节输出流都是OutputStream(输出流)抽象类的子类。

源 输入流通过使用read()方法从输入流读出 来自源中的数据 图5.1 输入流示意图 目的地 输出流通过使用write()方法把数据写入输出流到达目的地 图5.2输出流示意图

InputStream类的常用方法: int read(): 输入流调用该方法从源中读取单个字节的数据,该方法返 回字节值(0~255之间的一个整数),如果未读出字节就返回-1。 int read(byte b[]): 输入流调用该方法从源中试图读取b.length个字节到 b中,返回实际读取的字节数目。如果到达文件的末尾,则返回-1。 int read(byte b[], int off, int len): 输入流调用该方法从源中试图读取 len个字节到b中,并返回实际读取的字节数目。如果到达文件的末尾, 则返回-1,参数off指定从字节数组的某个位置开始存放读取的数据。 void close(): 输入流调用该方法关闭输入流。 long skip(long numBytes): 输入流调用该方法跳过numBytes个字节,并 返回实际跳过的字节数目。

OutputStream类的常用方法: void write(int n): 输出流调用该方法向输出流写入单个字节。 void write(byte b[]): 输出流调用该方法向输出流写入一个字节数组。 void write(byte b[],int off,int len): 从给定字节数组中起始于偏移量off处 取len个字节写到输出流。 void close(): 关闭输出流。

5.2.1 FileInputStream 和FileOutputStream类 FileInputStream该类是从InputStream中派生出来的简单输入类。该类的所有方法都是从InputStream类继承来的。为了创建FileInputStream类的对象,用户可以调用它的构造方法。下面显示了两个构造方法: FileInputStream(String name); FileInputStream(File file); 第一个构造方法使用给定的文件名name创建一个FileInputStream对象,第二个构造方法使用File对象创建FileInputStream对象。参数name和file指定的文件称做输入流的源,输入流通过调用read方法读出源中的数据。 FileInpuStream文件输入流打开一个到达文件的输入流(源就是这个文件,输入流指向这个文件)例如,为了读取一个名为myfile.dat的文件,建立一个文件输入流对象,如下所示: try {FileInputStream ins = new FileInputStream("myfile.dat"); } catch (IOException e ) { //文件I/O错误 System.out.println("File read error: " +e );

与FileInputStream类相对应的类是FileOutputStream类。FileOutputStream提供了基本的文件写入能力。除了从FileOutputStream类继承来的方法以外,FileOutputStream类还有两个常用的构造方法,这两个构造方法如下所示: FileOutputStream(String name); FileOutputStream(File file);

5.2.2 BufferedInputStream和BufferedOutputStream类 为了提高读写的效率,FileInputStream流经常和BufferedInputStream流配合使用,FileOutputStream流经常和BufferedOutputStream流配合使用。 BufferedInputStream的一个常用的构造方法是: BufferedInputStream(InputStream in); 该构造方法创建缓存输入流,该输入流的指向是一个输入流。当我们要读取一个文件,比如A.txt时,可以先建立一个指向该文件的文件输入流: FileInputStream in=new FileInputStream(“A.txt”); 然后再创建一个指向文件输入流in的输入缓存流(就好象把两个输入水管接在一起): BufferedInputStream buffer=new BufferedInputStream(in);

这时,我们就可以让buffer调用read方法读取文件的内容,buffer在读取文件的过程中,会进行缓存处理,增加读取的效率。 同样,当要向一个文件,比如B.txt,写入字节时,可以先建立一个指向该文件的文件输出流: FileOutputStream out=new FileOutputStream(“B.txt”); 然后再创建一个指向输出流out的输出缓存流: BufferedOutputStream buffer=new BufferedOutputStream(out); 这时,buffer调用write方法向文件写入内容时会进行缓存处理,增加写入的效率。需要注意的是,写入完毕后,须调用flush方法将缓存中的数据存入文件。

在下面的例子5中,服务器将若干内容写入一个文件,然后读取这个文件,并将文件的内容显示给客户。 <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <HTML> <BODY bgcolor=cyan><FONT size=1> <%File dir=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root","Students"); dir.mkdir(); File f=new File(dir,"hello.txt");

try{ FileOutputStream outfile=new FileOutputStream(f); 续前页: BufferedOutputStream bufferout=new BufferedOutputStream(outfile); byte b[]="你们好,很高兴认识你们呀!<BR>nice to meet you".getBytes(); bufferout.write(b); bufferout.flush(); bufferout.close(); outfile.close(); FileInputStream in=new FileInputStream(f); BufferedInputStream bufferin=new BufferedInputStream(in); byte c[]=new byte[90]; int n=0; while((n=bufferin.read(c))!=-1) { String temp=new String(c,0,n); out.print(temp); } bufferin.close(); in.close(); catch(IOException e) { %> </BODY> </HTML> 续前页:

5.3 使用字符流读写文件 上面我们学习了使用字节流读写文件,字节流不能直接操作Unicode字符,所以Java提供了字符流,由于汉字在文件中占用2个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象,在Unicode字符中,一个汉字被看作一个字符。 所有字符输入流类都是Reader(输入流)抽象类的子类,而所有字符输出流都是Writer(输出流) 抽象类的子类。

Reader类中常用方法: int read(): 输入流调用该方法从源中读取一个字符,该方法返回一个整数(0~65535之间的一个整数,Unicode字符值),如果未读出字符就返回-1。 int read(char b[]): 输入流调用该方法从源中读取b.length个字符到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。 int read(char b[], int off, int len): 输入流调用该方法从源中读取len个字符并存放到字符数组b中,返回实际读取的字符数目。如果到达文件的末尾,则返回-1。其中,off 参数指定read方法从符数组b中的什么地方存放数据。 void close(): 输入流调用该方法关闭输入流。 long skip(long numBytes): 输入流调用该方法跳过numBytes个字符,并返回实际跳过的字符数目。

Writer类中 常用方法: void write(int n): 向输入流写入一个字符。 void write(char b[]): 向输入流写入一个字符数组。 void write(char b[],int off,int length): 从给定字符数组中起始于偏移量off处取len个字符写到输出流。 void close(): 关闭输出流。

5.3.1 FileReader 和FileWriter类 FileReader该类是从Reader中派生出来的简单输入类。该类的所有方法都是从Reader类继承来的。为了创建FileReader类的对象,用户可以调用它的构造方法。下面显示了两个构造方法: FileReader(String name); FileReader (File file) ; 与FileReader类相对应的类是FileWriter类。FileWriter提供了基本的文件写入能力。除了从FileWriter类继承来的方法以外,FileWriter类还有两个常用的构造方法,这两个构造方法如下所示: FileWriter(String name); FileWriter (File file);

5.3.2 BufferedReader和BufferedWriter类 为了提高读写的效率,FileReader流经常和BufferedReader流配合使用;FileWriter流经常和BufferedWriter流配合使用。BufferedReader流还可以使用方法String readLine()读取一行;BufferedWriter流还可以使用方法void write(String s,int off,int length)将字符串s的一部分写入文件,使用newLine()向文件写入一个行分隔符。 在下面的例子6中,服务器将若干内容写入一个文件,然后读取这个文件,并将文件的内容显示给客户。 例子6 <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <HTML> <BODY> <% File dir=new File("d:/Tomcat/Jakarta-tomcat-4.0/webapps/root","Students");

dir.mkdir(); File f=new File(dir,"apple.txt"); try{FileWriter outfile=new FileWriter(f); BufferedWriter bufferout=new BufferedWriter(outfile); bufferout.write("你好:"); bufferout.newLine(); bufferout.write("好久不见了,近来在忙什么呢?"); bufferout.write("欢迎来玩"); bufferout.write("2002年8月8日"); bufferout.flush(); bufferout.close(); outfile.close(); FileReader in=new FileReader(f); BufferedReader bufferin=new BufferedReader(in); String str=null; while((str=bufferin.readLine())!=null) {out.print("<BR>"+str); } 续前页:

bufferin.close(); in.close(); } catch(IOException e) { %> 续前页: bufferin.close(); in.close(); } catch(IOException e) { %> </BODY> </HTML>

5.4 RandomAccessFile类 前面我们学习了用来处理文件的几个文件输入流、文件输出流,而且通过一些例子,已经了解了那些流的功能。 RandomAccessFile类创建的流与前面的输入、输出流不同,RandomAccessFile类既不是输入流类InputStream类的子类,也不是输出流类OutputStram类的子类流。习惯上,仍然称RandomAccessFile类创建的对象为一个流,RandomAccessFile流的指向既可以作为源也可以作为目的地,换句话说,当我们想对一个文件进行读写操作时,我们可以创建一个指向该文件的RandomAccessFile流即可,这样我们既可以从这个流中读取这个文件的数据,也通过这个流写入数据给这个文件。

RandomAccessFile类的两个构造方法: RandomAccessFile(String name,String mode):参数name用来确定一个文件名,给出创建的流的源(也是流目的地),参数mode取“r”(只读)或“rw”(可读写),决定创建的流对文件的访问权利。 RandomAccessFile(File file,String mode): 参数file是一个File对象,给出创建的流的源(也是流目的地),参数mode取“r”(只读)或“rw”(可读写),决定创建的流对文件的访问权利。创建对象时应捕获FileNotFoundException异常,当流进行读写操作时,应捕获IOException异常。

表5.1 RandomAccessFile类的常用方法 RandomAccessFile类中有一个方法seek(long a),用来移动RandomAccessFile流指向的文件的指针,其中参数 a 确定文件指针距离文件开头的字节位置。另外流还可以调用getFilePointer()方法获取当前文件的指针的位置(RandomAccessFile类的一些方法见下表),RandomAccessFile流对文件的读写比顺序读写的文件输入输出流更为灵活。 表5.1 RandomAccessFile类的常用方法

下面的例子实现网上小说创作,每个客户都可以参与一部小说的写作,也就是说一个客户需接着前一个客户的写作内容继续写作。在服务器的某个目录下有4部小说,小说的内容完全由客户来决定。客户首先在Example5_7.jsp页面选择一部小说的名字,然后连接到continueWrite.jsp页面,该页面显示小说的已有内容,客户可以在该页面输入续写的内容,再提交给continue.jsp页面,该页面负责将续写的内容存入文件,并通知客户续写是否成功,如果其他用户正在保存续写的内容到该小说,就通知该客户等待。

图5.4 编辑、提交续写的内容 容 图5.3 选择续写的小说 图5.5 续写内容成功提示

例子7(效果如图5.3、5.4、5.5所示) Example5_7.jsp: <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <HTML> <BODY bgcolor=cyan><Font size=1> <% String str=response.encodeURL("continueWrite.jsp"); %> <P>选择您想续写小说的名字:<BR> <FORM action="<%=str%>" method=post name=form> <BR><INPUT type="radio" name="R" value="spring.doc" >美丽的故事 <BR><INPUT type="radio" name="R" value="summer.doc" >火热的夏天 <BR><INPUT type="radio" name="R" value="autumn.doc" >秋天的收获 <BR><INPUT type="radio" name="R" value="winter.doc" >冬天的大雪 <BR> <INPUT type=submit name ="g" value="提交"> </FORM> </BODY> </HTML>

continueWrite.jsp: <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <HTML> <BODY bgcolor=cyan><Font size=1> <P>小说已有内容: <Font size=1 Color=Navy> <%String str=response.encodeURL("continue.jsp"); %> <%--获取客户提交的小说的名字--%> <%String name=(String)request.getParameter("R"); if(name==null) {name=""; } byte c[]=name.getBytes("ISO-8859-1"); name=new String(c); session.setAttribute("name",name); File storyFileDir=new File("F:/2000","story"); storyFileDir.mkdir(); File f=new File(storyFileDir,name); //列出小说的内容:

try{ RandomAccessFile file= new RandomAccessFile(f,"r"); String temp=null; while((temp=file.readUTF())!=null) { byte d[]=temp.getBytes("ISO-8859-1"); temp=new String(d); out.print("<BR>"+temp); } file.close(); catch(IOException e){} %> </Font> <P>请输入续写的新内容: <Form action="<%=str%>" method=post name=form> <TEXTAREA name="messages" ROWs="12" COLS=80 WRAP="physical"> </TEXTAREA> <BR> <INPUT type="submit" value="提交信息" name="submit"> </FORM> 续前页:

continue.jsp: <%@ page contentType="text/html;charset=GB2312" %> <%@ page import ="java.io.*" %> <%@ page import ="java.util.*" %> <HTML> <BODY> <%! //声明一个需同步处理的文件: File f=null; String use="yes"; %> <%--获取客户提交的小说的名字--%> <% String name=(String)session.getAttribute("name"); byte c[]=name.getBytes("ISO-8859-1"); name=new String(c); //获取客户续写的内容: String content=(String)request.getParameter("messages"); if(content==null) {content=" "; } <%File storyFileDir=new File("F:/2000","story"); storyFileDir.mkdir(); f=new File(storyFileDir,name);

//把对文件的操作放入一个同步块中,并通知 //其它用户该文件正在被操作中: if(use.startsWith("yes")) { synchronized(f) { use="beisusing"; try{ RandomAccessFile file=new RandomAccessFile(f,"rw"); file.seek(file.length()); //定位到文件的末尾。 file.writeUTF(content); file.close(); use="yes"; out.print("<BR>"+"内容已经写入"); } catch(IOException e){} //如果该小说正在被续写,就通知客户等待: else {out.print("该小说正在被续写,请等待"); %> </BODY> </HTML> 续前页: