奥运奖牌中文系统(IO版)

一.说明


此案例是继上一篇博客"奥运奖牌中文系统"的IO实现版本。就是序列化和反序列化流来实现。(把对象写入到本地文件中)。


二.序列化和反序列化流概述


序列化:把Java的基本数据类型或Java对象,转变为字节数据,然后输出到流中。

构造函数:
ObjectOutputStream(OutputStream out) 创建写入指定 OutputStream 的 ObjectOutputStream。

ObjectOutputStream负责把Java数据转为字节,然后写到普通的OutputStream中。

反序列化:从流中加载字节数据,然后把字节数据转变为Java基本类型或Java对象。(把存入到本地文件的数据读取出来)

构造函数:
ObjectInputStream(InputStream in)创建从指定 InputStream 读取的 ObjectInputStream。


三.序列化和反序列化的注意事项


序列号使用的原因:
当一个类的对象要被序列化时,底层会根据类的字节码文件计算得出一个long数值,称为版本号,这个版本号会随着对象一起保存到流中。

当我们进行反序列化时,会从流中读取对象以及原版本号,然后再根据当前类的字节码计算一个新的版本号,两者对比,如果一致,证明类没有改变,可以进行反序列化,如果不一致,证明类发生了改变,不能序列化,抛出InvalidClassExcetion


1.序列化对象的类需要实现序列化接口,才能进行序列化。

2.序列化时候,为了防止读写时,数据的版本号不同而导致,读取异常。所以需要一个固定的序列化变化,这样在改变修饰符时就不会出现异常。


四.序列化和反序列化IO版实现


1.country类

package cn.jason;

import java.io.Serializable;

/**
 * 这是封装所有国家信息的类
 * 
 * @blog http://blog.csdn.net/yan_yuhan
 * @author Jason
 * @version 1.2
 * @2016年9月15日 上午0:41:13
 */
public class Country implements Serializable{
	private static final long serialVersionUID = -6944809620446823801L;
	// 定义国家名称
	private String countryName;
	// 定义金牌数
	private String gold;
	// 定义银牌数
	private String sliver;
	// 定义铜牌数
	private String copper;
	// 定义奖牌总数,按照奖牌总数排序
	private int medalSum;

	// 国家类的无参构造
	public Country() {
		super();
	}

	// 国家类的有参构造
	public Country(String countryName, String gold, String sliver, String copper) {
		super();
		this.countryName = countryName;
		this.gold = gold;
		this.sliver = sliver;
		this.copper = copper;
	}

	// get和set方法
	public String getCountryName() {
		return countryName;
	}

	public void setCountryName(String countryName) {
		this.countryName = countryName;
	}

	public String getGold() {
		return gold;
	}

	public void setGold(String gold) {
		this.gold = gold;
	}

	public String getSliver() {
		return sliver;
	}

	public void setSliver(String sliver) {
		this.sliver = sliver;
	}

	public String getCopper() {
		return copper;
	}

	public void setCopper(String copper) {
		this.copper = copper;
	}

	public int getMedalSum() {
		return Integer.parseInt(gold) + Integer.parseInt(sliver) + Integer.parseInt(copper);
	}

	// 重写toString方法
	@Override
	public String toString() {
		return "国家名字是: " + countryName + "\t金牌奖牌数是:" + gold + "\t银牌数是:" + sliver + "\t铜牌数是:" + copper;
	}

}

2.Check类

package cn.jason;

import java.util.Scanner;

/**
 * 这是用于对信息校验的类
 * 
 * @blog http://blog.csdn.net/yan_yuhan
 * @author Jason
 * @version 1.2
 * @2016年9月15日 上午0:41:13
 */
public class Check {
	// 创建键盘录入对象
	private Scanner sc = new Scanner(System.in);

	/**
	 * 这是校验录入的字符串是否为符合中文要求
	 */
	public boolean judgeString(String countryName) {

		// 定义匹配中文的正则表达式
		String regex = "[\u4e00-\u9fa5]+";

		// 对字符串进行校验
		if (!countryName.matches(regex)) {
			System.out.println("你输入的不符合要求,这是中文版系统,请输入中文国家名称:");
			return false;
		}
		return true;
	}

