有关打包成可执行jar包后引用jar包中配置文件问题

一 问题由来

有时候我们做一些项目时,需要将一些配置信息写入配置文件中,以供调用。比如说这样:

wKiom1aLbvLQhC4eAAAVhpYSRkA317.png

如果我们需要在Demo.java中读取config.txt这个文件中的配置信息,在这种工程目录下是可以使用File来读取的,但是打包成jar后,使用File将不能读取到config.txt了,除非将这个配置信息放在jar包的外面。

假如说我们用File来读取文件:

1
BufferedReader reader =  new  BufferedReader( new  FileReader( new  File( "res/config.txt" )));

工程状态下是没有问题的,但是打包成jar后执行报错:

wKiom1aLby7hqUPdAABAzNiL0Uc895.png

很显然是找不到指定的文件,为什么会出现这种问题呢?因为这时候整个jar文件是一个文件了,当然找不到jar包中的配置文件了

我们继续测试,在“测试0.jar”同级目录下新建一个res文件夹,里面放一个config.txt,继续运行:

wKioL1aLb4Kxt_oaAAEEpSLIQBI941.png

wKiom1aLb13BJ1TrAACr7MeOdgw752.png

现在我们可以看到,程序执行的时候没有报错,已经可以正常的运行了

二 问题引申

有人可能想问,如果我非要将配置文件打包进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包中文件的读取,但是仍然是有一定弊端性的,那就是没法在程序执行的过程中动态地修改该配置文件中的值。


本文出自 “zifangsky的个人博客” 博客,请务必保留此出处http://983836259.blog.51cto.com/7311475/1731724

  • 13
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值