一 问题由来
有时候我们做一些项目时,需要将一些配置信息写入配置文件中,以供调用。比如说这样:
如果我们需要在Demo.java中读取config.txt这个文件中的配置信息,在这种工程目录下是可以使用File来读取的,但是打包成jar后,使用File将不能读取到config.txt了,除非将这个配置信息放在jar包的外面。
假如说我们用File来读取文件:
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”); 就可以了。完整的获取输入流是这样的:
InputStream inputStream = this.getClass().getResourceAsStream("/config.txt"); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream,"UTF-8"));
都得到BufferedReader了,接下来就是正常的读文件了
整个测试小项目的完整源代码如下:
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包中文件的读取,但是仍然是有一定弊端性的,那就是没法在程序执行的过程中动态地修改该配置文件中的值。
时间: 2024-10-15 22:05:07