将排序处理的内容进行扩展,可以将全部输入的信息保存在文件中,还可以添加信息,并且可以现实全部数据。
如果此时进行内容的保存,那么首先一定要确认好所有输入数据的保存位置,所有的数据之间如果要想沿用之前的设计结构,则数据文件里面的保存应该做到格式统一,即:“姓名:成绩|”的形式进行存储,而在进行数据添加的时候可以添加两类数据:“单独的内容”、“一组内容”。暂时不考虑数据过大的问题;
1、设置一个文件的处理累,该类之中只是提供又数据的追加操作
package demo.util;
import java.io.File;
import java.io.FileOutputStream;
import java.io.PrintStream;
import java.util.Scanner;
public class FileUtil {
public static String load(File file) {
Scanner scan = null;
try {
scan = new Scanner(file);//文件加载
if(scan.hasNext()) {
String str = scan.next();//获取数据
return str;
}
return null;
}catch(Exception e) {
return null;
}finally {
if(scan != null) {
scan.close();
}
}
}
public static boolean append(File file,String content) {
PrintStream out = null;
try {
out = new PrintStream(new FileOutputStream(file,true));
out.print(content);//内容添加
return true;
}catch(Exception e) {
return false;
}finally {
if(out != null) {
out.close();
}
}
}
}
2、扩充IStudentService操作方法
package demo.service;
import demo.vo.Student;
public interface IStudentService {
public void append(String str);//追加数据并且保存到文件。
public Student[] getData();//获取排序数据
}
3、修改StudentServiceImpl中的功能
package demo.service.impl;
import java.io.File;
import java.util.Arrays;
import demo.service.IStudentService;
import demo.util.FileUtil;
import demo.vo.Student;
public class StudentServiceImpl implements IStudentService {
private static final File SAVE_FILE = new File("D:" + File.separator + "Student.txt");
private String content;
private Student[] students;
public StudentServiceImpl() {
this.content = FileUtil.load(SAVE_FILE);//读取已有的数据文件内容
this.handle();//进行数据处理
}
@Override
public void append(String str) {
if(str.startsWith("|")) {//最前面以“|”开头
str = str.substring(1);//截取后面部分
}
if(!str.endsWith("|")) {//数据合理,可以直接追加
str = str + "|";//与后面的数据进行分割
}
FileUtil.append(SAVE_FILE, str);//数据追加操作
}
private void handle() {//进行字符串拆分
String result[] = this.content.split("\\|");//拆分数据
this.students = new Student[result.length];
for (int x = 0 ; x < this.students.length; x ++) {
String temp[] = result[x].split(":");
this.students[x] = new Student(temp[0],Double.parseDouble(temp[1]));
}
}
@Override
public Student[] getData() {
Arrays.sort(this.students);
return this.students;
}
}
4、工厂类不再需要输入数据
package demo.factory;
import demo.InputUtil;
import demo.service.IStudentService;
import demo.service.impl.StudentServiceImpl;
public class Factory {
private Factory() {}
public static IStudentService getInstance() {
return new StudentServiceImpl();
}
}
5、定义一个 菜单
package demo;
import java.util.Arrays;
import demo.factory.Factory;
import demo.service.IStudentService;
public class Menu {
public Menu() {
this.choose();
}
public void choose() {
this.show();
String choose = InputUtil.getString("请选择:");
switch(choose) {
case"1":{//接收输入数据
String str = InputUtil.getString("请输入要追加的数据:");
IStudentService studentService = Factory.getInstance();
studentService.append(str);//追加数据,省略判断输入格式
choose();//重复出现
}
case"2":{//显示数据
IStudentService studentService = Factory.getInstance();
System.out.println(Arrays.toString(studentService.getData()));
choose();//重复出现
}
case"0":{
System.out.println("下次再见,拜拜!");
System.exit(1);
}
default:{
System.out.println("您输入了非法的选项,无法进行处理,请稍后再次执行程序!");
choose();
}
}
}
public void show() {
System.out.println("【1】追加字符串数据\n");
System.out.println("【2】显示所有的学生串数据\n");
System.out.println("【0】结束程序执行。");
System.out.println("\n\n");
}
}
6、编写测试类
package demo;
public class IOCaseDemo {
public static void main(String[] args) {
new Menu();
}
}
参考资料:
https://edu.aliyun.com/lesson_1012_9022#_9022