模拟登陆系统

学习了几个星期的java,写了一个自己的作品。用的知识很少,不过还是很开始。虽然写得很差,不过我希望未来会变得更好,分享下自己的快乐。谢谢能看完的程序的人,如果可以帮我指出不足,越多越好。
项目要求:
题目: 简单的模拟一个用户管理系统(用容器充当数据库)

用户表(User, 选择合适的数据结构来模拟实现): 编号(id), 姓名(name), 密码(password), 性别(sex), 年龄(age), 邮箱(mail), 住址(address)

姓名不能包含0~9的数字且长度必须在[1, 15], 密码只能是英文字符且长度必须在[6~10]

要求实现功能:

1> 模拟用户注册(添加用户, 要求检测注册信息是否合法, 不合法则不让注册)

2> 模拟管理员登陆(登录需要输入用户名和密码, 登陆后才可进行以下操作)

3> 模拟显示所有用户列表详细信息

4> 模拟查找用户信息(输入用户名查找)

5> 模拟删除用户(根据用户名删除, 显示删除后的所有用户列表)

PS: 涉及的技术有, Java基本语法, 面向对象, 常用类, 异常处理, 容器(缺少使用这里列出来的其中一项, 则视为不及格。)

package com.gdut;

@SuppressWarnings("serial")
/*
 * 这个是自己自定义的异常
 */
public class MyException extends Exception {
	public MyException(String message){
	}
}


package com.gdut;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
/*
 * 重写ObjectOutputStream
 */
class MyObjectOutputStream extends ObjectOutputStream{
	 public MyObjectOutputStream() throws IOException {
	  super();
	 }
	 
	 public MyObjectOutputStream(OutputStream out) throws IOException {
	  super(out);
	 }
	 @Override
	 protected void writeStreamHeader() throws IOException {
	  return;
	 }
}





package com.gdut;
import java.io.Serializable;
/*
 * 这个是Person,是用来以一个整个对象复制出用户
 */
@SuppressWarnings("serial")
public  class Person implements Serializable{
	private int age;
	private int id;
	private String name,password,sex,mail,address;
	int choice;
	
