JavaSwing简单发送/接收kafka数据,并打包成exe(4)

上一篇链接https://blog.csdn.net/rico_zhou/article/details/79866808

以上三篇文章已经实现了基本功能,接下来我们实现保存模板的功能,以便于每次打开的默认设置可以修改保存。

       基本思路是,当最后程序打包成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);
		}

好了,到此为止所有基本功能就完成了,成功的界面如下





GitHub源码:https://github.com/ricozhou/msgkafka

如何打包成exe可以参考下一篇文章https://blog.csdn.net/rico_zhou/article/details/79868129

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值