中级抽奖——java实现(通过IO流保存中奖名单)


目录

 

背景

显示效果

新增知识内容

下拉列表

读取数据

存储数据

关闭程序

全部代码

如何将用java写的代码变成exe文件

拓展提高


背景

本文是的进阶版主要讲解如何用IO流读取并保存数据,若有基础问题不懂请参考基础抽奖,基础版链接:https://blog.csdn.net/weixin_52473454/article/details/121520004

显示效果

新增知识内容

知识内容 作用目的
JComboBox 下拉列表显示信息
File 实例化文件对象
FileInputStream,FileOutputStream 用于以字节的形式读取和写入数据
DataInputStream,DataOutputStream 直接进行字符的读写
System.exit(EXIT_ON_CLOSE) 关闭程序

下拉列表

下拉列表属于GUI中基础的组件,在这里不多介绍。

实例化下拉列表并给下拉列表添加内容

 String prize[]= {"奖品","过期牛奶一箱","二手牙刷一个","小编秘制奥利给一份","雷碧一瓶","并夕夕优惠券",
			"半瓶开塞露","逍遥丸一粒","一袋旺仔牛逼糖","爆炒啤酒瓶一份"};//奖品信息
JComboBox<Object> jcb=new JComboBox<Object>(prize);//下拉列表组件

读取数据

我们判断id是否使用的前提是我们得先将以前抽过奖的id拿出来,然后再与从文本框中获取的id作比较,然后得出结果。