	Person(int id,String name,String password,String sex,int age,
			String mail,String address){
		this.setId(id);
		this.setName(name);
		this.setPassword(password);
		this.setSex(sex); 
		this.setAge(age);
		this.setMail(mail);
		this.setAddress(address);
	}
	Person(String name,String password){
		this.setName(name);
		this.setPassword(password);
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getMail() {
		return mail;
	}

	public void setMail(String mail) {
		this.mail = mail;
	}

	public String getAddress() {
		return address;
	}

	public void setAddress(String address) {
		this.address = address;
	}
	public String toString() {  
        return "Id :"+ id +'\t' + "用户名 :"+ name + '\n' + "密码 :"+ password + '\t' +
        		"性别 :"+ sex + '\n' +"A年龄 :"+ age + '\t' +"邮箱 :"+ mail + '\n' +
        		"地址 :"+ address ;
    }  
}
	




package com.gdut;

import java.io.*;
/*
 * author LiuYanming
 */
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Scanner;

import javax.xml.ws.FaultAction;

@SuppressWarnings("unused")
public class User {
	private static int choice; //用来选择 登录或注册的控制数字
	static String choosing;// 用来实现功能的控制数字
	static String rewriting;//用来修改用户的字符串
	static int time = 0;
	static int m;//猜拳计数
	int age;//下面这些变量时供User的对象使用的,可以做赋值等
	int id;
	String name,password,sex,mail,address;
/*
 *  这个方法是当我们进入登陆系统时。可以根据自己是否已经有注册来选择;
 */
	public void choose() throws IOException{
		System.out.println("登陆系统提示:您是否已经注册:");
		System.out.println("未注册,请输入数字:1  ***  已注册,请输入数字:2");
		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
		choice = Integer.parseInt(input.readLine());
		for(int j=1;j<=3;j++){
			if(choice == 1){
				this.Register();
				break;
			}
			else if(choice == 2){
				break;
			}
			else{
				System.out.println("您还有" +(3-j) +"次选择正确的选项");
				BufferedReader input1 = new BufferedReader(new InputStreamReader(System.in));
				choice = Integer.parseInt(input1.readLine());
				if(j ==3){
					System.out.println("由于您多次未能正确登陆或注册,系统已自动关闭功能。");
				}
			}
		}
	}
/*
 * 这个方法是未注册用户填写注册信息,在注册过程中会有提示所填信息的错误
 */
	public void Register() throws IOException{
		BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("请在输入所提示的内容:");
		System.out.print("ID:");
		id = Integer.parseInt(input.readLine());
		System.out.print("用户名:");
		name = input.readLine();
		char[] namelist = name.toCharArray();
		if(name.length()>0&&name.length()<=15){
			for(int i=0;i<name.length();i++){
				if(namelist[i]>='0'&& namelist[i]<='9'){
					System.out.println("友情提示:用户名不能包含0~9的数字且长度必须在[1, 15]");
					break;
				}
			}
		}else
			System.out.println("友情提示:用户名不能包含0~9的数字且长度必须在[1, 15]");
		System.out.print("密码:");
		password = input.readLine();
		System.out.print("性别:");
		sex = input.readLine();
		System.out.print("年龄:");
		age = Integer.parseInt(input.readLine());
		System.out.print("邮箱:");
		mail = input.readLine();
		System.out.print("地址:");
		address = input.readLine();		
	}
/*
 * 这个方法是已经注册号的用户只输入你的用户名和密码进行登录
 */
	public void Landed() throws IOException{
		BufferedReader Landeding = new BufferedReader(new InputStreamReader(System.in));
		System.out.println("***请输入您的用户名和密码***");
		System.out.println("Name:");
		name = Landeding.readLine();
		System.out.println("Password:");
		password = Landeding.readLine();
	}
	/*
	 * 这个方法是从我们数据文件读出已经注册的用户
	 */
  /*  public Object inputfile(String fileName) {  
    	  
        FileInputStream File1 = null;  
        ObjectInputStream Stream = null;  
        try {  
            File1 = new FileInputStream(fileName);  
            Stream = new ObjectInputStream(File1);  
            Object object = Stream.readObject();  
            return object;  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            if (File1 != null) {  
                try {  
                    File1.close();  
                } catch (IOException e1) {  
                    e1.printStackTrace();  
                }  
            }  
            if (Stream != null) {  
                try {  
                    Stream.close();  
                } catch (IOException e2) {  
                    e2.printStackTrace();  
                }  
            }  
        }  
        return null;  
    }*/
	/*
	 * 这个方法是用文件存用户的信息,在文件里面保存起来如果文件里面已经有了对象,就从后面
	 * 添加进去,而且不要加上重复的Header。方法已经重写。
	 */
    public void outputfile(Object obj, String outputFile,boolean append) {
    	FileOutputStream File1 = null;
        ObjectOutputStream Stream1 = null;    
        try {  
            File1 = new FileOutputStream(new File(outputFile),true);
            if(new File(outputFile).length()<1){
            	Stream1 = new ObjectOutputStream(File1);
            }else{
            	Stream1 = new MyObjectOutputStream(File1);
            }  
            Stream1.writeObject(obj);  
        } catch (Exception e) {  
            e.printStackTrace();  
        } finally {  
            if (Stream1 != null) {  
                try {  
                    Stream1.close();  
                } catch (IOException e1) {  
                    e1.printStackTrace();  
                }  
            }  
            if (File1 != null) {  
                try {  
                    File1.close();  
                } catch (IOException e2) {  
                    e2.printStackTrace();  
                }  
            }  
        }  
    } 
    /*
     * 猜拳游戏判断
     */
    public static int Judge(int computer,int player){
		int zero = 0;
		if(computer == player )	 System.out.println("O__O...您和电脑打成平手。");
		if((computer-player)==1) 	{
			System.out.println("↖(^ω^)↗...您赢了! "); zero++;
		}
		if((computer-player)==-1) 	{
			System.out.println("(>_<)...您输了! "); zero--;
		}
		if((computer-player)==2) 	{
			System.out.println("(>_<)...您输了! "); zero--;
		}
		if((computer-player)==-2)	{
			System.out.println("↖(^ω^)↗...您赢了! "); zero++;
		}
		return zero;
	}
    /*
     * 这是方法是每一次程序运行时都首先从文件里面读取已经注册的用户
     */
	@SuppressWarnings("unchecked")
	public static void cope(String filename,@SuppressWarnings("rawtypes") List  list) throws ClassNotFoundException{
   	 FileInputStream fis = null;
   	 	ObjectInputStream ois = null;
   	 	try{
   	 		fis = new FileInputStream(filename);
   	 		ois = new ObjectInputStream(fis);
   	 		  list.add((Person)ois.readObject());

   	 		
   	 		//这里存在有问题,因为每次只能返回一个对象,而且这个对象是我们先存进去的。
   	 	}catch (FileNotFoundException e) {
   	 		   e.printStackTrace();
   	 	  } catch (IOException e) {
   	 	   e.printStackTrace();
   	 	  }finally{
   	 	   try {
   	 	    if(fis!=null) fis.close();
   	 	    if(ois!=null) ois.close();
   	 	   } catch (IOException e) {
   	 	    e.printStackTrace();
   	 	   }
   	 	  }
    }
    /*
     * 这个是mian方法,用来启动程序后可以调
     */
	public static void main(String[] args) throws IOException, ClassNotFoundException{
		String filename = "D:/dengluxitong.txt";
		List <Person> alist = new ArrayList<Person>();
		User.cope(filename,alist);
		User user = new User();
		/*
		 * 用户选择注册或登录
		 */
		do{
			user.choose();
		if(choice == 1){//检查用户的信息是否符合注册要求
			try{
				char[] namelist = user.name.toCharArray();
				if(user.name.length()>0&&user.name.length()<=15){
					for(int i=0;i<user.name.length();i++){
						if(namelist[i]>='0'&&namelist[i]<='9'){
							throw new MyException("注意:用户名不能包含0~9的数字且长度必须在[1, 15]!");
						}
					}
				}
				else throw new MyException("注意:用户名不能包含0~9的数字且长度必须在[1, 15]!");
			}catch(MyException e){
				System.out.println("注意:用户名不能包含0~9的数字且长度必须在[1, 15]!");
				System.out.println("出错啦 o(╯□╰)o");
				System.out.println("注册失败:用户名不符合规定格式。");
				System.exit(-1);
			}
			Person person_register= new Person(user.id,user.name,user.password,user.sex,user.age,
					user.mail,user.address);
			System.out.println("*********恭喜您已成功注册*********");
			  user.outputfile(person_register,filename,true);//这个已经注册完成后保存用户信息到文件里面,用户数多了一个.
	        alist.add(person_register); //直接在原容器加上注册的对象
			}
		}while(choice==1); //返回主界面		
		if(choice == 2){//检查用户登录信息是否符合要求
			user.Landed();
			Iterator<Person> iter = alist.iterator();
			  for(;iter.hasNext();) {
				  Person personing = iter.next();
				  if(user.name.equals(personing.getName())&&
							user.password.equals(personing.getPassword())){
						System.out.println("*********您已成功登陆*********");time++;
						break;
				  } 
			  }
			  if(time == 0){
				  System.out.println("——系统检测不到您所登陆的信息,请从新登陆——");
				  System.exit(-1);
			  } 
		}
		/*
		 * 用户功能实现区
		 */
		do{
		System.out.println("---------您可以实现下面的几个功能---------");
		System.out.println("1.显示当前用户信息		2.显示全部用户信息" +'\n' +"3.查找用户信息		4.删除用户" +
				"信息  "+ '\n' + "5.修改用户信息		6.猜拳小游戏" + '\n' + "**********其他.退出登陆**********");
		BufferedReader chosing = new BufferedReader(new InputStreamReader(System.in));
		choosing = chosing.readLine();
		Iterator<Person> iter = alist.iterator();
		switch(Integer.parseInt(choosing)){
			case 1:{//显示当前用户信息
				for(;iter.hasNext();) { 
					Person person1 = iter.next();
					if(user.name.equals(person1.getName())){
						System.out.println(person1);break;
					}
				 }break;
			}
			case 2:{//显示全部用户信息
				for(;iter.hasNext();) { 
					Person person2 = iter.next();
					System.out.println(person2);				
					}break;
			}
			case 3:{//查找用户信息
				System.out.print("请输入您想查询的用户的用户名:");
				BufferedReader user_name = new BufferedReader(new InputStreamReader(System.in));
				String  A = user_name.readLine();
				for(;iter.hasNext();) { 
					Person person3 = iter.next();
					if(A.equals(person3.getName())){
						System.out.println(person3);break;
					}
				}break;
			}
			case 4:{//删除你想删除的用户,并且显示其他用户
				System.out.print("请输入您想删除的用户的用户名:");
				BufferedReader remove_user_name = new BufferedReader(new InputStreamReader(System.in));
				String  B = remove_user_name.readLine();
				List<Person> temp = new ArrayList();
				while(iter.hasNext()) {
					int k = alist.indexOf(iter.next());
					Person person1 = alist.get(k);
					if(B.equals(person1.getName())==false){
						temp.add(person1);
						}
					}
				alist.clear();
				System.out.println("删除成功!");
				Iterator<Person> temping = temp.iterator();
				while(temping.hasNext()){
					alist.add(temping.next());
				}
				System.out.println("***其他用户的数据如下***");
				Iterator<Person> iter1 = alist.iterator();
				for(;iter1.hasNext();) {
					System.out.println((Person)iter1.next());
				}break;
			}
			case 5:{//修改用户信息
				System.out.print("请输入您修改的用户的用户名:");
				BufferedReader rewrite_name = new BufferedReader(new InputStreamReader(System.in));
				String B = rewrite_name.readLine();
				Iterator<Person> iter1 = alist.iterator();
				for(;iter1.hasNext();) {
					int k = alist.indexOf(iter1.next());
					Person person1 = alist.get(k);
					if(B.equals(person1.getName())){
						do{
						System.out.println("请选择您想修改的用户信息");
						System.out.println("1.用户名 	2.密码	3.性别	4.年龄	5.邮箱	6.地址	其他.退出修改");
						BufferedReader rewrite = new BufferedReader(new InputStreamReader(System.in));
						rewriting = rewrite.readLine();
						switch(Integer.parseInt(rewriting)){
							case 1:{
								System.out.print("请输入您想重新改的用户名:");
								BufferedReader rewritename = new BufferedReader(new InputStreamReader(System.in));
								person1.setName(rewritename.readLine());
							}break;
							case 2:{
								System.out.print("请输入您想重新改的密码:");
								BufferedReader rewritepassword = new BufferedReader(new InputStreamReader(System.in));
								person1.setPassword(rewritepassword.readLine());
							}break;
							case 3:{
								System.out.print("请输入您想重新改的性别:");
								BufferedReader rewritesex = new BufferedReader(new InputStreamReader(System.in));
								person1.setSex(rewritesex.readLine());
							}break;
							case 4:{
								System.out.print("请输入您想重新改的年龄:");
								BufferedReader rewriteage = new BufferedReader(new InputStreamReader(System.in));
								person1.setAge(Integer.parseInt(rewriteage.readLine()));
							}break;
							case 5:{
								System.out.print("请输入您想重新改的邮箱:");
								BufferedReader rewritemail = new BufferedReader(new InputStreamReader(System.in));
								person1.setMail(rewritemail.readLine());
							}break;
							case 6:{
								System.out.print("请输入您想重新改的地址:");
								BufferedReader rewriteaddress = new BufferedReader(new InputStreamReader(System.in));
								person1.setAddress(rewriteaddress.readLine());
							}break;
							default :{System.out.println("您选择退出修改。"+'\n'+"您当前信息如下:");}
						}
					}while(Integer.parseInt(rewriting)>=0&&Integer.parseInt(rewriting)<=6);
						alist.set(k,person1);
						System.out.println(person1);
				}//跳出for循环
			}break;
			}
			case 6:{//玩猜拳游戏		
				System.out.println("***下面是三局两胜制的猜拳游戏***");
				System.out.println("游戏规制:");
				System.out.println("玩家输入1-3数字来选择所出的方式:1——石头、2——剪刀、3——布");
				for(int computer,player,j=1;j<=3;j++){
					System.out.print("第"+ j +"局 : ");
					BufferedReader mora = new BufferedReader(new InputStreamReader(System.in));
					player = Integer.parseInt(mora.readLine());
					computer=(int)Math.rint(Math.random()*1+2);
					m+=User.Judge(computer, player);
				}
				if(m==0)System.out.println("居然打成平手,再接再厉吧!");
				else{
					if(m>0) System.out.println("最终你成功击败了电脑O(∩_∩)O");
					else System.out.println("最终您不敌电脑o(╯□╰)o");
				}break;
			}
			default :{
				System.out.println("您已经退出登录,感谢使用本次系统。");
				System.exit(-1);}
			}
		 }while(Integer.parseInt(choosing)>=1||Integer.parseInt(choosing)<=6);
	}
}


 



项目心得:
1. 每一个类都能重写equals,可是一般需要重写hashcode;
比如说你想写比较一个类,你可以自己重写equal:
    public boolean equals(Object anObject){
    在这个方法里面自己要去写this.XXXX和anObject的XXXX各种比较。
    }
2.readObjecrt返回的Object可以强制转换为自己需要的东西;
    Person person  = (Person)  ois.readObject();
或者存在List里面:    (List<Person> alist = new Arraylist();) alist.add((Person)ois.readObject());

3.serialize方法实现了对象的序列化功能,讲对象序列化到文件,使用了文件的输出流ObjectOutputStream 的writerObject方法一次写入一个对象,对象在文件中按写入顺序存储。
deserialize方法实现反序列化,从文件将对象反序列化到内存,使用了ObjectIntputStream 的readObject方法,因为序列化对象是按照写入顺序存储的,所以在反序列化时必须按照写入顺序读取(需要重写ObjectOutputStream)

4.ObjectOutputStream有锁机制,一次只能读取一个对象;

5.EOFException的解决方法还不清楚;

6.(1) 如果文件中原来就有的对象,你不需要修改,而只是在类型改变以后,在文件末尾追加新类型的对象,直接通过FileOutputStream(file,true)来实现。
(2) 如果文件中原来有的对象需要修改,不管是某一个还是全部,都必须readObject所有原有的文件中的对象,然后对这些对象中需要修改的进行set操作,在把这些对象一个一个通过FileOutputStream(file,false)写回到原来的文件中覆盖掉。如果要修改属性,只能全部拿出来后修改后拿回去。
注意:当我们想要向一个已经存在的文件中追加对象时,应该重写ObjectOutputStream的writeStreamHeader()方法,并空实现。因为,ObjectOutputStream在写入数据的时候会加上一个特别的流头(Stream Header),在读取数据的时候会先检查这个流头。所以我们在向文件中追加对象的时候ObjectOutputStream就会再次向文件中写入流头,这样在读取对象的时候会发生StreamCorrupedException异常。

7.如果是a—b,m=(int)Math.rint(Math.random()*(b-a)+a)随机数万能公式

8.迭代输出:Iterator的用法:如果使用迭代的方式去操作对象while (iter.hasNext())然后去用集合删除中间的某一个对象,会抛出异常,如果remove的对象在最后则不会,自己现在还 不是很清楚怎么重写remove,所以一般我们都是用Iterator的对象来remove!内容确实被删除了,但是迭代输出在内容删除之后就终止了。

9.如果你的文件里面已经序列化多个对象,可是想把它读出来用了while((user=(User)ois.readObject())!=null){list.add(user);}这个就会抛出异常,好像是文件被读到没有东西的时候就抛出来了;如果是for循环有得知道具体有多少对象, 有人建议用把整个List的集合序列化?

10.怎么重写hashcode

11.学会了for循环的增强使用

12.巩固了一些基础知识,学会了耐心,增加了信息。
(以上红色的都表示有疑惑,希望能帮我指出来怎么办,还有程序的不足。)

改善:可以把程序整个集合存进去,然后每次就把整个几个弄出来,这样就解决了多次读取文件抛出异常的问题,程序每次开始运行的时候就读取出来,容器就有了东西,这样就可以实现本地不用注册就能登录,然后在程序的最后把容器的全部东西覆盖掉文件里面,就能实现保存,这样可以吗

猜你喜欢

转载自775121986.iteye.com/blog/1850624