jsp第五课-jsp中的文件操作

时间:2023-01-30 22:19:22
JSP通过Java的输入/输出流来实现文件的读写操作。本章采用JSP+JavaBean的设计模式来学习文件的操作,即将有关文件的读写指派给bean. 


1.File 类 
 File类的对象主要用来获取文件本身的一些信息,例如文件所在的目录、文件的长度、文件读写权限等,不涉及对文件的读写操作。   
 public String getName() ——获取文件的名字。
 public boolean canRead() ——判断文件是否是可读的。
 public boolean canWrite() ——判断文件是否可被写入。
 public boolean exists() ——判断文件是否存在。
 public long length() ——获取文件的长度(单位是字节)。
 public String getAbsolutePath() ——获取文件的绝对路径。
 public String getParent() ——获取文件的父目录。
 public boolean isFile() ——判断文件是否是一个正常文件,而不是目录。


2.创建与删除Web服务目录 
 public boolean mkdir() ——创建一个目录,如果创建成功返回true,否则返回false(如果该目录已经存在将返回false)。
  public boolean delete() ——可以删除当前File对象代表的文件或目录,如果File对象表示的是一个目录,则该目录必须是一个空目录,删除成功返回true。 


3.读写文件
java.io包提供大量的流类,所有字节输入流类都是InputStream(输入流)抽象类的子类,而所有字节输出流都是OutputStream(输出流)抽象类的子类。字节流不能直接操作Unicode字符,所以Java提供了字符流。由于汉字在文件中占用2个字节,如果使用字节流,读取不当会出现乱码现象,采用字符流就可以避免这个现象。在Unicode字符中,一个汉字被看做一个字符。所有字符输入流类都是Reader(输入流)抽象类的子类,而所有字符输出流都是Writer(输出流)抽象类的子类。 


4.文件上传
JSP页面提供File类型的表单,File类型的表单可以让用户选择要上传的文件。File类型表单的格式如下:
<FORM action= "接受上传文件的页面" method= "post"  enctype=" multipart/form-data"
<Input type= "File"  name= "参数名字"  >
</FORM>
bean负责将用户选择的文件上传到服务器。bean可以让内置对象request调用方法getInputStream()获得一个输入流,通过这个输入流读入客户上传的全部信息,包括文件的内容以及表单域的信息。bean可以从上传的全部信息中分离出文件的内容,并保存在服务器端。 




