目录

  • 算法
  • 代码
    • pojo
      • Student类
      • Account类
    • data
      • StudentInfo类
    • DAO
      • StudentDAO类
      • AccountDAO类
    • service
      • StudentSystem类
    • Main

算法

排序算法自己曾经的总结,这里不再赘述:链接: https://blog.csdn.net/m0_46113894/article/details/109520450.
文件的存储与读取:

  • 使用BufferReader缓冲流读取,并使用装饰模式,使用输入流与文件流构造
  • 使用BufferWriter写文件,构造时注意:文件流第二个参数写false,这样写的时候不会接着文件的末尾加上去,而是重写文件。
  • 采用特定文本格式存储,每次读取一行,使用String的split方法根据逗号分隔字符串,借此提取出字符串中的信息,并顺序的存入Array List列表中
  • 写的时候顺序遍历列表,通过构造该格式的字符串再一行一行地写入文件

new BufferedReader(new InputStreamReader(new FileInputStream(fileName), “UTF-8”));
new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName, false)));

代码

pojo

Student类

package StudentInfoManage.pojo;/*** @author LiuWei*/
public class Student {private int id;private String name;private String major;private int cpp;private int network;private int dataStructure;private int english;private int total;private int ranking;private static int studentNum=1;public Student(){}/*** 新增学生所需构造函数,id自动生成,提供格式与存储格式相同* @param name* @param major* @param cpp* @param network* @param dataStructure* @param english*/public Student(String name, String major, int cpp, int network, int dataStructure, int english) {this.id=studentNum++;this.name = name;this.major = major;this.cpp = cpp;this.network = network;this.dataStructure = dataStructure;this.english = english;this.total =this.cpp+this.network+this.dataStructure+this.english;this.ranking=0;}/*** 文件读取用,所有参数为String,无id,总分,排名* @param name* @param major* @param cpp* @param network* @param dataStructure* @param english*/public Student( String name, String major, String cpp, String network, String dataStructure, String english) {this.id=studentNum++;this.name = name;this.major = major;this.cpp =Integer.parseInt(cpp);this.network =Integer.parseInt( network);this.dataStructure = Integer.parseInt(dataStructure);this.english = Integer.parseInt(english);this.total =this.cpp+this.network+this.dataStructure+this.english;this.ranking = 0;}/*** 提供所有参数,用于读取文件中学生信息完全都有的情况,所有参数为String* @param id* @param name* @param major* @param cpp* @param network* @param dataStructure* @param english* @param total* @param ranking*/public Student(String id, String name, String major, String cpp, String network, String dataStructure, String english, String total, String ranking) {this.id=Integer.parseInt(id);//遇到更大的id自动按大号生成if(this.id>studentNum){studentNum=this.id+1;}this.name = name;this.major = major;this.cpp =Integer.parseInt(cpp);this.network =Integer.parseInt( network);this.dataStructure = Integer.parseInt(dataStructure);this.english = Integer.parseInt(english);this.total =this.cpp+this.network+this.dataStructure+this.english;this.ranking = Integer.parseInt(ranking);}/*** 用于读取文件的不同情况* @param id* @param name* @param major* @param cpp* @param network* @param dataStructure* @param english*/public Student(String id ,String name, String major, String cpp, String network, String dataStructure, String english) {this.id=Integer.parseInt(id);this.name = name;this.major = major;this.cpp =Integer.parseInt(cpp);this.network =Integer.parseInt( network);this.dataStructure = Integer.parseInt(dataStructure);this.english = Integer.parseInt(english);this.total =this.cpp+this.network+this.dataStructure+this.english;this.ranking = 0;}public int getId() {return id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getMajor() {return major;}public void setMajor(String major) {this.major = major;}public int getCpp() {return cpp;}public void setCpp(int cpp) {this.cpp = cpp;}public int getNetwork() {return network;}public void setNetwork(int network) {this.network = network;}public int getDataStructure() {return dataStructure;}public void setDataStructure(int dataStructure) {this.dataStructure = dataStructure;}public int getEnglish() {return english;}public void setEnglish(int english) {this.english = english;}public int getTotal() {return total;}public void setTotal(int total) {this.total = total;}public int getRanking() {return ranking;}public void setRanking(int ranking) {this.ranking = ranking;}public String getAllInfo(){return new String(id+","+name+","+major+","+cpp+","+network+","+dataStructure+","+english+","+total+","+ranking);}public void setAllScore(int cpp,int network,int dataStructure,int english) {this.cpp = cpp;this.network=network;this.dataStructure=dataStructure;this.english=english;this.total=cpp+network+dataStructure+english;}public void showAll(){System.out.println(id+"  "+name+"   "+major+"  "+cpp+"  "+network+"  "+ dataStructure+"  "+english+"  "+total+"  "+ranking);}}

Account类

package StudentInfoManage.pojo;/*** @author lw*/
public class Account {/**账户编号*/private int accountId;/**账户名称*/private String accountName;/**密码*/private String password;static int accountNum=1;public Account( String accountName, String password) {this.accountId =accountNum++ ;this.accountName = accountName;this.password = password;}public Account() {}public int getAccountId() {return accountId;}public void setAccountId(int accountId) {this.accountId = accountId;}public String getAccountName() {return accountName;}public void setAccountName(String accountName) {this.accountName = accountName;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}
}

data

StudentInfo类

package StudentInfoManage.data;import StudentInfoManage.pojo.Account;
import StudentInfoManage.pojo.Student;import java.io.*;
import java.util.ArrayList;
import java.util.List;/*** @author LiuWei* 该类负责读取文件,将信息保存在List中*/
public class StudentInfo {/**学生类表*/private List<Student> students = new ArrayList<>();private List<Account> accountList=new ArrayList<>();BufferedReader br;BufferedWriter out;String fileName="src/StudentInfoManage/StudentInfo.txt";/**构造函数* 这里读取文件初始化数据*/public StudentInfo() throws IOException {accountList.add(new Account("admin","0000"));try {//初始化输入输出流,注意Reader和Writer只能同时有一个,windows系统只能同时选其一中,否则文件会被清空br = new BufferedReader(new InputStreamReader(new FileInputStream(fileName), "UTF-8"));String contents = null;String[] splitInfo = null;//循环读取所有的文本do {contents = br.readLine();if (contents != null) {splitInfo = contents.split(",");//System.out.println(Arrays.toString(splitInfo));} else {break;}if (splitInfo != null && splitInfo.length == 7) {students.add(new Student(splitInfo[0], splitInfo[1], splitInfo[2], splitInfo[3], splitInfo[4], splitInfo[5], splitInfo[6]));} else if (splitInfo.length == 9) {students.add(new Student(splitInfo[0], splitInfo[1], splitInfo[2], splitInfo[3], splitInfo[4], splitInfo[5], splitInfo[6], splitInfo[7], splitInfo[8]));}} while (contents != null);//System.out.println(students.size());} catch (UnsupportedEncodingException unsupportedEncodingException) {unsupportedEncodingException.printStackTrace();} catch (FileNotFoundException fileNotFoundException) {fileNotFoundException.printStackTrace();} catch (IOException ioException) {ioException.printStackTrace();}br.close();}public void setStudents(List<Student> students) {this.students = students;}/*** 根据线性表重写文件,更新学生信息*/public void update() {//每次更新重新打开输出流,保证每次重写try {out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(fileName, false)));for (Student ele : students) {try {out.write(ele.getAllInfo() + '\n');} catch (IOException e) {e.printStackTrace();}}out.flush();out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}public List<Student> getStudents () {return students;}public List<Account> getAccountList(){return accountList;}
}

DAO

StudentDAO类

package StudentInfoManage.dao;import StudentInfoManage.data.StudentInfo;
import StudentInfoManage.pojo.Student;import java.util.List;
import java.util.Scanner;/*** @author LiuWei*/
public class StudentDAO {private StudentInfo database;public StudentDAO(StudentInfo database) {this.database = database;sortStudent();database.update();}/*** 新增信息* @param student 学生对象*/public void addStudent(Student student){database.getStudents().add(student);sortStudent();database.update();}/*** 更新课程成绩* @param studentId* @param cpp* @param net* @param data* @param eng*/public boolean updateStudent(int studentId,int cpp,int net,int data ,int eng){if(cpp<0||net<0||data<0||eng<0){return false;}for (Student student : database.getStudents()) {if (student.getId()==studentId){student.setAllScore(cpp,net,data,eng);sortStudent();database.update();return true;}}return false;}/*** 根据id查找* @param studentId  id* @return 返回学生对象*/public Student searchByStudentId(int studentId){for (Student student : database.getStudents()) {if (student.getId()==studentId){return student;}}return null;}/*** 根据姓名查找* @param studentName 姓名* @return 返回学生对象*/public Student searchByStudentName(String studentName){for (Student student : database.getStudents()) {if (student.getName().equals(studentName)){return student;}}return null;}/*** 显示所有学生信息*/public List<Student> getAll(){return database.getStudents();}/*** 计算学生的排名*/public void sortStudent(){List <Student>list= database.getStudents();System.out.println("请选择排序方式:");System.out.println("1.双向冒泡排序");System.out.println("2.快速排序");System.out.println("3.希尔排序");System.out.println("4.堆排序");String choice=new Scanner(System.in).next();switch (choice){case "1":duplexSort(list);break;case "3":hillSort(list);break;case "4":heapSort(list);break;default:quickSort(list,0,list.size()-1);}for(int i=0;i< list.size();i++){if(i>0&&list.get(i).getTotal()==list.get(i-1).getTotal()){list.get(i).setRanking(list.get(i-1).getRanking());}else {list.get(i).setRanking(i+1);}}}public boolean deleteStudent(Student stu){List <Student> list=database.getStudents();for (Student student : list) {if (student.getId()==stu.getId()){list.remove(student);quickSort(list,0,list.size()-1);database.update();return true;}}return false;}/*** 双向冒泡排序* @param list 待排序线性表*/public void duplexSort( List <Student>list){int left=0,right = list.size()-1;while(left<right){//左侧扫描for(int j = left+1; j <= right; j++) {if(list.get(left).getTotal()<list.get(j).getTotal()) {Student temp=list.get(left);list.set(left,list.get(j));list.set(j,temp);}}left++;if(left>=right){break;}//右侧扫描for(int j = right-1; j >= left; j--) {if(list.get(right).getTotal()>list.get(j).getTotal()) {Student temp=list.get(right);list.set(right,list.get(j));list.set(j,temp);}}right--;}}/*** 快速排序* @param list 待排序线性表* @param left 左边界* @param right 右边界*/public void quickSort( List <Student>list,int left,int right){if (left > right) {return;}int i = left;int j = right;Student t = list.get(left);while (i != j){while (list.get(j).getTotal() <= t.getTotal()&& (j > i)) {j--;}while (list.get(i).getTotal() >= t.getTotal()&& (j > i)) {i++;}//交换位置if (i < j) {Student temp=list.get(i);list.set(i,list.get(j));list.set(j,temp);}}list.set(left,list.get(i));list.set(i,t);//递归左子序列quickSort(list,left, --i);//递归右子序列quickSort(list,++j, right);return;}/*** 希尔排序* @param list 待排序线性表*/public void hillSort( List <Student>list){int d, i, j;int n=list.size()-1;//多个短序列循环整合for (d=n/2;d>=1;d=d/2) {//每个序列内循环插入每个元素for ( i = d; i <= n; i++) {//存放待插入元素Student temp= list.get(i);//寻找插入位置for (j = i-d; j>=0&&temp.getTotal() >list.get(j).getTotal(); j-=d) {//待插入元素向后移动list.set(j+d,list.get(j));}list.set(j+d,temp);}}}/*** 堆排序* @param list*/public void heapSort( List <Student>list){int i = 0;int n=list.size()-1;//初始建堆,从最后一个分支结点至根结点for (i = n/2+1; i >= 0; i--) {Sift(list, i, n);}//System.out.println(list.get(0).getAllInfo());//重复执行移走堆顶及重建堆的操作for (i=0; i<=n; i++) {// System.out.println(list.get(0).getAllInfo());//交换0和末尾(n-i)的位置Student temp=list.get(0);list.set(0,list.get(n-i));list.set(n-i,temp);Sift(list, 0, n-i-1);}}/*** 创建小根堆* @param list* @param k 当前位置* @param m 最大下标*/void Sift(List<Student> list, int k, int m) {//i指向被筛选结点,j指向结点i的左孩子int i = k, j = 2 * i+1;while (j <= m) {//比较i的左右孩子,j指向两者中的较小者if (j < m &&list.get(j).getTotal() > list.get(j+1).getTotal()) {j++;}//若根结点已经小于左右孩子中的较小者if (list.get(i).getTotal() < list.get(j).getTotal()) {break;} else {Student temp=list.get(i);list.set(i,list.get(j));list.set(j,temp);//被筛结点位于原来结点j的位置i = j; j = 2 * i+1;}}}
}

AccountDAO类

package StudentInfoManage.dao;import StudentInfoManage.data.StudentInfo;
import StudentInfoManage.pojo.Account;/*** @author lw*/
public class AccountDao {/**数据库*/private StudentInfo StudentInfo;/*** 构造函数传入同一个数据库*/public AccountDao( StudentInfo studentInfo) {this.StudentInfo = studentInfo;}/*** 根据用户名查找用户* @param accountName 用户名称* @return 账户对象*/public Account findByName(String accountName){Account account = null;for (Account user : StudentInfo.getAccountList()) {//比较账户名if(user.getAccountName().equals(accountName)){account = user;break;}}return account;}/*** 新增用户* @param account*/public void insert(Account account){StudentInfo.getAccountList().add(account);}
}

service

StudentSystem类

package StudentInfoManage.service;import StudentInfoManage.dao.AccountDao;
import StudentInfoManage.dao.StudentDAO;
import StudentInfoManage.data.StudentInfo;
import StudentInfoManage.pojo.Account;
import StudentInfoManage.pojo.Student;import java.util.Scanner;/*** @author LiuWei*/
public class StudentSystem {private Scanner scanner = new Scanner(System.in);private StudentDAO studentDAO;private AccountDao accountDao;public StudentSystem(StudentInfo studentinfo) {this.accountDao=new AccountDao(studentinfo);this.studentDAO = new StudentDAO(studentinfo);}public void start(){System.out.println("1. 登录");System.out.println("2. 注册");System.out.println("3. 退出系统");System.out.println("请选择:");String choice = scanner.next();switch (choice){case "1"://登录login();mainMenu();break;case "2":regist();break;//注册case "3":System.out.println("退出了系统!");break;default:System.out.println("无效的选项,请重新输入!");start();}}public void  mainMenu(){System.out.println("******************功能菜单****************");System.out.println("1. 新增学生信息");System.out.println("2. 浏览学生信息");System.out.println("3. 删除学生信息");System.out.println("4. 查找学生信息");System.out.println("5. 修改学生信息");System.out.println("6. 退出系统");String choice = scanner.next();switch (choice){case "1":addStudent();mainMenu();break;case "2":showAllStudentInfo();mainMenu();break;case "3":deleStudent();mainMenu();break;case "4":searchStudent();mainMenu();break;case "5":updateStudent();mainMenu();break;case "6":System.out.println("退出了系统!");break;default:System.out.println("无效的选项,请重新输入!");mainMenu();}}/*** 登录*/public void login(){System.out.println("请输入用户名:");String userName = scanner.next();System.out.println("请输入密码:");String password = scanner.next();//通过DAO根据用户名查询数据库中对象Account account = accountDao.findByName(userName);//判断用户是否存在if(account != null){//将数据库中找到的账户,再根据其密码和输入的密码比较if(account.getPassword().equals(password)){System.out.println("登录成功!");}else{System.out.println("密码错误!");login();}}else{System.out.println("用户名不存在!请重新输入");login();}}/*** 注册*/public void regist() {System.out.println("请输入注册的用户名:");String userName = scanner.next();System.out.println("请输入注册的密码:");String password = scanner.next();System.out.println("请再次输入确认密码:");String passwordConfirm = scanner.next();//判断是否密码相同if (password.equals(passwordConfirm)) {String confirmCode=getVerificationCode();System.out.println("请输入验证码");System.out.println("********");System.out.println("* "+confirmCode+" *");System.out.println("********");String userCode=scanner.next();if (userCode.equals(confirmCode)){//判断用户名是否被注册Account account = accountDao.findByName(userName);if (account != null) {System.out.println("该用户名已被注册!输入0返回上一层菜单,其他任意键继续注册");String result = scanner.next();if (result.equals("0")) {start();} else {regist();}} else {//根据注册的信息创建一个账户对象Account registAccount = new Account(userName,password);//将注册的信息写入数据库accountDao.insert(registAccount);System.out.println("注册成功!");//返回起始菜单start();}}else {System.err.println("验证码不正确!请重新输入");regist();}}else {System.err.println("两次输入的密码不一致!请重新输入");regist();}}/*** 生成验证码* @return 验证码String*/public String getVerificationCode(){String code="";for (int i = 0; i < 4; i++) {code+=(int)(Math.random()*10);}return code;}/*** 新增学生*/public void addStudent(){System.out.println("请输入学生姓名");String name=scanner.next();System.out.println("请输入专业");String major=scanner.next();System.out.println("请输入c++成绩");int cpp=toInt(scanner.next());System.out.println("请输入计算机网络成绩");int net=toInt(scanner.next());System.out.println("请输入数据结构成绩");int data=toInt(scanner.next());System.out.println("请输入英语成绩");int eng=toInt(scanner.next());if(cpp<0||net<0||data<0||eng<0){System.err.println("创建失败");return;}studentDAO.addStudent(new Student(name,major,cpp,net,data,eng));System.out.println("创建成功!");}/*** 显示所有信息*/public void showAllStudentInfo(){System.out.println("id "+" 姓名 "+" 专业 "+" c++ "+" 计算机网络 "+"数据结构"+" 英语 "+" 总分 "+" 名次 ");for (Student stu:studentDAO.getAll()){stu.showAll();}}/*** 根据id查找学生,修改四门课成绩*/public void updateStudent(){System.out.println("请输入要修改学生的id");int id=toInt(scanner.next());System.out.println("请输入c++成绩");int cpp=toInt(scanner.next());System.out.println("请输入计算机网络成绩");int net=toInt(scanner.next());System.out.println("请输入数据结构成绩");int data=toInt(scanner.next());System.out.println("请输入英语成绩");int eng=toInt(scanner.next());if(studentDAO.updateStudent(id,cpp,net,data,eng)){System.out.println("修改成功");}else {System.err.println("修改失败");}}/*** 搜索学生*/public void searchStudent(){System.out.println("1. 根据姓名查找");System.out.println("2. 根据id查找");System.out.println("3. 返回上一级");String choice = scanner.next();switch (choice){case "1":System.out.println("请输入姓名");String name=scanner.next();Student stua=studentDAO.searchByStudentName(name);if(stua==null){System.out.println("未查询到");}else {stua.showAll();start();}break;case "2":System.out.println("请输入id");int id=toInt(scanner.next());Student stub=studentDAO.searchByStudentId(id);if(stub==null){System.out.println("未查询到");}else {stub.showAll();start();}break;case "3":start();break;default:System.err.println("无效的选项,请重新输入!");searchStudent();}}/*** 删除学生*/public void deleStudent(){System.out.println("请输入学生的id");int id=toInt(scanner.next());Student stu=studentDAO.searchByStudentId(id);if(stu!=null&& studentDAO.deleteStudent(stu)){System.out.println("删除成功");}else {System.out.println("未查询到该学生");}}/*** 返回字符串的对应数字,如果输入的不是数字返回-1,同时catch异常防止转换函数抛出异常* @param a 输入的字符串* @return 相应的数字*/public int toInt(String a){try {int result=Double.valueOf(a).intValue();return result<0?0:result;}catch (Exception e){return -1;}}
}

Main

package StudentInfoManage;import StudentInfoManage.dao.StudentDAO;
import StudentInfoManage.data.StudentInfo;
import StudentInfoManage.service.StudentSystem;import java.io.IOException;/*** @author LiuWei*/
public class Main {public static void main(String[] args) {StudentInfo database= null;try {database = new StudentInfo();} catch (IOException e) {e.printStackTrace();}StudentSystem sys=new StudentSystem(database);sys.start();}
}

数据结构实践1——学生档案管理系统相关推荐

