【大数据开发】Java基础-总结19- IO流02注意事项和案例

 

老师从控制台录入学员信息,每行数据代表一个学员信息
具体输入格式是:
第一次输入
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;
        }
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值