鹰翔宇空

学习和生活

BlogJava 首页 新随笔 联系 聚合 管理
  110 Posts :: 141 Stories :: 315 Comments :: 1 Trackbacks

这两天做一个小东西,要求将一个文件打包到.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[] ,我经过测试,如果不使用的话,只能得到一半的内容,使用缓冲

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

如果哪位有更好的方法,还望不吝赐教!
posted on 2006-05-08 11:41 TrampEagle 阅读(2725) 评论(4)  编辑  收藏 所属分类: 学习体会

Feedback

# re: 如何将.war包中的文件读取到服务器硬盘 2006-05-08 13:50 thinkbase
jsp页面也可以的吧, context 这个东东在jsp页面隐藏变量中好象叫 "application", 和 request/response 这些隐藏变量一样是可以拿来就用的哦.  回复  更多评论
  

# re: 如何将.war包中的文件读取到服务器硬盘 2006-05-08 14:38 TrampEagle
@thinkbase
谢谢thinkbase,你是对的,确实在jsp中可以使用application.getResourceAsStream()来获取文件内容的,我已经修改了原文。再次表示感谢!  回复  更多评论
  

# re: 如何将.war包中的文件读取到服务器硬盘 2006-05-08 14:38 lizongbo
jsp里:

this.getServletContext().getResourceAsStream("");

或者:

application.getResourceAsStream("")

  回复  更多评论
  

# re: 如何将.war包中的文件读取到服务器硬盘 2006-05-08 14:51 TrampEagle
@lizongbo
谢谢lizongbo的指点,但我测试后发现,application.getResourceAsStream("") 可以编译通过,但是this.getServletContext().getResourceAsStream();这个方法应该应用在servlet中的,jsp中没有this.getServletContext()这个方法,以前我就是使用这个方法出的问题,才造成误解!但仍然非常地感谢lizongbo!
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: