新人求助

君子 如玉 2019-03-17 10:04:32
//有好心人帮忙指点么Java,第一回发帖子。

package com.test;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class StudentManager { //可以再用对象流升级 ObjectInputStream
public static void main(String[] args) throws Exception {
String fileName = "Student.txt";
// 为了能实现返回主界面的操作while(true)
// 这是学生管理系统的主界面
// while (true) {

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("请输入你的选择:");
Scanner sc = new Scanner(System.in);
String choiceString = sc.next();
// 用switch实现选择
switch (choiceString) {
case "1":
// 查看所有学生
findAllStudent(fileName);
StudentManager.main(null);
break;
case "2":
// 添加学生
addStudent(fileName);
StudentManager.main(null);
break;
case "3":
// 删除学生
deleteStudent(fileName);
StudentManager.main(null);
break;
case "4":
// 修改学生
updateStudent(fileName);
StudentManager.main(null);
break;
case "5":
// 退出a
// System.out.println("谢谢你的使用");
// break;
default:
System.out.println("谢谢你的使用");
System.exit(0);
break;
}
}
// }

// 从文件中读数据到集合
@SuppressWarnings("unchecked")
public static void readDate(String fileName, ArrayList<Student> array) throws Exception {
/* BufferedReader br = new BufferedReader(new FileReader(fileName));
String line;
while ((line = br.readLine()) != null) {
String[] arr = line.split(",");
Student s = new Student();
s.setId(arr[0]);
s.setName(arr[1]);
s.setAge(arr[2]);
s.setAddress(arr[3]);
array.add(s);
}
br.close();*/

ObjectInputStream ois = new ObjectInputStream(new FileInputStream(fileName));
if(new File("Student.txt").length() != 0) {
Object obj = ois.readObject();
if(obj instanceof ArrayList)
// array = (ArrayList)obj; 这样只是交接地址值 除了方法地址值就没了,集合还是为空
array.addAll((ArrayList)obj); //复制集合中的内容
}
ois.close();
}

// 把集合中的内容写到文件中
public static void writeDate(String fileName, ArrayList<Student> array) throws Exception {
/* BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
StringBuilder sb = new StringBuilder();
sb.append(s.getId()).append(",").append(s.getName()).append(",").append(s.getAge()).append(",")
.append(s.getAddress());
bw.write(sb.toString());
bw.newLine();
}
bw.close();*/

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(fileName));
oos.writeObject(array);
oos.close();
}

// 查看所有学生
public static void findAllStudent(String fileName) throws Exception {
// 创建集合
ArrayList<Student> array = new ArrayList<>();
// 把文件中的数据放到集合中;
readDate(fileName, array);
// 首先判断集合中是否有数据,如果没有数据,就给出提示,并让该方法不继续向下执行
if (array.size() == 0) { // 或者用array.isEmpty();
System.out.println("不好意思,目前没有学生信息可供查询,请回去重新选择您的操作");
return;
}
System.out.println("学号\t姓名\t年龄\t居住地");// 提示
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
System.out.println(s.getId() + "\t" + s.getName() + "\t" + s.getAge() + "\t" + s.getAddress());
}
}

// 添加学生
public static void addStudent(String fileName) throws Exception {
// 创建集合
ArrayList<Student> array = new ArrayList<>();
// 把文件中的数据放到集合中;
readDate(fileName, array);
Scanner sc = new Scanner(System.in);

// 为了让id能够被访问到,我们把id定义在了循环的外面
String id;

// 为了让代码能够回到这里,用循环
while (true) {
System.out.println("请输入学生学号:");
id = sc.next();
// 学号不能有重复
// 定义一个标记
boolean flag = false;
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
if (s.getId().equals(id)) {
flag = true;// 说明学号被占用了
break;
}
}

if (flag) {
System.out.println("你输入的学号已经被占用,请重新输入");
} else {
break;
}
}

