在JSP开发过程中,经常会遇到需要把相关内容存储为文件的情况,在JSP中是输入输出流进行操作的,在Servlet中叶可以使用输入输出流实现对文件的读写,同时使用Servlet还可以很方便地实现文件的上传下载。

读取文件

代码:

[java]

package com.foxmail.xxy668;import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.IOException;import java.io.PrintWriter;import javax.servlet.ServletException;import javax.servlet.http.HttpServlet;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;public class FileRead extends HttpServlet {	@Override	protected void doGet(HttpServletRequest request, HttpServletResponse response)			throws ServletException, IOException {		response.setContentType("text/html");		response.setCharacterEncoding("gb2312");		PrintWriter out=response.getWriter();		String fileName="content.txt";		String realPath=request.getRealPath(fileName);		File file=new File(realPath);		if(file.exists()){			FileReader reader=new FileReader(file);			BufferedReader bufferedReader=new BufferedReader(reader);			String line =null;			while((line=bufferedReader.readLine())!=null)			{				out.print("<font size='2'>"+line+"</font><br>");;;			}		}else{			out.print("file is not exist!");		}	}	@Override	protected void doPost(HttpServletRequest req, HttpServletResponse resp)			throws ServletException, IOException {		doGet(req,resp);	}}



实现思路:

1、用文件的绝对路径构造出一个文件读取对象,如果文件存在则将进行文件的读取

2、为了提高文件读取的效率,提供了一个字符输入缓冲流类,这个类就是BufferedReader,一般情况下BufferedReader和FileReader结合使用,在上面的代码中使用一个FIleReader对象构造出一个BufferedReader对象。

3、通过BufferedReader类中的readerLine方法以及循环将BufferedReader对象的字符逐行读出,打印到页面中。

写入文件

代码:


[java]

1. package com.foxmail.xxy668;  
2.   
3. import java.io.BufferedWriter;  
4. import java.io.File;  
5. import java.io.FileWriter;  
6. import java.io.IOException;  
7. import java.io.PrintWriter;  
8.   
9. import javax.servlet.ServletException;  
10. import javax.servlet.http.HttpServlet;  
11. import javax.servlet.http.HttpServletRequest;  
12. import javax.servlet.http.HttpServletResponse;  
13.   
14. public class FileWrite extends HttpServlet {  
15.   
16.     @Override  
17.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
18.             throws ServletException, IOException {  
19.         response.setCharacterEncoding("gb2312");  
20.         PrintWriter out=response.getWriter();  
21.         String fileName="new.txt";  
22.         String realPath=request.getRealPath(fileName);  
23.         File file=new File(realPath);  
24.         FileWriter writer=new FileWriter(file);  
25.         BufferedWriter bufferedWriter=new BufferedWriter(writer);  
26.         bufferedWriter.write("computer internet");  
27.         bufferedWriter.newLine();  
28.         bufferedWriter.write("mathematics");  
29.         bufferedWriter.flush();  
30.         writer.close();  
31.         out.print("<font size='2'>"+file.getAbsolutePath()+"</font>");  
32.   
33.     }  
34.   
35.     @Override  
36.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
37.             throws ServletException, IOException {  
38.         doGet(request,response);  
39.     }  
40. }


实现思路:

1、和读取文件思路类似,首先用文件的路径构造一个文件对象(没有在硬盘上生成)

2、根据文件对象构造一个FileWriter文件爱你读取对象,同样为了提高文件爱你写操作效率,根据FileWriter对象构造一个BufferedWrite对象。

3、在BufferedWriter对象韩总写入字符串(在内存中进行),通过刷新字符输入缓冲区内容,这时把内容中的文件输出到硬盘。

4、释放资源,关闭FileWriter和BufferWriter对象。

文件上传

文件的上传下载在Web开发中会经常遇到,使用基本的I/O输入输出当然可以完成这项操作,但是对于开发的效率和程序运行效率方面考虑,在实际的开发过程中一般采用第三方的组件来完成这个上传的功能。

在实际开发过程中用的比较多的是commons-fileupload组件和jspSmartUpload组件,这两个组件都可以很好地完成文件上传的功能。这里我们以前者为例,配合这个组件的使用的另一个组件是commons-io组件。需要的jar包如下图所示

代码:


[java]

