Java-保存数据(IO和图形界面)
2016-05-27 11:22
561 查看
在图形界面里添加并在文本域显示学生的信息,同时把学生的信息写入文件中,关闭图形界面再次打开,上次输入的信息还会存在。除非把保存数据的文件删除再运行程序,则会重新开始输入,重新保存更新
思想:用一个数组存储学生信息,再把数组信息写入文件中(每输入一个学生信息向文件中重新写入一次,因为ObjectOutputStream类中没有附加写入信息的方法)。读取信息时,用数组把学生信息接受到数组中。再次写入就继续向数组中添加学生信息以此循环反复
API:
运行结果:
思想:用一个数组存储学生信息,再把数组信息写入文件中(每输入一个学生信息向文件中重新写入一次,因为ObjectOutputStream类中没有附加写入信息的方法)。读取信息时,用数组把学生信息接受到数组中。再次写入就继续向数组中添加学生信息以此循环反复
import java.io.Serializable; //类:用于存储输入的学生的信息,再用toString()方法读取出来 //要被写入对象流的类,必须实现Serializable接口----贴标签技术(接口中没有抽象方法,只是为了标识一下) public class student implements Serializable{//贴标签,判断是Serializable否是类型,可以序列化。可以被写入读出 private String name,sex,province,cities; private int number; public void setName(String name) { this.name = name; } public void setSex(String sex) { this.sex = sex; } public void setNumber(int number) { this.number = number; } public void setProvince(String province) { this.province = province; } public void setCity(String city) { this.cities = city; } public String toString() { return "name:"+name+ ",sex:" + sex + ",number:" + number + ",province:" + province + ",cities:" + cities ; } }
API:
import java.awt.Color; import java.awt.Font; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.EOFException; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JScrollPane; import javax.swing.JTextArea; import javax.swing.JTextField; public class UserJFrame extends JFrame implements ActionListener{ private JTextArea textUser;//文本域 private int number=1;//学号 private JTextField textNumber,textName;//显示学号和姓名的文本 private JRadioButton rbMale,rbFmale;// private JComboBox comProvince,combCities;//下拉菜单形式的复选框,用于存放省份和城市 private JButton btnAdd;//添加按钮 private Object[][] cities;//声明全局变量,监听comProvince把combCities换成在所选省份里的城市 private String fileName="student.dat";//保存数据的文件名 //输入输出流 private ObjectOutputStream out=null; private ObjectInputStream in = null; private Object objs[]=new Object[0];//保存数据,点击添加按钮,就把数组objs[]重新向文件中写入数据一次。则关闭图形界面,再次运行还能显示上次保存的额学生信息 public UserJFrame(Object[] privinces,Object[][] cities){ super("输入信息"); this.cities=cities; setBounds(300,230,560,200);//设置图形界面位置,大小 setDefaultCloseOperation(EXIT_ON_CLOSE);//设置图形界面右上红色关闭按钮 getContentPane().setLayout(new GridLayout(1, 2));//设置网格布局:一行两列 textUser=new JTextArea(); Font font=new Font("aaa", Font.BOLD, 18);//new字体 textUser.setFont(font);//对添加到文本域的字设置字体 textUser.setForeground(Color.green);//对添加到文本域的字设置颜色 getContentPane().add(new JScrollPane(textUser));//添加文本域 JPanel p=new JPanel();//new一个面板 getContentPane().add(p);//添加面板 p.setLayout(new GridLayout(6, 1));//对面板设置网格布局:六行一列 textNumber=new JTextField();// objs=readObjectFromFile();// number=objs.length+1;// textNumber.setText(""+number);//学生编号,从1号开始累加 textNumber.setEditable(false);//设置文本不可编辑 p.add(textNumber);//面板添加学号编辑框 textName=new JTextField("姓名");//添加姓名的文本,默认显示值为"姓名" p.add(textName);//面板添加姓名编辑框 //new一个面板添加性别选择按钮 JPanel pS=new JPanel(); pS.setLayout(new GridLayout(1, 2));//布局 p.add(pS); rbMale=new JRadioButton("男",true);//设置默认选中男 rbFmale=new JRadioButton("女"); ButtonGroup group=new ButtonGroup();//为一组按钮创建一个多斥作用域 group.add(rbFmale); group.add(rbMale); pS.add(rbMale); pS.add(rbFmale); comProvince=new JComboBox( privinces );//new省份,并把privinces[]加入复选框,默认显示privinces[0] p.add(comProvince); comProvince.addActionListener(this);//添加监听,再实现接口implements ActionListener,最后实现抽象方法public void actionPerformed(ActionEvent e),监听要实现的步骤在方法完成 combCities=new JComboBox(cities[0]);//new城市,并把cities[0]加入复选框,默认显示cities[0][0] p.add(combCities); btnAdd=new JButton("添加"); p.add(btnAdd); btnAdd.addActionListener(this);//监听 textUser.setText(readFromFile());//从存储信息的文件中读出上次存储的信息,并显示在文本域中 setVisible(true);//显示图形界面 } public static void main(String[] args) { Object[] privinces={"湖南省","江苏省","浙江省"}; Object cities[][]= { { "长沙", "益阳","衡阳","湘潭","娄底" }, { "南京","苏州","无锡" }, { "杭州","宁波","温州" } }; new UserJFrame(privinces,cities);//值传递 } public void actionPerformed(ActionEvent e) { if(e.getSource()==comProvince){//当选择某一个省份,把城市换成对应省份的城市 int i=comProvince.getSelectedIndex();//获得省份序号 combCities.removeAllItems();//把之前添加的城市移除 for(int j=0;j<cities[i].length;j++){ combCities.addItem(cities[i][j]);//把所有第i个省份内的城市添加入复选框 } } if(e.getSource()==btnAdd){//判断是否是点击添加按钮的动作 student s=new student(); //学号---收集并更新 s.setNumber(number); number++; textNumber.setText(""+number); //姓名 s.setName(textName.getText()); textName.setText("姓名"); //性别 if(rbMale.isSelected()){ s.setSex(rbMale.getText()); }else{ s.setSex(rbFmale.getText()); } //省份 s.setProvince((String)comProvince.getSelectedItem()); //城市 s.setCity((String)combCities.getSelectedItem()); //向存储数据的数组中添加信息 Object objs2[]=new Object[objs.length+1]; for (int j = 0; j < objs.length; j++) { objs2[j] = objs[j]; } objs2[objs.length]=s; objs=objs2; write2File(objs);//每次添加学生信息,都会向文件中重新写入所有信息 textUser.append(s.toString()+"\n");//或者 textUser.setText(readFromFile());//在文本域中显示学生信息 } } //从文件中把所有对象读取出来,并且拼接成一个字符串返回 private String readFromFile() { String str=""; try { in = new ObjectInputStream(new FileInputStream(fileName));//in流,必须套接new Object[] objs=(Object[])in.readObject(); for (Object obj:objs) { str =str+ obj.toString() + "\r\n"; } } catch (EOFException e) { } catch (Exception e) { // e.printStackTrace(); System.out.println("软件第一次运行,数据为空"); return ""; } return str; } private Object[] readObjectFromFile() { Object objs[]=null; int i=0; try { ObjectInputStream in = new ObjectInputStream(new FileInputStream(fileName)); objs=(Object[])in.readObject();//从文件中读取信息存储到数组中 } catch (EOFException e) { } catch (Exception e) { // e.printStackTrace(); System.out.println("软件第一次运行,数据为空"); return new Object[0]; } return objs; } //把对象s写到一个文件中(例如:student.dat) private void write2File(Object[] objs2) { try { out=new ObjectOutputStream(new FileOutputStream(fileName)); out.writeObject(objs2); } catch (Exception e) { e.printStackTrace(); } } }
运行结果:
相关文章推荐
- 【java】... 不定长度参数
- [Drools]JAVA规则引擎 -- Drools
- SpringMVC无法接收日期类型的参数
- 遍历Map的四种方法
- date java 时间相关
- 34.Search for a Range LeetCode Java版代码
- 23种设计模式再回顾
- Spring @ControllerAdvice @ExceptionHandler
- JAVA学习(3)数据类型:byte
- 《排序算法》——希尔排序,桶式排序(Java)
- MyBatis3.3.0关于invalid comparison: java.sql.Timestamp and java.lang.String异常的解决
- Maven那点事儿(Eclipse版)
- java.lang.Math类中包含基本的数字操作
- Eclipse 的 Workspace 下边有一个 .metadata 的目录,是做什么用的?
- 使用JDK的MessageDigest类进行加密
- eclipse中 将java项目转换为web项目
- eclipse中mahout源码的导入及编译
- 错误记录--The import XXX cannot be resolved
- Eclipse Debug 的source not found问题
- java 几种算法