System.out.println("请输入学生姓名:");
String name = sc.next();
System.out.println("请输入学生年龄:");
String age = sc.next();
System.out.println("请输入学生居住地:");
String address = sc.next();
// 创建学生对象
Student s = new Student(id, name, age, address);
// 把学生对象作为元素添加到集合
array.add(s);
// 把添加的信息要写到文件中
writeDate(fileName, array);
// 给出提示
System.out.println("添加学生成功");
}
// 删除学生

// 删除学生
public static void deleteStudent(String fileName) throws Exception {
// 创建集合
ArrayList<Student> array = new ArrayList<>();
// 把文件中的数据放到集合中;
readDate(fileName, array);
// 删除学生的思路: 键盘输入一个学号,到集合中去查找,看是否有学生使用该学号,如果有就删除该学生
Scanner sc = new Scanner(System.in);
System.out.println("请输入您要删除的学生学号:");
String id = sc.next();

// 定义一个索引
int index = -1;

// 遍历集合
for (int i = 0; i < array.size(); i++) {
// 获取每一个学生对象
Student s = array.get(i);
// 那这个学生的学号和键盘录入的学号进行比较
if (s.getId().equals(id)) {
index = i;
// array.remove(i);//根据索引删除
break;
}
}
// 输出提示
if (index == -1) {
System.out.println("不好意思,你要删除的学号对应的学生信息不存在,请重新你的选择");
} else {
array.remove(index);
// 把添加的信息要写到文件中
writeDate(fileName, array);
System.out.println("删除学成功");
}
}
// 修改学生

// 修改学生
public static void updateStudent(String fileName) throws Exception {
// 创建集合
ArrayList<Student> array = new ArrayList<>();
// 把文件中的数据放到集合中;
readDate(fileName, array);
// 修改学生思路: 键盘录入一个学号,到集合中去查找看是否有学生使用该学号,如果有就修改该学生:

Scanner sc = new Scanner(System.in);
System.out.println("请输入你要修改的学生的学号:");
String id = sc.next();

// 定义一个索引
int index = -1;

// 遍历集合
for (int i = 0; i < array.size(); i++) {
Student s = array.get(i);
if (s.getId().equals(id)) {
index = i;
break;
}
}
if (index == -1) {
System.out.println("不好意思,不好意思,你要修改的学号对应的学生信息不存在,请重新你的选择");
} else {
System.out.println("请输入新的学生姓名:");
String name = sc.next();
System.out.println("请输入新的学生年龄:");
String age = sc.next();
System.out.println("请输入新的学生居住地:");
String address = sc.next();
// 创建学生对象
Student s = new Student(id, name, age, address);
// 修改集合中的学生对象
array.set(index, s);
// 把添加的信息要写到文件中
writeDate(fileName, array);
// 给出提示
System.out.println("修改学生成功");
}
}
}

//这是报错
Exception in thread "main" java.io.StreamCorruptedException: invalid stream header: 37313633
at java.io.ObjectInputStream.readStreamHeader(Unknown Source)
at java.io.ObjectInputStream.<init>(Unknown Source)
at com.test.StudentManager.readDate(StudentManager.java:79)
at com.test.StudentManager.updateStudent(StudentManager.java:217)
at com.test.StudentManager.main(StudentManager.java:48)
...全文
231 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_39936465 2019-03-21
  • 打赏
  • 举报
回复
readObject,writeObject的对象必须序列化的实例。不然,无法读取。

public static List<Student> readDate(String fileName)throws Exception {
		ObjectInputStream ois=new ObjectInputStream(new FileInputStream(fileName));
		List<Student> array=new ArrayList<Student>();
		Student stu;
		while((stu=(Student)ois.readObject())!=null) {
			array.add(stu);
		}
		ois.close();
		return array;
	}
	
	public static void writeDate(String fileName,List<Student> array)throws Exception{
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream(fileName));
		array.forEach(i->{
			try {
				oos.writeObject(i);
				oos.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		});
	}
	public class Student implements Serializable {
		private int id;
		private String name;
		public Student(int id, String name) {
			super();
			this.id = id;
			this.name = name;
		}
	}