  1. 数据结构:学生档案管理系统(C++版)

    课题描述: 1.为学生档案管理人员编写一个学生档案管理系统 ,用菜单选择方式完成下列功能: 2.学生档案信息添加:包括学号.姓名.性别.出生日期.学院.专业.班级.身份证号.政治面貌.籍贯.家庭住址. ...

  2. Python高校学生档案管理系统毕业设计源码071528

    Python高校学生档案管理系统 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理.在现实运用中,应用软件的工作规则和开发 ...

  3. 基于java实现的学生档案管理系统毕业论文(可下载)

    目录 摘    要 学生档案管理系统是当今互联网时代下的趋势和不可缺少的一部分,他可以高效快速的完成和解决信息的查询和录入.随着计算机的快速发展和普及,越来越多的办公离不开电脑. 本系统采用B/S模式 ...

  4. 基于C++实现(控制台)学生档案管理系统【100010515】

    程序设计与数据结构综合实践 一.学生档案管理系统 1.1 内容与要求 1.创建功能:初始从文件中读取学生信息(包括学号.姓名.性别等)和学生的课程信息(课程号.课程名.成绩等)添加到顺序表中. 2.显 ...

  5. c语言学生档案管理课设作业,2019-2020年c语言课程设计学生档案管理系统实验报告.doc...

