文件及输入输出流模拟学生系统

好久没更新博客了,中间学的许多内容都没写上。学校的JAVA课程已经结课了,我的JAVA基本算是入门吧,还有许多要学的东西。之前的就不补了,正好老师留的三个大作业基本涵盖了之前学的所有东西,我就把他们写成博客吧。博客只写结构设计和一些关键细节,具体代码链接到Github上。

评价:

我已经决定要从事JAVA开发类的工作了。从这一篇博客开始,我要坚持认真写自己的学习博客了,学校的JAVA课程已经结束,我现在在自己学JAVA更多的内容。这是把这学期学到的东西总结一下,这三个作业都很不错,涵盖了几乎所有知识点,这三个作业应用到我本学期学到的所有内容了。

不过这一篇写的比较早,结构很烂,也没写注释,习惯很不好,只能凑活看看。接下来两篇,我的源代码写的比较规范整齐,还有点参考价值。

好,第一个作业:

1、定义student类,其中包括五个私有变量(stunumber,name,age,sex,score)。

各成员的含义如下:

变量stunumber为字符串类型String,用于存储学生的学号(有8位数字组成)。

变量name为字符串类型String,用于存储学生的姓名。

变量age为int类型,用于存储学生的年龄。    

变量sex为boolean类型,用于存储学生的性别,男生为false,女生为true。变量score为double类型,用于存储学生的成绩。

并对每个变量定义get()(读取变量信息)和set()(设置变量信息)的方法。

赋初值方法包括个参数,用于为变量(stunumber ,nameagesexscore)赋值。

2、定义StudentManager类实现下列要求。

1)利用数组实现至少存储五个学生的信息;(将考生信息作为第一条记录)。

2)定义showStudent()方法打印输出所有的学生信息;

3)定义addStudent (stunumber,name,age,sex,score)方法增加一名新学生的信息,需要判断学号是否重复,如果重复提示用户,并禁止增加新学生信息;

4)定义deleteStudent(stunumber)方法删除一名学生信息(将该学生所有信息清空);

5)定义updateStudent (stunumber,name,age,sex,score)方法修改学生信息;

6)定义selectStudent(stunumber)查询并且输出该名学生的全部信息。

7)定义一个输入界面如下图所示,选择相应的数字执行相应的功能

***************************************************************

                  石家庄铁道大学软件工程系学生信息管理系统

****************************************************************

1、 遍历输出学生信息;

2、 新学生信息录入;

3、 删除学生信息;

4、 修改学生信息;

5、 查询学生信息;

****************************************************************