	/**
	 * 这是校验奖牌数量是不是数字的方法
	 * 
	 * @param string
	 *            传过来的参数
	 */
	public boolean judgeInteger(String string) {
		// 定义匹配数字的正则表达式
		String regex = "\\d+";
		// 对字符串进行校验
		if (!string.matches(regex)) {
			System.out.println("你输入的不符合要求,这是中文版系统,请输入中文国家名称:");
			return false;
		}
		return true;
	}
}

3.OperationMethod类

package cn.jason;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.ListIterator;
import java.util.Scanner;
import java.util.TreeSet;

/**
 * 这是用户操作的类
 * 
 * @blog http://blog.csdn.net/yan_yuhan
 * @author Jason
 * @version 1.2
 * @2016年9月15日 上午0:41:13
 */
public class OperationMethod {
	// 创建集合对象
	// 这里集合必须是静态,静态保证只要一个对象。如果不是静态,多个类之间调用会出现多次创建集合对象,导致元素读取异常。
	public static List<Country> list = new ArrayList<Country>();
	// 创建校验类对象
	private static Check check = new Check();
	// 创建键盘录入对象
	private Scanner sc = new Scanner(System.in);
	
	/**
	 * 这是把集合中的对象序列化到本地文件中
	 */
	public void store() {
		//创建序列化流
		ObjectOutputStream oos=null;
		try {
			oos = new ObjectOutputStream(new FileOutputStream("CountryIfo.txt"));
			//把list集合对象写入文件中
			oos.writeObject(list);
		} catch (IOException e1) {
			e1.printStackTrace();
		}finally {
			try {
				//如果关联文件异常,那么就不用关闭流。在此进行判断
				if(oos!=null)
					oos.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		
	}

	/**
	 * 这是添加国家信息的方法 
	 * 分别对字符串进行校验,如果校验成功。那么直接把国家的名称、金牌、银牌
	 * 铜牌的数量信息封装到国家对象中,然后把国家对象存储到集合中。
	 */
	public void addCountryIfo() {
		// 录入国家名称
		System.out.println("请输入国家名称:");
		String countryName = sc.nextLine();
		// 校验字符串是否正确
		if (!check.judgeString(countryName))
			addCountryIfo();
		// 查看录入的信息是否重复
		for (Country country : list) {
			if (countryName.equals(country.getCountryName())) {
				System.out.println("你添加的国家姓名已经存在");
				addCountryIfo();
			}
		}

		// 对金牌、银牌、铜牌的校验
		boolean flag = false;

		String gold = null;
		String sliver = null;
		String copper = null;
		while (true) {
			// 录入金牌数量
			System.out.println("请输入金牌数量:");
			gold = sc.nextLine();
			// 对金牌的数据类型进行校验
			if (check.judgeInteger(gold))
				break;
		}

		while (true) {
			// 录入银牌数量
			System.out.println("请输入银牌数量:");
			sliver = sc.nextLine();
			// 对银牌的数据类型进行校验
			if (check.judgeInteger(sliver))
				break;
		}

		while (true) {
			// 录入铜牌数量
			System.out.println("请输入铜牌数量:");
			copper = sc.nextLine();
			// 对铜牌的数据类型进行校验
			if (check.judgeInteger(copper))
				break;
		}
		
		// 把国家信息封装到国家对象中
		Country c = new Country(countryName, gold, sliver, copper);
		// 把封装好的国家对象存储到集合中
		list.add(c);
		//序列化到本地文件
		store();
		// 调用继续输入菜单
		continueInput();
	}

	/**
	 * 这是继续输入的方法
	 * 当提示是否继续添加元素时,如果输入"y",那么调用添加功能继续添加元素。 如果输入"n",那么调用返回上一级菜单。
	 * 否则进行信息错误提示,要求重新输入。
	 */
	public void continueInput() {
		System.out.println("是否继续添加元素?y/n");
		String choice = sc.nextLine();

		if (choice.equalsIgnoreCase("y"))
			// 调用增加元素的方法
			addCountryIfo();
		else if (choice.equalsIgnoreCase("n")) {
			// 调用返回菜单
			new Menu().returnMain();
		} else {
			System.out.println("你输入有误,请重新输入");
			// 调用再次输入方法
			continueInput();
		}
	}

	/**
	 * 这是查找全部信息的方法 
	 * 如果集合长度大于0,那么输出排好序的信息。否则进行错误提示。
	 */
	public void findAll() {
		// 先对集合长度进行判断
		if (list.size() > 0)
			// 如果长度大于0就遍历集合,并且对元素按照金牌总数排序
			SortMedal(list);
		else
			// 对错误信息进行提示
			System.out.println("没有任何国家信息");
		// 返回上一级菜单
		new Menu().returnFindMenu();
	}

	/**
	 * 这是查询单个奥运奖牌信息的方法 
	 * 当需要输入国家名称时,先进行字符串校验。若是不正确,那么直接进入下一次循环
	 * 对集合长度判断是否大于0,如果集合还没有录入数据,那么不应该继续输入,所以进行校验。
	 */
	public void findSingle() {
		// 定义布尔标记
		boolean flag = false;

		wc: do {
			// 接收录入数据
			System.out.println("请输入要查看国家的名称:");
			String newCountryName = sc.nextLine();

			// 校验字符串是否符合要求
			if (!check.judgeString(newCountryName))
				continue wc;
			
			if (list.size() > 0) {
				// 遍历集合
				for (Country country : list) {
					if (country.getCountryName().equals(newCountryName)) {
						System.out.println(country);
						flag = true;
						break;
					}
				}
			} else {
				System.out.println("抱歉,没有国家信息");
				break;
			}

			// 提示是否继续查看下一个国家信息
			System.out.println("是否要继续查看下一个国家信息?y/n");
			String choice = sc.nextLine();
			if (choice.equalsIgnoreCase("y"))
				flag = false;
			if (choice.equalsIgnoreCase("n"))
				break;
			else
				System.out.println("你输入有误,请重新输入");

		} while (!flag);

		// 返回查询菜单
		new Menu().returnFindMenu();
		// 调用返回主菜单方法
		// new Menu().returnMain();

	}

	/**
	 * 这是按照金牌总数排序的方法 
	 * 先创建TreeSet集合对象,把list集合的数据存储到TreeSet集合中排好序,
	 * 然后遍历TreeSet集合输出数据。
	 */
	public void SortMedal(List<Country> list) {
		// 用TreeSet集合进行排序
		TreeSet<Country> ts = new TreeSet<Country>(new Comparator<Country>() {

			@Override
			public int compare(Country o1, Country o2) {
				return o2.getMedalSum() - o1.getMedalSum();
			}
		});

		// 把list集合元素存储到TreeSet集合
		for (Country country : list) {
			ts.add(country);
		}
		// 遍历TreeSet集合,输出数据
		for (Country country : ts) {
			System.out.println(country);
		}
	}

	/**
	 * 这是修改金牌数量的方法
	 * 先对国家名称进行校验,校验正确后录入金牌的数量 然后遍历集合进行移除原集合的信息,在添加新的金牌数量存储到集合中
	 * 最后进行提示,修改成功,返回上一级菜单。
	 */
	public void modifyGold() {
		// 接收校验正确的国家名称
		String newCountryName = retrunCountryName();

		String gold = null;
		while (true) {
			// 录入金牌数量
			System.out.println("请输入金牌数量:");
			gold = sc.nextLine();
			// 校验字符串
			if (check.judgeInteger(gold))
				break;
		}

		// 遍历集合进行修改金牌数量
		for (ListIterator<Country> it = list.listIterator(); it.hasNext();) {
			Country c = it.next();
			if (c.getCountryName().equals(newCountryName)) {
				// 添加新的信息
				c.setGold(gold);
				list.add(c);
				//序列化到本地文件
				store();
				break;
			}
		}
		// 对修改操作进行提示
		System.out.println("修改成功");
		// 返回修改菜单
		new Menu().returnModifyGoldMenu();
		// 返回主菜单
		new Menu().returnMain();
	}

	/**
	 * 这是修改银牌数量的方法 
	 * 先对国家名称进行校验,校验正确后录入金牌的数量 然后遍历集合进行移除原集合的信息,在添加新的银牌数量存储到集合中
	 * 最后进行提示,修改成功,返回上一级菜单。
	 */
	public void modifySliver() {
		// 拿到校验好的国家名称
		String newCountryName = retrunCountryName();

		String sliver = null;
		while (true) {
			// 录入金牌数量
			System.out.println("请输入银牌数量:");
			sliver = sc.nextLine();
			// 校验字符串
			if (check.judgeInteger(sliver))
				break;
		}
		// 遍历集合进行修改金牌数量
		for (ListIterator<Country> it = list.listIterator(); it.hasNext();) {
			Country c = it.next();
			if (c.getCountryName().equals(newCountryName)) {
				c.setSliver(sliver);
				list.add(c);
				//序列化到本地
				store();
				break;
			}
		}
		System.out.println("修改成功");
		// 返回修改菜单
		new Menu().returnModifySliverMenu();
		// 返回主菜单
		new Menu().returnMain();
	}

	/**
	 * 这是修改铜牌数量的方法 
	 * 先对国家名称进行校验,校验正确后录入金牌的数量 然后遍历集合进行移除原集合的信息,在添加新的铜牌数量存储到集合中
	 * 最后进行提示,修改成功,返回上一级菜单。
	 */
	public void modifyCopper() {
		// 拿到校验好的国家名称
		String newCountryName = retrunCountryName();

		String copper = null;
		while (true) {
			// 录入金牌数量
			System.out.println("请输入铜牌数量:");
			copper = sc.nextLine();
			// 校验字符串
			if (check.judgeInteger(copper))
				break;
		}

		// 遍历集合进行修改金牌数量
		for (ListIterator<Country> it = list.listIterator(); it.hasNext();) {
			Country c = it.next();
			if (c.getCountryName().equals(newCountryName)) {
				c.setCopper(copper);
				list.add(c);
				//序列化本地文件
				store();
				break;
			}
		}
		System.out.println("修改成功");
		// 返回修改菜单
		new Menu().returnModifyCopperMenu();
		// 返回主菜单
		new Menu().returnMain();
	}

	/**
	 * 这是对奖牌数量修改时,对重复代码进行封装的一个返回国家名称方法 对金牌、银牌、铜牌进行修改时,都要验证国家名称才能修改。
	 * 
	 * @return 校验好的国家名称
	 */
	public String retrunCountryName() {
		// 定义标记控制循环
		boolean flag = false;
		String newCountryName = null;
		do {
			System.out.println("请输入要修改的国家名称:");
			newCountryName = sc.nextLine();

			if (check.judgeString(newCountryName)) {
				// 遍历集合并且对国家名称进行校验
				for (Country country : list) {
					if (country.getCountryName().equals(newCountryName)) {
						flag = true;
						break;
					}
				}

				if (!flag) {
					// 对错误信息进行校验
					System.out.println("抱歉,你输入的国家信息不存在");
					// 返回修改菜单
					new Menu().returnModifyGoldMenu();
					// 返回主菜单
					new Menu().returnMain();
				}
			}

		} while (!flag);

		return newCountryName;
	}

	/**
	 * 这是清除全部信息的方法 
	 * 当要求输入时,输入"y",那么清除全部信息。如果输入"n",那么返回清除菜单。否则进行错误提示,要求重新输入。
	 * 此方法没有管理员权限,所以可以直接清除。登录注册信息后续改进。
	 * 
	 * 
	 * 
	 * 
	 */
	public void clearAll() {
		// 定义一个布尔标记
		boolean flag = false;
		do {
			System.out.println("是否要清除全部信息?清除后不可恢复,请慎重。y/n");
			String choice = sc.nextLine();

			if (choice.equalsIgnoreCase("y")) {
				// 如果是,那么清除全部信息
				list.clear();
				//集合序列化本地文件
				store();
				flag = true;
				// 清除提示
				System.out.println("清除成功");
			}

			if (choice.equalsIgnoreCase("n")) {
				flag = true;
			}

			if (!flag)
				System.out.println("你输入有误,请重新输入");

		} while (!flag);

		// 返回清除菜单
		new Menu().returnClearMenu();
	}

	/**
	 * 这是清除单个奥运信息的方法 
	 * 当提示是否要全部清除。当国家名称匹配后进行清除。如果匹配不成功,那么进行错误提示,要求重新输入。 然后进行下一步操作
	 */
	public void clearSingle() {
		// 定义一个布尔标记
		boolean flag = false;
		String newCountryName = null;
		while (true) {
			// 接收信息提示
			System.out.println("请输入要清除的国家名称:");
			newCountryName = sc.nextLine();
			// 对字符串进行校验
			if (check.judgeString(newCountryName))
				break;
		}

		// 对修改后的操作进行提示
		for (Country country : list) {
			if (country.getCountryName().equals(newCountryName)) {
				// 清除当前国家对象
				list.remove(country);
				store();
				System.out.println("清除成功");
				flag = true;
				break;
			}
		}
		// 如果没有匹配成功,那么对错误信息进行提示
		if (!flag)
			System.out.println("你输入有误,没有此信息");
		// 返回清除菜单
		new Menu().returnClearMenu();
		// 返回主菜单
		new Menu().returnMain();
	}
}

4.Menu类

package cn.jason;

import java.util.Scanner;

/**
 * 这是系统所有菜单的类
 * 
 * @blog http://blog.csdn.net/yan_yuhan
 * @author Jason
 * @version 1.2
 * @2016年9月15日 上午0:41:13
 */
public class Menu {
	// 创建键盘录入对象
	private Scanner sc = new Scanner(System.in);
	// 创建操作类对象
	private static OperationMethod om = new OperationMethod();

	/**
	 * 这是主菜单的方法 分别显示五级菜单供客户选择。
	 */
	public void mainMenu() {
		System.out.println("**-------------欢迎来到奥运奖牌中文信息系统-------------**\n");
		System.out.println("\t\t1.添加奥运奖牌信息\n");
		System.out.println("\t\t2.查看奥运奖牌信息\n");
		System.out.println("\t\t3.修改奥运奖牌信息\n");
		System.out.println("\t\t4.删除奥运奖牌信息\n");
		System.out.println("\t\t5.退出系统");
		System.out.println("请选择:");
		// 调用二级菜单
		secondMenu();
	}

	/**
	 *  这是根据主菜单做出相应选择的菜单
	 *  对用户的选择进行判断,分别执行不同的功能模块。
	 */
	public void secondMenu() {
		// 创建标记
		boolean flag = false;
		
		do {
			// 接收录入的数据
			String choice = sc.nextLine();
			// 对选择进行switch语句判断
			switch (choice) {
			case "1":
				// 调用添加元素的方法
				om.addCountryIfo();
				break;
			case "2":
				// 调用查询菜单
				findMenu();
				break;
			case "3":
				// 调用修改菜单
				modifyMenu();
				break;
			case "4":
				// 调用清除菜单
				clearMenu();
				break;
			case "5":
				// 退出系统提示
				System.out.println("欢迎使用奥运奖牌信息系统");
				break;

			default:
				//对错误信息提示
				System.out.println("你输入有误,请重新输入");
				flag = true;
				break;
			}

		} while (flag);
	}
	
	/**
	 * 这是查找信息的菜单
	 * 根据用户的选择进行执行相关模块
	 */
	public void findMenu() {
		System.out.println("**-------------查看奥运奖牌信息>查看方式-------------**\n");
		System.out.println("\t\t1.全部查看\n");
		System.out.println("\t\t2.部分查看\n");
		System.out.println("请选择,输入数字或按'n'返回上一级菜单:");
		// 对用户的选择进行判断,分别执行不同的功能模块。
		findSecondMenu();
	}
	
	/**
	 *  这是查找菜单的子菜单的方法
	 *  对用户的选择进行判断,分别执行不同的功能模块。
	 */
	public void findSecondMenu() {

		// 定义标记控制循环
		boolean flag = false;

		do {
			// 接收录入的数据
			String choice = sc.nextLine();
			// 对选择进行选择性判断,并执行不同的模块
			switch (choice) {
			case "1":
				//执行全部查找,并且按照奖牌总数排序
				om.findAll();
				break;
			case "2":
				//调用单个查找方法
				om.findSingle();
				break;
			case "n":
				// 返回主菜单
				mainMenu();
				break;
				
			default:
				// 进行错误提示
				System.out.println("你输入有误,请重新输入");
				flag = true;
				break;
			}
		} while (flag);
	}
	
	/**
	 * 这是返回查找菜单的方法
	 * 如果输入"y",那么返回查找菜单,如果是"n",那么返回主菜单,否则输入有误,要求重新输入
	 */
	public void returnFindMenu() {
		// 定义标记
		boolean flag = false;
		System.out.println("是否返回查看菜单?y/n");
		String choice = sc.nextLine();

		if (choice.equalsIgnoreCase("y"))
			findMenu();
		// 如果是,返回主菜单
		else if (choice.equalsIgnoreCase("n")) {
			// 如果不是,那么继续进行单个清除
			returnMain();
		} else {
			// 对错误信息进行提示
			System.out.println("你输入有误,请重新输入");
			returnFindMenu();
		}
	}

	/**
	 * 这是修改奥运奖牌信息的子菜单
	 * 根据用户的选择,执行相应的模块
	 */
	public void modifyMenu() {
		System.out.println("**-------------修改奥运奖牌信息>修改方式-------------**\n");
		System.out.println("\t\t1.修改金牌数量\n");
		System.out.println("\t\t2.修改银牌数量\n");
		System.out.println("\t\t3.修改铜牌数量\n");
		System.out.println("请选择,输入数字或按'n'返回上一级菜单:");
		// 对用户的选择进行判断,分别执行不同的功能模块。
		modifySecondMenu();
	}

	/**
	 * 这是对修改菜单进行相应操作的方法
	 * 对用户的选择进行判断,分别执行不同的功能模块。
	 */
	public void modifySecondMenu() {

		// 定义标记控制循环
		boolean flag = false;

		do {
			// 接收录入的数据
			String choice = sc.nextLine();
			// 对选择进行选择性判断,并执行不同的模块
			switch (choice) {
			case "1":
				// 调用修改金牌数量功能
				om.modifyGold();
				break;
			case "2":
				// 调用修改银牌数量功能
				om.modifySliver();
				break;
			case "3":
				// 调用修改铜牌数量功能
				om.modifyCopper();
				break;
			case "n":
				// 返回主菜单
				mainMenu();
				break;
			default:
				// 进行错误提示
				System.out.println("你输入有误,请重新输入");
				flag = true;
				break;
			}
		} while (flag);
	}

	/**
	 * 这是判断是否返回修改金牌数量的菜单
	 */
	public void returnModifyGoldMenu() {
		// 定义布尔标记
		boolean flag = false;
		System.out.println("是否返回修改菜单?y/n");
		String choice = sc.nextLine();

		if (choice.equalsIgnoreCase("y"))
			// 如果是,返回修改主菜单
			modifyMenu();
		else if (choice.equalsIgnoreCase("n")) {
			// 如果不是返回修改菜单,继续进行修改金牌数量
			om.modifyGold();
		} else {
			// 对错误进行提示
			System.out.println("你输入有误,请重新输入");
			returnModifyGoldMenu();
		}
	}

	/**
	 * 这是判读是否返回修改银牌数量的菜单
	 */
	public void returnModifySliverMenu() {
		// 定义标记
		boolean flag = false;
		System.out.println("是否返回修改菜单?y/n");
		String choice = sc.nextLine();

		if (choice.equalsIgnoreCase("y"))
			// 如果是,返回修改主菜单
			modifyMenu();
		else if (choice.equalsIgnoreCase("n")) {
			// 如果不是,继续进项银牌数量修改功能
			om.modifySliver();
		} else {
			// 对错误信息进行提示
			System.out.println("你输入有误,请重新输入");
			returnModifySliverMenu();
		}
	}

	/**
	 * 这是判断是否返回修改铜牌数量的菜单
	 */
	public void returnModifyCopperMenu() {
		// 定义标记
		boolean flag = false;
		System.out.println("是否返回修改菜单?y/n");
		String choice = sc.nextLine();

		if (choice.equalsIgnoreCase("y"))
			// 如果是,返回修改主菜单
			modifyMenu();
		else if (choice.equalsIgnoreCase("n")) {
			// 如果不是,继续进行铜牌数量的修改
			om.modifyCopper();
		} else {
			// 对错误信息进行提示
			System.out.println("你输入有误,请重新输入");
			returnModifyCopperMenu();
		}

	}
	
	/**
	 * 这是清除菜单的子菜单
	 * 根据用户不同的选择,执行相应的模块
	 */
	public void clearMenu() {
		System.out.println("**-------------删除奥运奖牌信息>删除方式-------------**\n");
		System.out.println("\t\t1.清除全部信息\n");
		System.out.println("\t\t2.清除单个信息\n");
		System.out.println("请选择,输入数字或按'n'返回上一级菜单:");
		// 调用二级菜单
		clearSecondMenu();
	}
	
	/**
	 * 这是清除菜单执行方式的方法
	 * 根据不同的选择,执行相应的功能
	 */
	public void clearSecondMenu() {

		// 定义标记控制循环
		boolean flag = false;

		do {
			// 接收录入的数据
			String choice = sc.nextLine();
			// 对选择进行选择性判断,并执行不同的模块
			switch (choice) {
			case "1":
				//调用全部清除功能
				om.clearAll();
				break;
			case "2":
				//调用单个清除的功能
				om.clearSingle();
				break;
			case "n":
				// 返回主菜单
				mainMenu();
				break;
			default:
				// 进行错误提示
				System.out.println("你输入有误,请重新输入");
				flag = true;
				break;
			}
		} while (flag);

	}
	
	/**
	 * 这是是否返回清除菜单的方法
	 * 如果输入"y",那么返回清除菜单。如果是"n",那么返回主菜单
	 * 否则进行错误提示,要求重新输入。
	 */
	public void returnClearMenu() {
		// 定义标记
		boolean flag = false;
		System.out.println("是否返回清除菜单?y/n");
		String choice = sc.nextLine();

		if (choice.equalsIgnoreCase("y"))
			// 如果是,返回主菜单
			clearMenu();
		else if (choice.equalsIgnoreCase("n")) {
			// 如果不是,那么继续进行当个清除
			returnMain();
		} else {
			// 对错误信息进行提示
			System.out.println("你输入有误,请重新输入");
			returnClearMenu();
		}
	}

	/**
	 * 这是返回上主菜单的方法 
	 * 当提示是否返回上一级菜单时,如果输入"y",那么直接返回主菜单。 如果输入"n",那么直接退出系统
	 */
	public void returnMain() {
		// 定义标记
		boolean flag = false;
		System.out.println("是否返回主菜单?y/n");
		String choice = sc.nextLine();

		if (choice.equalsIgnoreCase("y"))
			// 如果是,返回主菜单
			mainMenu();
		else if (choice.equalsIgnoreCase("n")) {
			// 如果不是,退出系统
			System.out.println("欢迎使用奥运奖牌信息系统");
		} else {
			// 对错误信息进行提示
			System.out.println("你输入有误,请重新输入");
			returnMain();
		}
	}
}

5.StartSMS类

package cn.jason;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

/**
 * 这是系统启动类
 * 
 * @blog http://blog.csdn.net/yan_yuhan
 * @author Jason
 * @version 1.2
 * @2016年9月15日 上午0:46:52
 */
public class StartSMS {
	//封装文件信息
	private static File srcFile=new File("CountryIfo.txt");
	
	//系统启动时,对数据进行反序列化,把数据存储到集合中
	static{
		try {
			if(srcFile.exists()){
				//创建反序列化流
				ObjectInputStream ois = new ObjectInputStream(new FileInputStream(srcFile));
				//定义集合
				@SuppressWarnings("unchecked")
				ArrayList<Country> al=(ArrayList<Country>)ois.readObject();
				//把集合中所以的元素添加到list集合中
				OperationMethod.list.addAll(al);
				//关闭流
				ois.close();
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		}
	}
	
	/**
	 * 主方法
	 * @param args
	 */
	public static void main(String[] args) {
		// 创建菜单对象
		Menu menu = new Menu();
		// 调用主菜单
		menu.mainMenu();
	}
}





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值