老师从控制台录入学员信息,每行数据代表一个学员信息
具体输入格式是:
第一次输入
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、 找到姓名是 shangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件
4、读取内容,将年龄修改成40 并在此写入.properties文件示例如下:
package morning1; import java.io.*; import java.util.ArrayList; import java.util.List; import java.util.Properties; /** * 1、将读取的数据放入List<Person> -- 利用控制台 进行输入 * 2、将List进行序列化到工程下的file/source.txt,并反序列化测试 * 3、 找到姓名是 shangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件 * 4、读取内容,将年龄修改成40 并在此写入.properties文件 */ public class Demo1 { public static void main(String[] args) throws IOException { // 1、将读取的数据放入List<Person> // List<Person> list = getData2(); // System.out.println(list); // 2、将List进行序列化到工程下的file/source.txt,并反序列化测试 // writeToFile(list); // list = readRromFile(); // System.out.println(list); // writeToPro(list); readFromPro(); } //将数据读入Properties对象 --- 将数据从磁盘中的properties文件中读入到properties对象中 public static void readFromPro(){ Properties properties = new Properties(); try { properties.load(new FileReader(getFile("zhang.properties"))); } catch (IOException e) { e.printStackTrace(); } //修改后写回 properties.setProperty("name", "chen"); try { properties.store(new FileWriter(getFile("zhang.properties")), "再次修改后"); } catch (IOException e) { e.printStackTrace(); } //输出到控制台 properties.list(System.out); } //将数据存入.properties文件 --- 将数据从内存写入磁盘 public static void writeToPro(List<Person> list){ Properties properties = new Properties(); for (Person person : list) { if (person.name.equals("zhangsan")){ properties.setProperty("name", person.name); properties.setProperty("age", String.valueOf(person.age)); if (person.gender == Gender.FeMale){ // properties.setProperty("sex", String.valueOf(person.gender)); properties.setProperty("sex", "FeMale"); }else{ properties.setProperty("sex", "Male"); } } } try { properties.store(new FileWriter(getFile("zhang.properties")), "save信息"); } catch (IOException e) { e.printStackTrace(); } } //反序列化 public static List<Person> readRromFile(){ List<Person> list = null; try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(getFile("source.txt")))){ // int num = objectInputStream.readInt(); // System.out.println(num); list = (List<Person>) objectInputStream.readObject(); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } return list; } //序列化 public static void writeToFile(List<Person> list){ //ObjectOutputStream 只有序列化功能,将基本的写数据的能力交给基本的流来实现。 try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(getFile("source.txt")));){ // objectOutputStream.writeInt(34); objectOutputStream.writeObject(list); } catch (IOException e) { e.printStackTrace(); } } //创建File目录 public static File getFile(String fileName){ File file = new File("F:\\ideaProgram\\BigData2021ProThirdDay\\JavaDay3_29\\file"); if (!file.exists()){ file.mkdir(); } return new File(file, fileName); } //1、方法一:将读取的数据放入List<Person> --- 利用字节输入流(inputStream) 一个字节一个字节的读取 public static List<Person> getData1(){ List<Person> list = new ArrayList<>(); StringBuffer stringBuffer = new StringBuffer(); InputStream inputStream = System.in; while (true){ try { int num = inputStream.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); } } catch (IOException e) { e.printStackTrace(); } } return list; } //1、方法二:将读取的数据放入List<Person> --- 利用字符流读取,则需要缓冲字符流 // (因为一行一行的读取) 但注意的是:标准输入流与键盘绑定 这是字节流 需要转换流 转换成字符流 public static List<Person> getData2() throws IOException { List<Person> list = new ArrayList<>(); //转换流其实是一个 字符流 InputStreamReader inputStreamReader = new InputStreamReader(System.in); // 注意: 只要是出现了字符流,即使字符缓冲流也不行,经过转换流程字符流也不行,都不能传输图片 BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in)); String data = null; while ((data = bufferedReader.readLine())!=null){ if (data.equals("over")){ break; } list.add(new Person(data)); } return list; } private static enum Gender{ Male,FeMale; } private static class Person implements Serializable{ private String name; private int age; private Gender gender; public Person(String line){ String[] strings = line.split(";"); for (String string : strings) { String[] p = string.split(":"); if (p[0].equals("name")){ this.name=p[1]; }else if (p[0].equals("age")){ this.age = Integer.parseInt(p[1]); }else if (p[0].equals("sex")){ if (p[1].equals("Male")){ this.gender= Gender.Male; }else if (p[1].equals("FeMale")){ this.gender= Gender.FeMale; } } } } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + ", gender=" + gender + '}'; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public Gender getGender() { return gender; } public void setGender(Gender gender) { this.gender = gender; } public Person() { } public Person(String name, int age, Gender gender) { this.name = name; this.age = age; this.gender = gender; } } }