package morning; import java.io.*; import java.util.ArrayList; import java.util.List; /* //老师从控制台录入学员信息,每行数据代表一个学员信息 //具体输入格式是: //第一次输入 //name:zhangsan;age:34;sex:Male //第二次 //age:28;name:lisi;sex:FeMale //第三次 //sex:Male;name:wangwu;age:31 //要求: //1.将读取的数据放入List<Person> //2.将List进行序列化到工程下的file/source.txt,并反序列化测试 //3.找到姓名是zhangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件 //4.读取内容,将年龄修改成40并再次写入.properties文件. 分析: 使用的技术点: 标准输入流 System.in 集合-list 字符串切割 序列化/逆序列化 ObjectInputStream/ObjectOutputStream Properties的使用 File IO流---FileInputStream /FileOutputStream */ public class Demo1{ public static void main(String[] args) throws IOException { //1,将读取的数据放入List<Person> List<Person> list1 =getData1(); } //1.将读取的数据放入List<Person> //第一种:使用字节流直接完成功能 public static List<Person> getData1() throws IOException{ List<Person> list = new ArrayList<>(); /* 标准输入流:System。in:默认打开,并关联设备键盘 标准输出流:System。out:默认打开,并关联设备控制台 输入源:将数据输入键盘---键盘 输出源:将数据从内存输出---控制台 */ //一次接收一行 InputStream in = System.in; System.out.println("请输入数据,每一个用户的数据输入一行:"); //int num = in.read();//一个阻塞式方法 StringBuffer stringBuffer =new StringBuffer(); while (true){ int num=in.read(); if(num=='\r'){ continue; }else if(num=='\n'){//读完一行 //如果用户输入的是over,直接结束输入 if(stringBuffer.toString().equals("over")){ break; } list.add(new Person(stringBuffer.toString())); //将当前的字符串清空 stringBuffer.delete(0,stringBuffer.length()); }else{ stringBuffer.append((char)num); } } return list; } //2.将List进行序列化到工程下的file/source。txt,并反序列化测试 /* 序列化:将数据从短期存储转到长期存储(从内存到磁盘) 逆序列化:将数据从长期存储转到短期存储(从磁盘到内存) //次场景中使用最多的是将对象进行序列化 注意点: 1:作为元素的类必须实现Serializable接口,实现了就意味着当前的类可以被序列化。 2:必须使用ObjectInputstream和ObjectOutputStream流配合普通的能够进行读写的流. 3:如果是将一个集合进行序列化,我们要保证集合 自身和所有元素都实现了Serializable接口 */ //序列化 public static void writeList(List<Person> list) throws IOException{ ObjectOutputStream outputStream =new ObjectOutputStream(new FileOutputStream(getUrl("source.txt"))); outputStream.writeObject(list); outputStream.close(); } //反序列化 public static List<Person> readList() throws IOException,ClassNotFoundException{ ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(getUrl("source"))); return (List<Person>)objectInputStream.readObject(); } //创建file目录 public static String getUrl(String fileName){ String url="C:\\Users\\Administrator\\Desktop\\files"; File file = new File(url); if(!file.exists()){ file.mkdir(); } return url+"\\"+fileName; } static enum Gender{ Male,Female } static class Person implements Serializable { private String name ; private Gender sex; private int age; public Person(String line){ //字符串切割 //name:zhangsan;age:34:sex:Male //使用;切第一刀 String [] strings =line.split(";"); for(String string : strings){ //使用:切第二刀 String[] pair =string.split(":"); String key = pair[0]; String value = pair[1]; if(key.equals("name")){ this.name = value; }else if(key.matches("sex")){ if(value.equals("Male")){ this.sex =Gender.Male; }else{ this.sex =Gender.Female; } }else if(key.matches("age")){ this.age = Integer.parseInt(value); } } } public Person(){} public Person(String name, Gender sex, int age) { this.name = name; this.sex = sex; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Gender getSex() { return sex; } public void setSex(Gender sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", sex=" + sex + ", age=" + age + '}'; } } }