1. package com.foxmail.xxy668;  
2.   
3. import java.io.File;  
4. import java.io.IOException;  
5. import java.io.PrintWriter;  
6. import java.util.Iterator;  
7.   
8. import javax.servlet.ServletException;  
9. import javax.servlet.http.HttpServlet;  
10. import javax.servlet.http.HttpServletRequest;  
11. import javax.servlet.http.HttpServletResponse;  
12.   
13. import org.apache.commons.fileupload.FileItem;  
14. import org.apache.commons.fileupload.FileItemFactory;  
15. import org.apache.commons.fileupload.disk.DiskFileItemFactory;  
16. import org.apache.commons.fileupload.servlet.ServletFileUpload;  
17.   
18. public class FileUpload extends HttpServlet {  
19.     @Override  
20.     protected void doPost(HttpServletRequest request, HttpServletResponse response)  
21.             throws ServletException, IOException {  
22.         boolean isMultipart =ServletFileUpload.isMultipartContent(request);  
23.         if(isMultipart){  
24.             FileItemFactory factory=new DiskFileItemFactory();  
25.             ServletFileUpload upload=new ServletFileUpload(factory);  
26.             Iterator items;  
27.             try{  
28.                 items=upload.parseRequest(request).iterator();  
29.                 while(items.hasNext()){  
30.                     FileItem item=(FileItem) items.next();  
31.                     if(!item.isFormField()){  
32.                         String name=item.getName();  
33.                         String fileName=name.substring(name.lastIndexOf('\\')+1,name.length());  
34.                         String path=request.getRealPath("file")+File.separatorChar+fileName;  
35.   
36.                         File uploadedFile=new File(path);  
37.                         item.write(uploadedFile);  
38.   
39.                         response.setContentType("text/html");  
40.                         response.setCharacterEncoding("gb2312");  
41.                         PrintWriter out=response.getWriter();  
42.                         out.print("<font size='2'>upload the file is:"+name+"<br>");  
43.                         out.print("save the path is:"+path+"</font>");  
44.   
45.                     }  
46.                 }  
47.             }catch(Exception e){  
48.                 e.printStackTrace();  
49.             }  
50.         }  
51.     }  
52. }




实现思路:

1、判断提交过来的表单是否为文件上传表单,如果不是文件爱你上传表单,在后续的处理中就不再用文件上传功能来处理这个表单。

2、构造文件文件上传处理对象。

3、解析出表单中提交所有文件内容。

4、根据文件的路径将上传的文件储存到服务器中,完成上传操作。

文件下载

用Servlet下载文件的时候并不需要第三方组件的帮助,只需要对服务器的响应对象response进行简单的设置即可。

代码


[java]

1. package com.foxmail.xxy668;  
2.   
3. import java.io.IOException;  
4.   
5. import javax.servlet.ServletException;  
6. import javax.servlet.http.HttpServlet;  
7. import javax.servlet.http.HttpServletRequest;  
8. import javax.servlet.http.HttpServletResponse;  
9.   
10. public class FileDownload extends HttpServlet {  
11.   
12.     @Override  
13.     protected void doGet(HttpServletRequest request, HttpServletResponse response)  
14.             throws ServletException, IOException {  
15.         try{  
16.             String fname="test.xls";  
17.             response.setCharacterEncoding("UTF-8");  
18.             fname =java.net.URLEncoder.encode(fname,"UTF-8");  
19.             response.setHeader("Content-Disposition","attachment;filename="+fname);  
20.             response.setContentType("application/msexcel");  
21.         }catch(Exception e){  
22.             System.out.println(e);  
23.         }  
24.     }  
25. }



实现思路:

1、第19行指明了这个Servlet的功能是输出文件,并且指明文件的位置。

2、第20行指明了要输入文件的类型,其中application/msexcel就是Excel文件的MIME类型描述。



由于对Servelet文件操作不熟悉,才有了这篇对Servlet文件操作的总结。总是感觉任何知识点只有自己实现了才是自己的,照着敲是一回事,自己敲是另外一回事!其实Servlet对文件的操作和J2SE中对文件的操作或者说和VB当中对文件的操作是差不多的,但是如果自己写还是写不出来。

我觉得还是当时学习J2SE的时候代码量不够,或者说编织的知识网不够彻底。导致Java的基础知识不会,还记得上次鹏哥带回来的面试题“String和StringBuilder以及StringBuffer的区别是什么?”

这个问题过分么?这个问题能回答上来么?

按道理说这些知识是应该掌握的而且是早就应该掌握的,为什么没有掌握呢?学着学着不会学习了,以前的总结织网的好习惯随着学习任务的增多竟然都还给了老师,然后自己奢望着系统学习,奢望着拿出整块儿时间补充基础知识,奢望着面试之前再去好好看看基础知识……