以上三篇文章已经实现了基本功能,接下来我们实现保存模板的功能,以便于每次打开的默认设置可以修改保存。
基本思路是,当最后程序打包成exe时,只需要一个exe程序,不再需要任何其他文件,实现方式是,启动程序的时候判断是否存在配置文件,如果存在配置文件则读取配置文件的默认设置信息,如果不存在则全部为空,当点击保存模板时,将默认设置信息获取到,并判断是否根目录存在配置文件存在则删除再创建,不存在则直接创建,之所以是删除再创建,主要是因为创建的文件时隐藏的,不便于修改,配置信息较为简单直接创建即可。
在KafkaMainGUI类init()方法中添加如下代码
private void init() {
// 原理:首先判断exe所在目录是否存在隐藏的配置文件kafkamodel.properties,
// 如果存在,则读取此配置文件,如果不存在则生成一个默认的隐藏的配置文件
// 实例化一个发送信息对象
BaseMsg km = new BaseMsg();
File f = new File("sendkafkamodel.properties");
// 判断是否存在文件
fileExit = utils.isFileExit(f);
if (fileExit) {
// 获取默认配置信息
try {
km = utils.getDefaultMsg(f, 0);
} catch (Exception e1) {
km = new BaseMsg();
e1.printStackTrace();
}
}
// 实例化一个接收数据的信息对象
BaseMsg kmm = new BaseMsg();
File ff = new File("consumerkafkamodel.properties");
if (utils.isFileExit(ff)) {
// 获取默认配置信息
try {
kmm = utils.getDefaultMsg(ff, 1);
} catch (Exception e1) {
kmm = new BaseMsg();
e1.printStackTrace();
}
}
......
}
注意这两个配置文件名的名字最好特殊一些,免得本误认或者删除。
接下来再次更改init()方法一些代码,对默认配置进行更改,例如
//port
tt2.setText(km.getKafkaPort() != null ? km.getKafkaPort() : "");
等等依次更改。
注意对于对组合按钮单选框的设置需要注意下,当不存在配置文件时,对象BaseMsg的属性isKafkaIsDefault默认值是false,但是我想默认是true,注意特殊更改下,当不存在配置文件时直接指定,若存在配置文件再读取按照配置文件
// 如果没有文件则选择默认
// 若km不存在其默认是false,稍作处理
if (!fileExit) {
jrb1.setSelected(true);
jrb2.setSelected(false);
jta1.setVisible(false);
} else {
jrb1.setSelected(km.isKafkaIsDefault());
jrb2.setSelected(!km.isKafkaIsDefault());
}
接下来书写监听保存模板按钮代码
// 监听保存模板1
if (e.getSource().equals(button8)) {
// get params
BaseMsg baseMsg3 = getBaseMsg();
// check
int flag = checkParams(baseMsg3);
if (flag == 0) {
// 存入配置文件
try {
if (utils.BaseMsgToPro(baseMsg3, 0)) {
JOptionPane.showMessageDialog(null, "保存模板成功!重启生效!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "保存模板失败!请重试!", "提示消息", JOptionPane.WARNING_MESSAGE);
}
} catch (Exception e1) {
JOptionPane.showMessageDialog(null, "保存模板失败!请重试!", "提示消息", JOptionPane.WARNING_MESSAGE);
e1.printStackTrace();
}
} else if (flag == 1) {
JOptionPane.showMessageDialog(null, "不能为空!请重新填写!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (flag == 2) {
JOptionPane.showMessageDialog(null, "相关参数只能是数字!请重新填写!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (flag == 3) {
JOptionPane.showMessageDialog(null, "IP不正确!请重新填写!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (flag == 4) {
JOptionPane.showMessageDialog(null, "条数,间隔时间,初始ID超过范围!请重新填写!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (flag == 5) {
JOptionPane.showMessageDialog(null, "Message格式不正确!请重新填写!", "提示消息", JOptionPane.WARNING_MESSAGE);
}
}
// 监听保存模板2
if (e.getSource().equals(button9)) {
// get params
BaseMsg baseMsg4 = getBaseMsg2();
// check
int flag = checkParams2(baseMsg4);
if (flag == 0) {
// 存入配置文件
try {
if (utils.BaseMsgToPro(baseMsg4, 1)) {
JOptionPane.showMessageDialog(null, "保存模板成功!重启生效!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else {
JOptionPane.showMessageDialog(null, "保存模板失败!请重试!", "提示消息", JOptionPane.WARNING_MESSAGE);
}
} catch (Exception e1) {
JOptionPane.showMessageDialog(null, "保存模板失败!请重试!", "提示消息", JOptionPane.WARNING_MESSAGE);
e1.printStackTrace();
}
} else if (flag == 1) {
JOptionPane.showMessageDialog(null, "不能为空!请重新填写!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (flag == 2) {
JOptionPane.showMessageDialog(null, "相关参数只能是数字!请重新填写!", "提示消息", JOptionPane.WARNING_MESSAGE);
} else if (flag == 3) {
JOptionPane.showMessageDialog(null, "IP不正确!请重新填写!", "提示消息", JOptionPane.WARNING_MESSAGE);
}
}
到Utils类开始写具体的方法
首先是初始化时读取配置文件的方法
public BaseMsg getDefaultMsg(File f, int flag) throws Exception {
Properties pro = new Properties();
// InputStream inputStream =
// this.getClass().getResourceAsStream("kafkamodel.properties");
// RandomAccessFile ff = new RandomAccessFile(new
// File("kafkalog20180329012249.txt"), "rw");
FileInputStream fis = new FileInputStream(f);
BufferedReader bf = new BufferedReader(new InputStreamReader(fis, "utf-8"));
pro.load(bf);
BaseMsg bm = new BaseMsg();
bm.setKafkaIp(pro.getProperty("ip"));
bm.setKafkaPort(pro.getProperty("port"));
bm.setKafkaGroupId(pro.getProperty("groupid"));
bm.setKafkaTopic(pro.getProperty("topic"));
// 0表示发送
if (flag == 0) {
bm.setKafkaAccount(pro.getProperty("account"));
bm.setKafkaTimes(pro.getProperty("times"));
bm.setKafkaMessage(formatJson(pro.getProperty("msg")));
bm.setKafkaKey(pro.getProperty("key"));
bm.setKafkaStartId(pro.getProperty("startid"));
if (pro.getProperty("msgisdefault").equals("0")) {
bm.setKafkaIsDefault(true);
} else {
bm.setKafkaIsDefault(false);
}
}
fis.close();
bf.close();
return bm;
}
注意要记得关闭流。
当读取配置的时候,配置文件时properties格式,而msg信息是json格式,需要在显示的界面上为json,对字符串进行json格式化。
方法
// format jsonstring
public String formatJson(String content) {
StringBuffer sb = new StringBuffer();
int index = 0;
int count = 0;
while (index < content.length()) {
char ch = content.charAt(index);
if (ch == '{' || ch == '[') {
sb.append(ch);
sb.append('\n');
count++;
for (int i = 0; i < count; i++) {
sb.append('\t');
}
} else if (ch == '}' || ch == ']') {
sb.append('\n');
count--;
for (int i = 0; i < count; i++) {
sb.append('\t');
}
sb.append(ch);
} else if (ch == ',') {
sb.append(ch);
sb.append('\n');
for (int i = 0; i < count; i++) {
sb.append('\t');
}
} else {
sb.append(ch);
}
index++;
}
return sb.toString();
}
基本方法,判断文件是否存在
public boolean isFileExit(File file) {
if (file.exists()) {
return true;
}
return false;
}
接下来是保存模板时用到的方法,将配置信息输出为文件
public boolean BaseMsgToPro(BaseMsg baseMsg3, int flag) throws Exception {
File f;
String content = "";
if (flag == 0) {
f = new File("sendkafkamodel.properties");
content = "ip=" + baseMsg3.getKafkaIp() + "\r\nport=" + baseMsg3.getKafkaPort() + "\r\ngroupid="
+ baseMsg3.getKafkaGroupId() + "\r\ntopic=" + baseMsg3.getKafkaTopic() + "\r\naccount="
+ baseMsg3.getKafkaAccount() + "\r\ntimes=" + baseMsg3.getKafkaTimes() + "\r\nmsgisdefault="
+ (baseMsg3.isKafkaIsDefault() ? "0" : "1") + "\r\nmsg="
+ baseMsg3.getKafkaMessage().replaceAll("\n", "") + "\r\nkey=" + baseMsg3.getKafkaKey()
+ "\r\nstartid=" + baseMsg3.getKafkaStartId();
} else {
f = new File("consumerkafkamodel.properties");
content = "ip=" + baseMsg3.getKafkaIp() + "\r\nport=" + baseMsg3.getKafkaPort() + "\r\ngroupid="
+ baseMsg3.getKafkaGroupId() + "\r\ntopic=" + baseMsg3.getKafkaTopic();
}
// 先删除隐藏文件再重新创建,隐藏文件不支持修改
if (f.exists()) {
f.delete();
}
FileOutputStream fos = null;
try {
fos = new FileOutputStream(f);// 创建文件输出流对象
// 设置文件的隐藏属性
String set = "attrib +H " + f.getAbsolutePath();
Runtime.getRuntime().exec(set);
// 将字符串写入到文件中
fos.write(content.getBytes());
return true;
} catch (FileNotFoundException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} finally {
try {
fos.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
return false;
}
同样要注意流的关闭。
拼接好字符串,注意设置文件的属性是隐藏,这样用户平时也就看不见配置文件,如果将程序移动,则会初始化为空,保存模板即可重启生效。
再在前台设置一个关于的按钮,监听信息如下
// 监听关于
if (e.getSource().equals(button10)) {
String msg = "关于MsgKafka.exe:\r\n 1.该程序需要Java环境,若没有则下载复制Jre文件夹并改名“jre”,放置到MsgKafka.exe同级目录即可。\r\n 2.向kafka发送数据格式为简单json格式,默认自带id。\r\n 3.若条数为1则所有信息后缀不递增,若条数大于1则内容后缀递增,如“test”自动变成“test1”,“test2”。\r\n 4.常用信息设置好之后,可保存为模板,重启生效。";
JOptionPane.showMessageDialog(null, msg, "提示消息", JOptionPane.WARNING_MESSAGE);
}
好了,到此为止所有基本功能就完成了,成功的界面如下