一 问题由来
有时候我们做一些项目时,需要将一些配置信息写入配置文件中,以供调用。比如说这样:
如果我们需要在Demo.java中读取config.txt这个文件中的配置信息,在这种工程目录下是可以使用File来读取的,但是打包成jar后,使用File将不能读取到config.txt了,除非将这个配置信息放在jar包的外面。
假如说我们用File来读取文件:
1
|
BufferedReader reader =
new
BufferedReader(
new
FileReader(
new
File(
"res/config.txt"
)));
|
工程状态下是没有问题的,但是打包成jar后执行报错:
很显然是找不到指定的文件,为什么会出现这种问题呢?因为这时候整个jar文件是一个文件了,当然找不到jar包中的配置文件了
我们继续测试,在“测试0.jar”同级目录下新建一个res文件夹,里面放一个config.txt,继续运行:
现在我们可以看到,程序执行的时候没有报错,已经可以正常的运行了
二 问题引申
有人可能想问,如果我非要将配置文件打包进jar中,有没有办法可以访问呢?答案是肯定的。使用 this.getClass().getResourceAsStream(“/config.txt”); 就可以了。完整的获取输入流是这样的:
1
2
|
InputStream inputStream =
this
.getClass().getResourceAsStream(
"/config.txt"
);
BufferedReader reader =
new
BufferedReader(
new
InputStreamReader(inputStream,
"UTF-8"
));
|
都得到BufferedReader了,接下来就是正常的读文件了
整个测试小项目的完整源代码如下:
1
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
|
import
java.awt.Dimension;
import
java.awt.Font;
import
java.awt.GridBagConstraints;
import
java.awt.GridBagLayout;
import
java.awt.Toolkit;
import
java.io.BufferedReader;
import
java.io.FileNotFoundException;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
javax.swing.JFrame;
import
javax.swing.JLabel;
import
javax.swing.JPanel;
import
javax.swing.JScrollPane;
import
javax.swing.JTextArea;
import
javax.swing.SwingUtilities;
public
class
Demo
extends
JFrame{
private
GridBagLayout gridbag;
private
GridBagConstraints constraints;
private
JPanel mainJPanel;
private
JLabel tip;
private
JScrollPane jScrollPane;
private
JTextArea content;
private
Font contentFont =
new
Font(
"宋体"
, Font.LAYOUT_NO_LIMIT_CONTEXT,
16
);
//正文字体
public
Demo(){
super
(
"引用jar包中配置文件Demo"
);
Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
screenSize = Toolkit.getDefaultToolkit().getScreenSize();
//屏幕大小
setPreferredSize(
new
Dimension(
700
,
300
));
int
frameWidth =
this
.getPreferredSize().width;
//界面宽度
int
frameHeight =
this
.getPreferredSize().height;
//界面高度
setSize(frameWidth,frameHeight);
setLocation((screenSize.width - frameWidth) /
2
,(screenSize.height - frameHeight) /
2
);
//初始化
mainJPanel =
new
JPanel();
tip =
new
JLabel(
"提示:"
);
jScrollPane =
new
JScrollPane();
content =
new
JTextArea(
5
,
10
);
//布局
gridbag =
new
GridBagLayout();
constraints =
new
GridBagConstraints();
constraints.fill = GridBagConstraints.BOTH;
mainJPanel.setLayout(gridbag);
constraints.gridwidth =
0
;
constraints.gridheight =
1
;
constraints.weightx =
1
;
constraints.weighty =
0
;
gridbag.setConstraints(tip, constraints);
tip.setFont(contentFont);
mainJPanel.add(tip);
constraints.gridwidth =
0
;
constraints.gridheight =
1
;
constraints.weightx =
1
;
constraints.weighty =
1
;
gridbag.setConstraints(jScrollPane, constraints);
jScrollPane.setFont(contentFont);
mainJPanel.add(jScrollPane);
content.setFont(contentFont);
jScrollPane.setViewportView(content);
content.setLineWrap(
true
);
content.setWrapStyleWord(
true
);
try
{
InputStream inputStream =
this
.getClass().getResourceAsStream(
"/config.txt"
);
BufferedReader reader =
new
BufferedReader(
new
InputStreamReader(inputStream,
"UTF-8"
));
String line =
""
;
while
((line = reader.readLine()) !=
null
){
content.append(line +
"\n"
);
}
reader.close();
}
catch
(FileNotFoundException e) {
e.printStackTrace();
}
catch
(IOException e) {
e.printStackTrace();
}
add(mainJPanel);
setVisible(
true
);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
public
static
void
main(String[] args) {
SwingUtilities.invokeLater(
new
Runnable() {
public
void
run() {
new
Demo();
}
});
}
}
|
res/config.txt:
test text
注:
这种方式虽然实现了对jar包中文件的读取,但是仍然是有一定弊端性的,那就是没法在程序执行的过程中动态地修改该配置文件中的值。
本文转自 pangfc 51CTO博客,原文链接:http://blog.51cto.com/983836259/1731724,如需转载请自行联系原作者