qq_39936465 2019-03-21
  • 打赏
  • 举报
回复
写入的时候oos.writeObject(array); array是一个 ArrayList<Student> list, 你读入的时候 Object obj = ois.readObject();没指名Object格式,程序不知道怎么读入。 输入输出要对应。不然无法识别。
qq_39936465 2019-03-18
  • 打赏
  • 举报
回复
1,你既然写入对象为student 为什么读入对象不用student?

2. array.addAll((ArrayList) obj); // 复制集合中的内容 addAll后面参数为list<object>,你加入的只是一个object类型
200多M 作者梁敬彬、梁敬弘 上篇 开启惊喜之门——带意识地学Oracle 第1章意识,少做事从学习开始 2 1.1 选择先学什么颇有学问 2 1.1.1 梁老师课堂爆笑开场 2 1.1.2 看似跑题的手机分类 4 1.1.3 学什么先了解做什么 5 1.2 善于规划分类才有效果 7 1.2.1 分类与角色密切相关 7 1.2.2 角色自我认识有讲究 9 1.3 明白学以致用方有意义 11 第2章震惊,体验物理体系之旅 13 2.1 必须提及的系列知识 13 2.2 物理体系从老余开店慢慢铺开 16 2.2.1 老余的三个小故事 16 2.2.1.1 顾客的尺寸 16 2.2.1.2 有效的调整 17 2.2.1.3 记录的习惯 18 2.2.2 体系结构原理初探 20 2.2.2.1 从一普通查询SQL说起20 2.2.2.2 老余故事终现用心良苦23 2.2.2.3 一起体会Oracle代价 27 2.2.3 体系结构原理再探 30 2.2.3.1 从一普通更新语句说起30 2.2.3.2 体系结构中提交的探讨34 2.2.3.3 劳模的评选 38 2.2.3.4 回滚的研究 40 2.2.3.5 一致的查询 43 2.2.3.6 一致读的原理46 2.2.3.7 实践的体会 49 2.3 体系学习让SQL性能提升千倍 65 2.3.1 一起探索体系学习的意义 65 2.3.1.1 同学们不知所学何用 66 2.3.1.2 实际上大有用武之地 67 2.3.2 单车到飞船的经典之旅 70 2.3.2.1 未优化前,单车速度 70 2.3.2.2 绑定变量,摩托速度 72 2.3.2.3 静态改写,汽车速度 74 2.3.2.4 批量提交,动车速度 75 2.3.2.5 集合写法,飞机速度 77 2.3.2.6 直接路径,火箭速度 78 2.3.2.7 并行设置,飞船速度 79 2.3.3 精彩的总结与课程展望 80 2.3.3.1 最大的收获应该是思想80 2.3.3.2 老师的课程展望与规划81 第3章神奇,走进逻辑体系世界 84 3.1 长幼有序的逻辑体系 84 3.2 逻辑体系从老余养殖细细说起 85 3.2.1 农场之体系逻辑结构 85 3.2.2 农场之BLOCK漫谈89 3.2.3 农场之区与段 91 3.2.4 农场之表空间的分类 93 3.2.4.1 表空间与系统农场93 3.2.4.2 表空间与临时农场93 3.2.4.3 表空间与回滚农场94 3.2.5 逻辑结构之初次体会 94 3.2.5.1 逻辑结构之BLOCK 94 3.2.5.2 逻辑结构之TABLESPACE 95 3.2.5.3 逻辑结构之USER 97 3.2.5.4 逻辑结构之EXTENT 97 3.2.5.5 逻辑结构之SEGMENT 98 3.2.6 逻辑结构之二次体会 100 3.2.6.1 BLOCK的大小与调整 100 3.2.6.2 PCTFREE参数与调整 101 3.2.6.3 PCTFREE与生效范围 102 3.2.6.4 EXTENT尺寸与调整 103 3.2.7 逻辑结构之三次体会 104 3.2.7.1 已用与未用表空间情况104 3.2.7.2 表空间大小与自动扩展105 3.2.7.3 回滚表空间新建与切换109 3.2.7.4 临时表空间新建与切换111 3.2.7.5 临时表空间组及其妙用114 3.3 课程结束你给程序安上了翅膀 117 3.3.1 过度扩展与性能 117 3.3.2 PCTFREE与性能120 3.3.3 行迁移与优化 123 3.3.4 块的大小与应用 124 第4章祝贺,表的设计成就英雄 131 4.1 表的设计之五朵金花 131 4.2 表的特性从老余一家展开描述 132 4.2.1 老余一家各施所长 132 4.2.2 普通堆表不足之处 132 4.2.2.1 表更新日志开销较大 133 4.2.2.2 delete无法释放空间 136 4.2.2.3 表记录太大检索较慢 139 4.2.2.4 索引回表读开销很大 140 4.2.2.5 有序插入却难有序读出143 4.2.3 奇特的全局临时表 146 4.2.3.1 分析全局临时表的类型146 4.2.3.2 观察各类DML的REDO量 147 4.2.3.3 全局临时表两大重要特性 149 4.2.4 神通广大的分区表 153 4.2.4.1 分区表类型及原理155 4.2.4.2 分区表最实用的特性 165 4.2.4.3 分区索引类型简述176 4.2.4.4 分区表之相关陷阱177 4.2.5 有趣的索引组织表 184 4.2.6 簇表的介绍及应用 187 4.3 理解表设计的你成为项目组英雄 189 第5章惊叹,索引天地妙不可言 191 5.1 看似简单无趣的索引知识 191 5.2 索引探秘从小余缉凶拉开帷幕 192 5.2.1 BTREE索引的精彩世界 192 5.2.1.1 BTREE索引结构图展现192 5.2.1.2 到底是物理还是逻辑结构 194 5.2.1.3 索引结构三大重要特点198 5.2.1.4 插播小余缉凶精彩故事201 5.2.1.5 妙用三特征之高度较低203 5.2.1.6 巧用三特征之存储列值219 5.2.1.7 活用三特征之索引有序248 5.2.1.8 不可不说的主外键设计265 5.2.1.9 组合索引高效设计要领272 5.2.1.10变换角度看索引的危害289 5.2.1.11如何合理控制索引数量295 5.2.2 位图索引的玫瑰花之刺 297 5.2.2.1 统计条数奋勇夺冠297 5.2.2.2 即席查询一骑绝尘302 5.2.2.3 遭遇更新苦不堪言306 5.2.2.4 重复度低一败涂地309 5.2.2.5 了解结构真相大白311 5.2.3 小心函数索引步步陷阱 315 5.2.3.1 列运算让索引失去作用315 5.2.3.2 函数索引是这样应用的317 5.2.3.3 避免列运算的经典案例319 5.3 索引让一系列最熟悉的SQL飞起来了 325 第6章经典,表的连接学以致用 327 6.1 表的连接之江南三剑客 327 6.2 三大类型从小余跳舞一一道来 328 6.2.1 跳舞也能跳出连接类型 328 6.2.1.1 感觉怪异的嵌套循环 328 6.2.1.2 排序合并及哈希连接 329 6.2.2 各类连接访问次数差异 330 6.2.2.1 嵌套循环的表访问次数330 6.2.2.2 哈希连接的表访问次数337 6.2.2.3 排序合并的表访问次数340 6.2.3 各类连接驱动顺序区别 341 6.2.3.1 嵌套循环的表驱动顺序341 6.2.3.2 哈希连接的表驱动顺序343 6.2.3.3 排序合并的表驱动顺序345 6.2.4 各类连接排序情况分析 347 6.2.4.1 除嵌套循环都需排序 347 6.2.4.2 排序只需取部分字段 347 6.2.4.3 关于排序的经典案例 349 6.2.5 各类连接限制场景对比 350 6.2.5.1 哈希连接的限制 350 6.2.5.2 排序合并的限制 353 6.2.5.3 嵌套循环无限制 355 6.3 你动手装备的表连接威震三军 355 6.3.1 嵌套循环与索引 356 6.3.2 哈希连接与索引 362 6.3.3 排序合并与索引 363 下篇飞翔意识天空——思想与案例的分享 第7章搞定!不靠技术靠菜刀 368 7.1 SQL被一刀剁了 369 7.2 整个模块丢弃了 370 7.3 调用次数减少了 371 7.4 排序不再需要了 372 7.5 大表砍成小表了 373 7.6 排重操作消失了 373 7.7 插入阻碍小多了 374 7.8 迁移事情不做了 375 第8章升级!靠技术改隐形刀 377 8.1 大表等同小表了 378 8.2 大表切成小表了 379 8.3 索引变身小表了 380 8.4 删除动作不做了 380 8.5 清表角度变换了 381 8.6 提交次数缩减了 382 8.7 迁移越来越快了 384 8.8 SQL语句精简了 385 第9章提问,也是智慧的体现 391 9.1 描述要考虑周全 392 9.2 用词要尽量准确 393 9.3 说明要力求简洁 394 9.4 问过的避免再问 396 9.5 能搜能试不急问 396 第10章买鱼,居然买出方法论 398 10.1 小余买鱼系列故事 398 10.1.1 诊断与改进 398 10.1.2 需求与设计 401 10.1.3 资源的利用 403 10.1.4 真正的需求 404 10.2 买鱼买出了方法论 405 10.2.1 一套流程 405 10.2.2 两大法宝 407 10.3 方法论的应用案例 408 10.3.1 从我们的这一套流程说起 408 10.3.1.1 诊断 408 10.3.1.2 改进优化(首次优化) 409 10.3.1.3 需求与设计(再次优化) 410 10.3.1.4 资源利用(花絮) 412 10.3.2 案例映衬了经典两大法宝 412 第11章宝典,规范让你少做事 414 11.1 抓狂,为何事总忙不完 415 11.1.1 技术能力不足的新人们 415 11.1.2 不懂提问智慧的求助者 415 11.1.3 产生各种失误的粗心者 416 11.1.3.1 啊,小黄的DDL惹祸 416 11.1.3.2 惨,老师登错环境了 417 11.1.3.3 糟,小罗忘操作…… 417 11.1.4 解决问题缓慢的技术员 419 11.1.4.1 优化效率低下的小高 419 11.1.4.2 为何老师能快速解决 420 11.1.5 陷入种种困境的开发者 422 11.1.5.1 超长SQL使小郑烦恼 422 11.1.5.2 缺少注释让小叶沮丧 422 11.1.6 总是考虑不全的设计者 423 11.1.6.1 未提前规划的王工 423 11.1.6.2 不了解特性的刘工 424 11.2 淡定,规范少做无谓事 425 11.2.1 学习规范——促成新人快速成长 426 11.2.2 求助规范——引导求助不再迷糊 427 11.2.3 操作规范——协助粗心者不犯错 428 11.2.4 流程规范——保障问题快速解决 429 11.2.4.1 动态整体 429 11.2.4.2 动态局部 432 11.2.4.3 静态整体 439 11.2.4.4 静态局部 448 11.2.5 开发规范——让开发者驾轻就熟 451 11.2.5.1 SQL编写规范 452 11.2.5.2 PL/SQL编写规范 455 11.2.6 设计规范——助设计者运筹帷幄 457 11.2.6.1 表规范 458 11.2.6.2 索引规范 461 11.2.6.3 环境参数规范 467 11.2.6.4 命名规范 469

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