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

一 问题由来

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

ae1c9bc3f22a7fd48cfc6fbfcf3a6e5a.png

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

假如说我们用File来读取文件:BufferedReader reader = new BufferedReader(new FileReader(new File("res/config.txt")));

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

edd41e4b8835706075ace0bcdd7d63e8.png

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

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

bd592f9947d2a1d796a898086e1e99bc.png

4e13ff6a883cb7bcabde13dec8a7b83e.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包中文件的读取,但是仍然是有一定弊端性的,那就是没法在程序执行的过程中动态地修改该配置文件中的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值