這兩天做一個小東西,要求將一個文件打包到.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.aygfsteel.com/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[] ,我經過測試,如果不使用的話,只能得到一半的內容,使用緩沖
后,才能得到全部的內容。
如果哪位有更好的方法,還望不吝賜教!

2
3

4

5

6

7

8

9

10

11


12

13

14


15

16

17

18

19


20

21

22

23

24

25

26

27

28

29

30

31

32


33


34

35

36

37


38

39

40

41

42

43


44

45

46

47

48


49

50

51


52

53

54

55

56

???? 至于為什么一定要使用context.getResourceAsStream,而不使用其他的如context.getRealPath("/")等來獲
取.war包中的文件,可以參考:http://www.aygfsteel.com/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[] ,我經過測試,如果不使用的話,只能得到一半的內容,使用緩沖
后,才能得到全部的內容。
如果哪位有更好的方法,還望不吝賜教!