try {//读取数据
			fis=new FileInputStream(f1);
			dis=new DataInputStream(fis);
			String str1;
			try {
				str1 = dis.readUTF();				
				String str2[]=str1.split(",");//通过","号还分割成字符串数组
				for(int i=0;i<str2.length;i++) {
						list.add(str2[i]);	//将数组内容赋值到list中	
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
			try {//关闭流,从下到上
				dis.close();
				fis.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

存储数据

当我们抽完奖后得保存这几次抽奖的id,防止已抽奖的id在下次运行程序时还能抽奖。

try {
					String str3=list.get(0);
					for(int i=1;i<list.size();i++) {
						str3+= (","+list.get(i));//将id保存
					}
					FileOutputStream fos=new FileOutputStream(f1);
					DataOutputStream dos=new DataOutputStream(fos);//通过数据流把数据保存到txt文档中
					try {
						dos.writeUTF(str3);
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					try {
						dos.close();
						fos.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}					
				} catch (FileNotFoundException e1) {					
					e1.printStackTrace();
				}
				System.exit(EXIT_ON_CLOSE);
			}

关闭程序

关闭程序,我更喜欢用System.exit(EXIT_ON_CLOSE)方法,System.exit()停止虚拟机
而dispose()只是关闭这个窗口,但是并没有停止整个application。
exit方法会释放内存,也就是说连JVM都关闭了。

全部代码

为了方便复制并运行,我直接把所有内容写到一个类里。

import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
public class Frame extends JFrame{
	/**
	 * @author ZYY
	 */
	private static final long serialVersionUID = 1L;
	public List<String> list=new ArrayList<String>();
	public File f0=new File("d:/机密/文本文档");//创建一个文件对象,用于创建一个文件夹
	public File f1=new File("d:/机密/文本文档/id内容.txt");//创建一个文本文档
	public String prize[]= {"奖品","过期牛奶一箱","二手牙刷一个","小编秘制奥利给一份","雷碧一瓶","并夕夕优惠券",
			"半瓶开塞露","逍遥丸一粒","一袋旺仔牛逼糖","爆炒啤酒瓶一份"};//奖品信息
	
	FileInputStream fis;//字节流
	DataInputStream dis;//用数据流封装字节流,通过数据流读取数据
	public Frame() {
		f0.mkdirs();//如果没有该文件夹,创建该目录的所有文件夹
		if(!f1.exists()) {//如果不存在该txt文档,创建该txt文档
			try {
				f1.createNewFile();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		try {//读取数据
			fis=new FileInputStream(f1);
			dis=new DataInputStream(fis);
			String str1;
			try {
				str1 = dis.readUTF();				
				String str2[]=str1.split(",");//通过","号还分割成字符串数组
				for(int i=0;i<str2.length;i++) {
						list.add(str2[i]);	//将数组内容赋值到list中	
				}
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}	
			try {//关闭流,从下到上
				dis.close();
				fis.close();
			} catch (IOException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
			
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		//界面部分
		JLabel l1=new JLabel("通过IO流保存数据");//标签组件
		JLabel l2=new JLabel("请输入您的id:");
		JLabel l3=new JLabel("");
		JLabel l4=new JLabel("查看奖品:");
		JLabel l5=new JLabel("");
		JLabel l6=new JLabel("查看中奖名单:");
		JButton b1=new JButton("开始抽奖");//按钮组件
		JButton b2=new JButton("查看奖品");
		JButton b3=new JButton("退出");
		JTextField jtf=new JTextField();//文本框组件
		JComboBox<Object> jcb=new JComboBox<Object>(prize);//下拉列表组件
		String ps[]=new String [list.size()+1];//下拉列表内容
		ps[0]="id";//给第一个命名
		for(int i=1;i<ps.length;i++) {
			ps[i]=list.get(i-1);//给剩下的命名
		}
		JComboBox<Object> cb=new JComboBox<Object>(ps);
		jtf.setColumns(20);//设置文本框内容长度
		l1.setBounds(120,20,300,50);//绝对坐标,大小
		l1.setFont(new Font("宋体",Font.BOLD,26));//样式
		l2.setBounds(10,320,110,30);
		l2.setFont(new Font("宋体",Font.BOLD,15));
		l3.setFont(new Font("宋体",Font.BOLD,15));
		l5.setFont(new Font("宋体",Font.BOLD,13));
		l3.setBounds(150,100,170,30);
		l4.setBounds(350,70,100,30);
		l5.setBounds(150,130,170,30);
		l6.setBounds(350,130,100,30);
		jtf.setBounds(130,320,120,30);
		b1.setBounds(260,320,90,30);
		b3.setBounds(355,320,70,30);
		jcb.setBounds(350,100,130,30);
		cb.setBounds(350,155,130,30);
		add(l1);//将组件加入到窗体里
		add(l2);
		add(l3);
		add(l4);
		add(l5);
		add(l6);
		add(b1);
		add(b2);
		add(b3);
		add(jtf);
		add(jcb);
		add(cb);
		setBounds(320, 200, 500, 400);//设置窗体的坐标大小
		setUndecorated(true);//是否消除窗体边框
		setLayout(null);//绝对布局
		
		setVisible(true);//是否显示
		b1.addActionListener(new ActionListener() {//添加监听
			@Override
			public void actionPerformed(ActionEvent e) {
				if(list.contains(jtf.getText())) {//判断是否存在该id
					l3.setText("该id已参与抽奖!");
					l3.setForeground(Color.RED);//前景色
				}else {
					list.add(jtf.getText());
					l3.setText("您已成功参与抽奖!");
					l3.setForeground(Color.GREEN);
					Random r=new Random();//随机奖品
					int num=r.nextInt(prize.length)+1;
					String p=prize[num];
					l5.setText("恭喜您获得"+p);
				}		
			}		
		});	
		b3.addActionListener(new ActionListener() {//用于保存抽奖的id
			public void actionPerformed(ActionEvent e) {
				try {
					String str3=list.get(0);
					for(int i=1;i<list.size();i++) {
						str3+= (","+list.get(i));//将id保存
					}
					FileOutputStream fos=new FileOutputStream(f1);
					DataOutputStream dos=new DataOutputStream(fos);//通过数据流把数据保存到txt文档中
					try {
						dos.writeUTF(str3);
					} catch (IOException e1) {
						e1.printStackTrace();
					}
					try {
						dos.close();
						fos.close();
					} catch (IOException e1) {
						// TODO Auto-generated catch block
						e1.printStackTrace();
					}					
				} catch (FileNotFoundException e1) {					
					e1.printStackTrace();
				}
				System.exit(EXIT_ON_CLOSE);
			}
		});
	}
	
	
public static void main(String[] args) {
	new Frame();	//调用构造方法
}
	}

如何将用java写的代码变成exe文件

参考:

java写的代码用exe4j生成exe文件_无忧#的博客-CSDN博客

拓展提高

除了本项目中用io保存已参与抽奖的id,还可以对id进行限制。如格式为abc123d45类型的才可以参与抽奖,否则提示“id无效”。可以设置中奖概率,使一些id不能百分百中奖,使一些vip-id可以百分百中奖。可以美化一下窗体布局,设置一些背景图片,添加一些高级组件。还可以在另一个文档里读取,保存奖品数据。

猜你喜欢

转载自blog.csdn.net/weixin_52473454/article/details/121521506