    2019-2020年c语言课程设计学生档案管理系统实验报告.doc 还剩 10页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,喜欢就下载吧,价低环保! 内容要点: *********C 语 ...

  6. 学生管理系统可储存c语言版,学生档案管理系统(C语言).doc

    学生档案管理系统(C语言).doc 河南工业大学 <数据结构>课程设计 学生档案录入查询系统 班级:计算机类1402 学号:201416920214 姓名: 任永坤 目 录 摘 要II 第 ...

  7. python基础项目实践之: 学生通讯录管理系统

    Python课堂基础实践系列: Python基础项目实践之:学生信息管理系统 python基础项目实践之: 学生通讯录管理系统 Python基础项目实践之:面向对象方法模拟简单计算器 Python基础 ...

  8. jsp mysql电子档案管理系统_学生档案管理系统的设计与实现(JSP,MySQL)(含录像)

    学生档案管理系统的设计与实现(,MySQL)(含录像)(开题报告,毕业论文12100字,程序代码,MySQL数据库,答辩PPT) 本文主要工作内容是梳理学生档案管理系统工作的流程,吸收.借鉴先进的指导 ...

  9. java 档案管理系统论文_基于JAVA学生档案管理系统论文.doc

    学生档案管理系统 PAGE II 学生档案管理系统 摘 要 学生档案管理系统是一个教育单位不可缺少的部分,它能够为用户提供充足的信息和快捷的查询手段.随着计算机技术的发展,其强大的功能已为人们深刻认识 ...

最新文章