先把代码给上:

  1 package 课堂测试;
  2 import java.io.*;
  3 import java.io.BufferedReader;
  4 import java.io.BufferedWriter;
  5 import java.io.File;
  6 import java.io.FileInputStream;
  7 import java.io.FileOutputStream;
  8 import java.io.FileReader;
  9 import java.io.FileWriter;
 10 import java.io.IOException;
 11 import java.io.InputStreamReader;
 12 import java.io.OutputStreamWriter;
 13 import java.io.PrintWriter;
 14 import java.util.*;
 15 import javax.swing.JOptionPane;
 16 import java.io.*;
 17 import java.util.Scanner;
 18 import java.util.StringTokenizer;
 19 class Student{
 20     String name,sex,number;
 21     int age;
 22     double grade;
 23     Student(){
 24         this.number="";
 25         this.name="";
 26         this.sex="";
 27         this.age=0;
 28         this.grade=0;
 29     }
 30     Student(String a,String b,int c,double d,String number){
 31         this.number=number;
 32         this.name=a;
 33         this.sex=b;
 34         this.age=c;
 35         this.grade=d;
 36     }
 37     public void setnumber(String a){
 38         this.number=a;
 39     }
 40     public void setsex(String a){
 41         this.sex=a;
 42     }
 43     public void setname(String a){
 44         this.name=a;
 45     }
 46     public void setage(int a){
 47         this.age=a;
 48     }
 49     public void setgrade(double a){
 50         this.grade=a;
 51     }
 52     public void getnumber(){
 53         System.out.println(this.number);
 54     }
 55     public void getname(){
 56         System.out.println(this.name);
 57     }
 58     public void getsex(){
 59         System.out.println(this.sex);
 60     }
 61     public void getage(){
 62         System.out.println(this.age);
 63     }
 64     public void getgrade(){
 65         System.out.println(this.grade);
 66     }
 67     public String toString()
 68     {
 69        return getClass().getName()
 70           + "学号"+number+" "+"姓名"+name+" "+"年龄"+String.valueOf(age)+" "+"性别 男 "+" "+"成绩"+String.valueOf(grade);
 71     }
 72 }
 73 
 74 public class Opstudent {
 75     public static void main(String[] args)throws IOException{
 76         FileWriter fw = null;
 77         int count=5;
 78         Student[] s=new Student[10];
 79         s[0]=new Student("a","男",18,50,"1");
 80         s[1]=new Student("b","男",18,50,"2");
 81         s[2]=new Student("c","男",18,50,"3");
 82         s[3]=new Student("d","男",18,50,"4");
 83         s[4]=new Student("e","男",18,50,"5");
 84         String savepath="C:\experiment.txt";
 85         Write(savepath,s);
 86         Login(s,count);
 87 }
 88     public static void Write(String savepath,Student[] s){
 89         //静态方法存储,可直接调用。
 90         try{
 91             PrintWriter ps = new PrintWriter(new FileWriter(savepath),true);
 92             ps.println(s.length);
 93             ps.println("学号	姓名	年龄	性别	成绩");
 94             for(int i=0;i<s.length-1;i++){
 95                 ps.println(s[i].number+"|"+s[i].name+"|"+String.valueOf(s[i].age)+"|"+s[i].sex+"|"+String.valueOf(s[i].grade));
 96             }
 97             ps.close();
 98         }catch (Exception e){
 99             e.printStackTrace();
100         }
101     }
102     public static void Read(int i){
103         try{
104             String s="";
105             //防止文件建立或读取失败,用catch捕捉错误并打印,也可以用throw
106             /*读入txt文件*/
107             String pathname="C:\experiment.txt";//绝对路径
108             File filename=new File(pathname);//读取路径上的文件
109             InputStreamReader reader=new InputStreamReader(
110                     new FileInputStream(filename));//建立一个输入流对象
111             BufferedReader br=new BufferedReader(reader);//建立一个对象,把文件内容转换为2进制???
112             String line=br.readLine();
113             for(int j=0;j!=i;j++)
114                 line=br.readLine();
115             s=s+line;
116             System.out.println(s);
117             br.close();
118         }catch(Exception e){
119             e.printStackTrace();
120         }
121     }
122     public static void Login(Student[] a,int count)throws IOException{
123         
124         String s1="*****************************************
";
125         s1=s1+"  ***大学软件工程系学生信息管理系统    
";
126         s1=s1+"*****************************************
";
127         s1=s1+"    1、遍历输出学生信息
";
128         s1=s1+"    2、新学生信息录入
";
129         s1=s1+"    3、删除学生信息
";
130         s1=s1+"    4、修改学生信息
";
131         s1=s1+"    5、查询学生信息
";
132         s1=s1+"    6、统计学生不及格人数
";
133         s1=s1+"    7、输入7结束操作";
134         do{
135         System.out.println(s1);
136         Scanner s2=new Scanner(System.in);
137         int i=s2.nextInt();
138         if(i==1)
139             {
140             System.out.println("学号	姓名	年龄	性别	成绩
");
141             for(int x=1;x<=4;x++)
142                 Read(x);}
143         else if(i==2)
144             {
145             Scanner p=new Scanner(System.in);
146             System.out.println("输入学号");
147             a[count].number=p.nextLine();
148             System.out.println("输入姓名");
149             a[count].name=p.nextLine();
150             System.out.println("输入年龄");
151             a[count].age=p.nextInt();
152             System.out.println("输入性别");
153             a[count].sex=p.nextLine();
154             System.out.println("输入分数");
155             a[count].grade=p.nextDouble();
156             count ++;
157             Write("C:\experiment.txt",a);   
158             }
159         else if(i==3){
160             System.out.println("输入学生学号");
161             Scanner ss=new Scanner(System.in);
162             String num=ss.next();
163             BufferedReader in = new BufferedReader(new FileReader("C:\experiment.txt"));
164             String sm = in.readLine();
165             String sm1 = in.readLine();
166             Student[] temp=new Student[6];
167             for(int m=0;m<=6;m++){
168                 String s = in.readLine();
169                 StringTokenizer t = new StringTokenizer(s, "|");
170                 String nu=t.nextToken();
171                 if(nu.equals(num))
172                 {temp[m].name=t.nextToken();
173                 temp[m].age=Integer.parseInt(t.nextToken());
174                 temp[m].sex =t.nextToken();
175                 temp[m].grade=Double.parseDouble(t.nextToken());}
176                 else
177                     m=m-1;
178                 } 
179             Write("C:\experiment.txt",temp);
180             
181             in.close();
182         }
183         else if(i==4){
184             
185         }
186         else if(i==5){
187             BufferedReader in = new BufferedReader(new FileReader("C:\experiment.txt"));
188             int ap = Integer.parseInt(in.readLine());
189             Student[] temp=new Student[1];
190             String sm = in.readLine();    
191             System.out.println(sm);
192             for(int m=1;m<=5;m++){
193                 String s = in.readLine();
194                 StringTokenizer t = new StringTokenizer(s, "|");
195                 System.out.println("学号"+t.nextToken()+" "+"姓名"+t.nextToken()+" "+"年龄"+t.nextToken()+" "+"性别 男 "+" "+"成绩"+t.nextToken());
196                }
197             
198             in.close();
199         }
200         else if(i==6){
201             int nums=0;
202             BufferedReader in = new BufferedReader(new FileReader("C:\experiment.txt"));
203             String sm = in.readLine();
204             String sm1 = in.readLine();
205             System.out.println(sm1);
206             for(int m=1;m<=5;m++){
207             String s = in.readLine();
208             StringTokenizer t = new StringTokenizer(s, "|");
209             String num=t.nextToken();
210             String na11m=t.nextToken();
211             String age=t.nextToken();
212             String sex=t.nextToken();
213             double grade=Double.parseDouble(t.nextToken());           
214             if(grade<=60)
215                 nums++;
216             } 
217             System.out.println("不及格的人数为"+nums);         
218         }
219         else
220             break;
221         }while(true);
222     }
223     }

好了,我来写一下分析。

首先我写了一个Student类,其中包含类的初始化及get和set方法用于输入输出类的信息,很简单不用说。

再写了一个OpStudent类,其中包含主类和实现题目要求的若干个方法。

看到题目所给的几个操作,我用的是文件及输入输出流的操作模拟数据库。

public static void Write(String savepath,Student[] s)

参数:存储路径(绝对路径),类数组

功能:将一个学生的信息保存在savepath表示的路径下的一个txt文件中,各个数据用"|"隔开。

public static void Read(int i)

参数:好像是学生的个数(时间太久,也没加注释,给忘了,)

功能:仅在遍历输出功能中用到,因为带着"|"不方便用于读成Student类,可以按行读取输出。

public static void Login(Student[] a,int count)throws IOException

参数:Student类数组,已录入学生个数

功能:1.显示题目要求的登录界面。2.完成题目要求的操作

好了,很容易看到,我用一个do{}while{]循环来控制操作。这里注意:因为要实现返回界面功能,所以不能只执行一个操作就结束,所以用个循环控制。

好,剩下的就是按题目要求的功能作对应的操作。1、2很简单不说了。

好,我们看到3、5、6都需要把文件中的信息读出来再进行操作。

好,用BufferedReader读都没问题,对吧。为什么这个地方要用BufferedReader方法?因为:我存的时候是按行存储的,所以用到BufferedReader下的readline方法比较方便。

好,3、5、6都用到一个StringTokenizer类,这个类可以指定一个分隔符。好了,看不懂自己去看帮助JDK文档或者百度。

好,4我忘了写了。

原文地址:https://www.cnblogs.com/cxy2016/p/6349410.html