5.文件下载 
Tomcat 5.5服务器提供了方便的下载功能。只需让内置对象response调用方法
response.setHeader("Content-disposition","attachment;filename="下载的文件名字"); 


添加下载的头给客户的浏览器即可. 




例子1
FileDir.java
package user.file;
import java.io.*;
public class FileDir 
{ String newWebDirName,oldWebDirName;
  StringBuffer allFiles;
  public FileDir()
  {  allFiles=new StringBuffer();
  }
  public void setNewWebDirName(String s)
  {  newWebDirName=s;
     if(newWebDirName!=null)
     {  File dir=new File("d:\\apache-tomcat-5.5.20\\webApps",newWebDirName);
        dir.mkdir(); 
     }
  }
  public String getNewWebDirName()
  {  return newWebDirName; 
  }
  public void setOldWebDirName(String s)
  {  oldWebDirName=s;
  }
  public String getOldWebDirName()
  {  return oldWebDirName; 
  } 
  public StringBuffer getAllFiles()
  {   if(oldWebDirName!=null)
      {  File dir=new File("d:\\apache-tomcat-5.5.20\\webApps",oldWebDirName);
         File a[]=dir.listFiles();
         for(int k=0;k<a.length;k++)
         {  if(a[k].isDirectory())
             allFiles.append("<BR>子目录:"+a[k].getName());
         }
        for(int k=0;k<a.length;k++)
         {  if(a[k].isFile())
             allFiles.append("<BR>文件:"+a[k].getName());
         }
       }
      return allFiles; 
  }
}

fileAndDir.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="user.file.FileDir" %> 
<HTML><BODY bgcolor=cyan><Font Size=2>
<jsp:useBean id="dir" class="user.file.FileDir" scope="page" />
<jsp:setProperty name= "dir" property="newWebDirName" param="newWebDirName" />
<jsp:setProperty name= "dir" property="oldWebDirName" param="oldWebDirName" />
<FORM action="" Method="post" >
  输入新的Web服务目录的名字:<Input type=text name="newWebDirName" value="Dalian" >
 <BR>输入已有的Web服务目录的名字:<Input type=text name="oldWebDirName" value="ch4" >
 <Input type=submit value="提交">
</FORM>
 新创建的Web服务目录:<jsp:getProperty name="dir"  property="newWebDirName"/>
<BR>已有的Web服务目录 <jsp:getProperty name="dir"  property="oldWebDirName"/>
     下的子目录和文件:
     <jsp:getProperty name="dir"  property="allFiles"/>
</Font> </BODY></HTML>
例子2
ReadFile.java
package user.file;
import java.io.*;
public class ReadFile
{ String fileDir="c:/",fileName="";
 String listFile,readContent;  
  public void setFileDir(String s)
  {   fileDir=s;
  }
 public String getFileDir()
  {   return fileDir;
  }
 public void setFileName(String s) 
  {   fileName=s;
  }
 public String getFileName()
  {   return fileName;
  }
 public String getListFile()       
 {  File dir=new File(fileDir);
    File file_name[]=dir.listFiles();
    StringBuffer list=new  StringBuffer();
    for(int i=0;i<file_name.length;i++)
     { if ((file_name[i]!=null)&&(file_name[i].isFile()))
         { String temp=file_name[i].toString();
           int n=temp.lastIndexOf("\\");
           temp=temp.substring(n+1);
           list.append(" "+temp); 
         }
     }
    listFile=new String(list);
    return listFile;
 }  
 public String getReadContent()   //读取文件
  { try{  File file=new File(fileDir,fileName);
          FileReader in=new FileReader(file) ;
          BufferedReader inTwo=new BufferedReader(in);
          StringBuffer stringbuffer=new StringBuffer(); 
          String s=null;
          while ((s=inTwo.readLine())!=null) 
           {  byte bb[]=s.getBytes();
              s=new String(bb);
              stringbuffer.append("\n"+s);
           }
          String temp=new String(stringbuffer);
          readContent="<TextArea rows=10 cols=62>"+temp+"</TextArea>";
       }
    catch(IOException e)
      {  readContent="<TextArea rows=8 cols=62></TextArea>"; 
        
      } 
    return readContent;
  }
}
selectDir.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<HTML><BODY bgcolor=cyan><Font size=3>
<P>请选择一个目录:
<FORM action="listfile.jsp" method=post>
    <Select name="fileDir" >
         <Option value="D:/2000"> D:/2000
         <Option value="D:/apache-tomcat-5.5.20/webapps/ch2">Web服务目录ch2
         <Option value="D:/apache-tomcat-5.5.20/webapps/ch5">Web服务目录ch5
      </Select>   
<Input type=submit value="提交">
</FORM>
</FONT></BODY></HTML>
listfile.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="user.file.ReadFile" %> 
<HTML><BODY bgcolor=cyan><Font size=2>
<jsp:useBean id="file" class="user.file.ReadFile" scope="session" />
<jsp:setProperty  name="file" property="fileDir" param="fileDir" />
<P>该目录 <jsp:getProperty name="file" property="fileDir"/>
  有如下文件:<BR> 
 <jsp:getProperty  name="file" property="listFile"  />
<FORM action="" method=post name=form1>
 输入一个文件名字:<input type=text name="fileName">  
 <Input type=submit value="提交">
</FORM>
 <jsp:setProperty  name= "file"  property="fileName" param="fileName" />
   文件:<jsp:getProperty  name= "file"  property="fileName"/>
   内容如下:<BR>
 <jsp:getProperty  name= "file"  property="readContent"  /> 
<BR>   
 <A href="selectDir.jsp">重新选择目录</A>
</Body></HTML></HTML>
例子3
WriterFile.java
package user.file;
import java.io.*;
public class WriterFile
{ String  filePath=null,
         fileName=null,
         fileContent=null;
 boolean success;
 public void setFilePath(String s)
  {  filePath=s;
     try{  File path=new File(filePath);
           path.mkdir();
        }
     catch(Exception e){}   
  }
 public String getFilePath()
  {  return filePath;
  }
 public void setFileName(String s)
  {  fileName=s;
  }
 public String getFileName()
  {  return fileName;
  }
 public void setFileContent(String s)
  { fileContent=s;
    byte content[]=fileContent.getBytes();
    try{ File file=new File(filePath,fileName);
         FileOutputStream in=new FileOutputStream(file) ;
         in.write(content,0,content.length);
         in.close();
         success=true;
      }
   catch(Exception e)
     {  success=false;
     }   
  }
 public boolean isSuccess()
  {  return success;
  }
}
writefile.jsp
<%@ page contentType="text/html;Charset=GB2312" %>
<%@ page import="user.file.WriterFile" %> 
<jsp:useBean id="ok" class="user.file.WriterFile" scope="page" />
<jsp:setProperty name="ok" property="filePath" param="filePath" />
<jsp:setProperty name="ok" property="fileName" param="fileName" />
<jsp:setProperty name="ok" property="fileContent" param="fileContent" />
<HTML><BODY ><Font size=2>
<FORM action="" method=post>
  请选择一个目录:<Select name="filePath" >
                    <Option value="C:/hello88"> C:/hello88
                    <Option value="D:/ok88">D:/ok88
                    <Option value="F:/myjsp">F:/myjspbook
                    <Option value="E:/javabook">E:/javabook
                  </Select> 
<BR>输入保存文件的名字:<Input type=text name="fileName" >
<BR>输入文件的内容:<BR>
  <TextArea name="fileContent" Rows="10" Cols="40"></TextArea>
<BR><Input type=submit value="提交">
</FORM>
<% if(ok.isSuccess()==true)
  {
%>  你写文件成功,文件所在目录:
   <jsp:getProperty name="ok" property="filePath" />
   <BR>文件名字:
   <jsp:getProperty name="ok" property="fileName"/> 
<%
  }
%>
</FONT></BODY></HTML>
例子4
UpFile.java
package user.file;
import java.io.*;
import javax.servlet.http.*;
public class UpFile
{   HttpServletRequest request;
   HttpSession session;
   String upFileMessage="";
   public void setRequest(HttpServletRequest request)
   {  this.request=request;
   }
   public void setSession(HttpSession session)
   {  this.session=session;
   }
   public String getUpFileMessage()
   {  String fileName=null;
      try{  String tempFileName=(String)session.getId();//客户的session的id
           File f1=new File("D:/apache-tomcat-5.5.20/webapps/ch5",tempFileName);
           FileOutputStream o=new FileOutputStream(f1);
           InputStream in=request.getInputStream();
           byte b[]=new byte[10000];
           int n;
           while( (n=in.read(b))!=-1)  //将客户上传的全部信息存入f1
             {   o.write(b,0,n);  
             }
           o.close();
           in.close();
           RandomAccessFile random=new RandomAccessFile(f1,"r");
           int second=1;   //读出f1的第2行,析取出上传文件的名字:
           String secondLine=null;
           while(second<=2)  
              { secondLine=random.readLine();
                second++;
              }
           //获取第2行中目录符号'\'最后出现的位置
            int position=secondLine.lastIndexOf('\\');
          //客户上传的文件的名字是:
           fileName=secondLine.substring(position+1,secondLine.length()-1);
           byte  cc[]=fileName.getBytes("ISO-8859-1");
           fileName=new String(cc);
           session.setAttribute("Name",fileName);//供show.jsp页面使用
           random.seek(0); //再定位到文件f1的开头。
           //获取第4行回车符号的位置: 
           long  forthEndPosition=0;
           int forth=1;
           while((n=random.readByte())!=-1&&(forth<=4))  
              {  if(n=='\n')
                   {  forthEndPosition=random.getFilePointer();
                     forth++;
                   }
               }
           //根据客户上传文件的名字,将该文件存入磁盘:
           File f2= new File("D:/apache-tomcat-5.5.20/webapps/ch5",fileName); 
           RandomAccessFile random2=new RandomAccessFile(f2,"rw"); 
            //确定出文件f1中包含客户上传的文件的内容的最后位置,即倒数第6行。
           random.seek(random.length());
           long endPosition=random.getFilePointer();
           long mark=endPosition;
           int j=1;
           while((mark>=0)&&(j<=6))  
            {   mark--;
                random.seek(mark);
                n=random.readByte();
                if(n=='\n')
                {    endPosition=random.getFilePointer();
                     j++;
               }
            }
         //将random流指向文件f1的第4行结束的位置:
         random.seek(forthEndPosition);
         long startPoint=random.getFilePointer();
        //从f1读出客户上传的文件存入f2(读取第4行结束位置至倒数第6行之间的内容)
         while(startPoint<endPosition-1)
           { n=random.readByte();
             random2.write(n); 
             startPoint=random.getFilePointer();
           }
         random2.close();
         random.close();
         f1.delete(); //删除临时文件
         upFileMessage=fileName+" Successfully UpLoad";
         return upFileMessage;
      }
   catch(Exception exp)
     {   if(fileName!=null)
          {  upFileMessage=fileName+" Fail to UpLoad";
             return upFileMessage;
          }
         else
          {  upFileMessage="";
             return upFileMessage;
          }
     }
  }
}
upfile.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="user.file.UpFile" %> 
<jsp:useBean id="upFile" class="user.file.UpFile" scope="session" />
<HTML><BODY> <P>选择要上传的文件:<BR>
  <FORM action="" method="post" ENCTYPE="multipart/form-data">
     <INPUT type=FILE name="boy" size="45"> 
     <BR> <INPUT type="submit" name ="g" value="提交">
  </FORM>
  <%  upFile.setRequest(request);
      upFile.setSession(session);
  %>
 <jsp:getProperty  name="upFile" property="upFileMessage"/>
 <P>如果上传的是图像文件,可单击超链接查看图像:
 <BR><A href="show.jsp">查看图像</A>
</BODY></HTML>
show.jsp
<%@ page contentType="text/html;Charset=GB2312" %>
<jsp:useBean id="upFile" class="user.file.UpFile" scope="session" />
<HTML><BODY>
<%  String pic=(String)session.getAttribute("Name");
    out.print(pic);
    out.print("<img src="+pic+" width=200 height=200></img>");
%>
</BODY></HTML>
例子5
DownLoadFile.java
package user.file;
import java.io.*;
import javax.servlet.http.*;
public class DownLoadFile
{   HttpServletResponse response;
   String fileName;
   public void setResponse(HttpServletResponse response) 
   { this.response=response;
   } 
  public String getFileName()
   {  return fileName;
   }
   public void setFileName(String s)
   {  fileName=s;
      File fileLoad=new File("f:/2000",fileName);
     //客户使用下载文件的对话框:
      response.setHeader("Content-disposition","attachment;filename="+fileName); 
   } 
}
downfile.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="user.file.DownLoadFile" %> 
<%@ page import="java.io.*" %> 
<jsp:useBean id="downFile" class="user.file.DownLoadFile" scope="page" />
<HTML><BODY> <P>选择要下载的文件:
<Form action="">
   <Select name="fileName" >
      <Option value="book.zip">book.zip
      <Option value="A.java">A.java
      <Option value="B.jsp">B.jsp
   </Select> 
      <INPUT TYPE="submit" value="提交你的选择" name="submit">
</Form>
 <%  downFile.setResponse(response); 
 %>
<jsp:setProperty  name="downFile" property="fileName" param="fileName"/>
</Body></HTML>
例子6
ReadByRow.java
package user.file;
import java.io.*;
public class ReadByRow
{   FileReader inOne;
   BufferedReader inTwo;
   String fileName;
   StringBuffer readMessage;
   int rows=0;
   public ReadByRow()
   { readMessage=new StringBuffer();
   }
   public void setFileName(String s)
   {  fileName=s;
      readMessage=new StringBuffer();
      rows=0;
      File f=new File("D:/2000",fileName);
      try{  inOne=new FileReader(f); 
            inTwo=new BufferedReader(inOne);
         }
      catch(IOException exp){} 
   }
  public String getFileName()
  {  return fileName;
  }
  public void setRows(int n)
  {  rows=n;
  }
  public int getRows()
  { return rows;
  }
  public StringBuffer getReadMessage()
  {  int i=1;
     try{  while(i<=rows)
           { String str=inTwo.readLine();
             if(str==null)
              {  inOne.close();
                 inTwo.close();
                 readMessage.append("文件读取完毕"); 
                 break;
              }  
             else
              { readMessage.append("\n"+str);
              } 
             i++;
           } 
        }
      catch(Exception exp){}
      return readMessage;
  }
}
selectfile.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="user.file.*" %> 
<jsp:useBean id="reader" class="user.file.ReadByRow" scope="session"/>
<HTML><BODY ><Font size=3>
<FORM action="readByRow.jsp" method=post>
    选择一个文件:
    <Select name="fileName" >
         <Option value="A.java"> A.java
         <Option value="Exa.java">Exa.java
         <Option value="B.jsp">B.jsp
    </Select>  
 <BR>输入每次读取的行数:<Input type=text name="rows" value="0" size=8>  
 <BR><Input type=submit value="提交">
</FORM>
</FONT></BODY></HTML>
readByRow.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="user.file.ReadByRow" %> 
<jsp:useBean id="reader" class="user.file.ReadByRow" scope="session"/>
<HTML><BODY ><Font size=3>
 <jsp:setProperty name="reader" property="fileName" param="fileName"/>
 <jsp:setProperty name="reader" property="rows" param="rows"/>
 正在读取的文件的名字: <jsp:getProperty name="reader" property="fileName"/> 
 <A href="selectfile.jsp">重新选择文件</A>
 <FORM action="" method=post>
    <Input type=submit value="读取">
 </FORM>
 <TextArea  Rows="8" Cols="46">
 <jsp:getProperty  name="reader" property="readMessage"/>
 </TextArea> 
</FONT></BODY></HTML>
例子7
Test.java
package user.file;
import java.io.*;
public class Test
{  String fileName="",      //存放考题文件名字的字符串
  correctAnswer="",       //存放正确答案的字符串
  testContent="",         //存放试题的字符串
  selection="" ;           //客户提交的答案的字符串
  int score=0;            //考试者的得分
  int giveAnswerCount=0;     //记录考试者提交答案的次数
  String name="",number="";     //考试者姓名、学号
  public void setFileName(String name)
  {   fileName=name;
      selection="" ;  
      score=0;
      giveAnswerCount=0;
  }
 public String getFileName()
  {   return fileName;
  }
 public void setGiveAnswerCount(int number)
  {  giveAnswerCount=number;
  }
 public int getGiveAnswerCount()
  { return giveAnswerCount;
  }
 public void setName(String s)
 {  name=s;
 }
 public void setNumber(String num)
 {  number=num;
 }
 public String getCorrectAnswer() //读取试题文件的第一行:标准答案
  {   try {  File f=new File("D:/2000",fileName);
             FileReader in=new FileReader(f);
             BufferedReader buffer=new BufferedReader(in); 
             correctAnswer=(buffer.readLine()).trim();//读取一行,去掉前后空格
             buffer.close();
             in.close();
          }
      catch(Exception e) {}
      if(giveAnswerCount==1)
       {   return correctAnswer;
       }
      else 
       return "你只有一次提交答案的机会,不允许2次提交答案";  
   }
 public String getTestContent()  //获取试题的内容
  {  StringBuffer temp=new StringBuffer();
     try { if(fileName.length()>0)
           {  File f=new File("D:/2000",fileName);
              FileReader in=new FileReader(f);
              BufferedReader buffer=new BufferedReader(in); 
              String str=buffer.readLine();        //该行不显示给用户
              while((str=buffer.readLine())!=null) //读出全部题目
              {   temp.append("\n"+str);
              }
              buffer.close();
              in.close();
            } 
          } 
         catch(Exception e){}
         return new String(temp);
  }
 public void setSelection(String s)
  {  selection=s.trim(); 
  }
 public String getSelection()
 {   return selection;
 }
 public int getScore()
 {  score=0;
    if(giveAnswerCount==1)
    { int length1=selection.length();
      int length2=correctAnswer.length();
      int min=(int)(Math.min(length1,length2)); 
      int i=0;
      while(i<min)
      { if(selection.charAt(i)==correctAnswer.charAt(i))
          score++;
        i++; 
      }
     WriteRecorder teacher=new WriteRecorder();
     teacher.write(name,number,score);
    }
    return score;
 }
}
class WriteRecorder
{   RandomAccessFile random; 
   File f=new File("成绩单.txt");
   WriteRecorder()
   { try{  random=new RandomAccessFile(f,"rw"); 
        } 
     catch(Exception ee){}  
   }
   public void write(String name,String number,int score)
   {  try{ random.seek(random.length()); 
           String mess=" Name:"+name+","+number+","+score;
           random.writeBytes(mess);
           random.close();
         } 
      catch(Exception ee){System.out.println(ee);}  
   }
}
test.jsp
<%@ page contentType="text/html;charset=GB2312" %>
<%@ page import="user.file.Test" %> 
<HTML><BODY ><Font size=2>
<jsp:useBean id="test" class="user.file.Test" scope="session"/>
<jsp:setProperty  name= "test"  property="name" param="name"/>
<jsp:setProperty  name= "test"  property="number" param="number"/>
<jsp:setProperty  name= "test"  property="fileName" param="fileName"/>
 <Form action="" method=post name=form1>
  输入姓名:<Input type=text name="name" size=10>
  输入学号:<Input type=text name="number" size=10>
  请选择试题:<Select name="fileName"  value="A.txt">
                <Option value="A.txt"> A.txt
                <Option value="B.txt"> B.txt
                <Option value="C.txt"> C.txt
              </Select> 
 <Input type="submit" name="sub" value="确定">
 </FORM>
 <TextArea  Rows="8" Cols="66">
    <jsp:getProperty  name= "test"  property="testContent"  />
 </TextArea> 
<jsp:setProperty name="test" property="giveAnswerCount" param="giveAnswerCount"/>
<FORM action="" method=post name=form2>
 在文本框输入全部题目的答案,答案之间不允许有空格:
 <BR><Input type=text name="selection" size=70> 
     <Input type="hidden" name="giveAnswerCount" 
            value="<%= test.getGiveAnswerCount()+1 %>"
     > 
 <BR><Input type=submit value="提交">
</FORM>
<jsp:setProperty  name= "test"  property="selection"  />
试题的正确答案:<jsp:getProperty name="test"  property="correctAnswer"/> 
<BR>您提交的答案:<jsp:getProperty name="test"  property="selection"/>
<BR>您的分数 <jsp:getProperty name="test"  property="score"  />
</Body></HTML>