  1. unity项目build成webgl时选择生成目录(解决方法)
  2. springJDBC实现查询方法二
  3. bitcask存储引擎
  4. ieee很多个作者都在一排上面的官方模版(作者栏简介大气)
  5. vscode较详细注释的汇编语言hello world 输出程序,第一个汇编程序
  6. MySQL date_format()函数
  7. word和html互换,word与html互转(2) -- html转word
  8. android 65536 gradle,如何防止在Android Gradle中使用Multi-dex
  9. MySQL8.0-基础操作
  10. C# 字符串string的基本操作
  11. 时间序列分析导论书摘:预测的一般知识
  12. android pdf阅读工具,Android手机上最好用的PDF阅读器,没有之一!
  13. python分词、词频统计以及根据词频绘制词云
  14. 红宝书第四版的一个错误?
  15. Android Studio历史版本
  16. NLP学习笔记[1] -- 构建词向量模型 -- Word2Vec与词嵌入
  17. 无法加载SQLite.Interop.dll:找不到指定模块
  18. HarmonyOS助力构建“食用菌智慧农场”
  19. 一年来终于用实际案例把matplotlib的绘图坐标轴说清楚了-太给力了
  20. 头像截图上传两种方式(SWFUpload、一个简单易用的flash插件)

热门文章

  1. 网络分流器-网络分流器之DPI深度数据包检测技术及作用
  2. as precise as possible
  3. Linux 磁盘分区与挂载知识点
  4. 八、装饰者模式—巴厘岛,奶茶店的困扰! #和设计模式一起旅行#
  5. 使用OpenCV中的分类器和颜色识别的苹果位置识别
  6. 开发者学习中心重磅首发
  7. Android平台的手机记账应用开发全程实录
  8. python计算器_Python | 写个计算器
  9. Android studio 获取手机联系人和号码并输出
  10. Socket收到MJPEG视频数据包,如何查找FFD8和FFD9?