如何将.war包中的文件读取到服务器硬盘

如何将.war包中的文件读取到服务器硬盘

这两天做一个小东西,要求将一个文件打包到.war文件中,然后还要将这个文件从.war包中读取出来,并在服务器硬盘上重新建一个新的文件。本来很简单的东西,却浪费了不少时间,写出来,做一下笔记,同时给那些需要的朋友提供一下参考,下面是我写的一个示例,在servlet中写的:

1 package com.hyq.servlets;
2
3 import javax.servlet.ServletException;
4 import javax.servlet.http.HttpServletRequest;
5 import javax.servlet.http.HttpServletResponse;
6 import java.io.IOException;
7 import javax.servlet.http.HttpServlet;
8 import java.io.InputStream;
9 import java.io. * ;
10 import java.io.InputStreamReader;
11 public class SystemInitServlet extends HttpServlet ... {
12 private static final String CONTENT_TYPE = " text/html; charset=GBK " ;
13 // Initialize global variables
14 public void init() throws ServletException ... {
15 java.io.InputStream stream = null ;
16 File newFile = new java.io.File( " C:/hyq " );   //新建一个文件目录
17 newFile.mkdirs();                                           // 生成目录
18
19 try ... {
20 int bytesRead = 0 ;
21
22 javax.servlet.ServletContext context = getServletContext();
23 stream = context.getResourceAsStream( " /hyq/hyq.cer " );
24
25 FileWriter tempFileWriter = new FileWriter( " C:/hyq/test.cer " );
26
27
28 InputStreamReader inputd = new InputStreamReader(stream); // 这个地方一定要进行转换
29 Reader tempReader = inputd;
30 char [] buffer = new char [ 8192 ];
31
32 try ... {
33 while ((bytesRead = tempReader.read(buffer)) !=- 1 ) ... {
34 tempFileWriter.write(buffer, 0 ,bytesRead); // 使用缓存读入,不要使用 write(buffer),避免读入空字符 
35 }
36 }

37
catch (IOException ex2) ... {
38 }
39 tempFileWriter.flush();                              // 记得清空缓存,否则读入到缓存中不满时,不会写入文件
40 tempFileWriter.close();                            // 要记得关闭
41 inputd.close();                            // 要记得关闭
42 tempReader.close();                            // 要记得关闭
43
}
catch (Exception e) ... {
44 System.err.println( " Load File failed " );
45 }
46 }
47
48 public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException ... {
49 } 
50  
51 public void destroy() ... {
52 }
53
54 }
55
56
     至于为什么一定要使用context.getResourceAsStream,而不使用其他的如context.getRealPath("/")等来获

取.war包中的文件,可以参考:http://www.blogjava.net/TrampEagle/archive/2006/04/20/42195.html一文,同时在测

试过程中发现,在jsp页面中不能直接使用这个方法,要使用application.getResourceAsStream(),但是仍然要使用InputStreamReader,进行转换(这里要向thinkbase和lizongbo表示感谢)。如下:
<%
ChrBuffer=new char[10]; java.io.InputStream stream = application.getResourceAsStream("/hyq/hyq.cer"); InputStreamReader inputd = new InputStreamReader(stream);
Reader tempReader = inputd;
char[] buffer = new char[8192];
int hyql = 0;
while((hyql = tempReader.read(buffer))!=-1){
out.write(buffer,0,hyql);
}
out.flush();   
%>

注意:一定要使用缓冲字符数组char[] ,我经过测试,如果不使用的话,只能得到一半的内容,使用缓冲

后,才能得到全部的内容。

如果哪位有更好的方法,还望不吝赐教!

你可能感兴趣的:(如何将.war包中的文件读取到服务器硬盘)