signed

QiShunwang

“诚信为本、客户至上”

小白学java日记day20--IO流2

2021/6/8 23:21:11   来源:
1.持久化的手段
序列化
文件
properties
xml
数据库
2.如何将对象序列化
创建类-实现Serializable
使用序列化流实现序列化和逆序列化
3.xml与properties的比较
	xml			                 properties
	使用标签	                                 使用键值对
	适合于存储有层次的属性信息            适合存储单纯的以键值对存在的信息10.判断对错
4.判断对错
outputStream = new FileOutputStream("t");
while(true){
    outputStream.write("hello");
    outputStream.flush();
}
错误:以为字节流不能直接接收字符串,需要先转化成字节数组
5.判断对错
outputStream = new FileOutputStream("t");
outputStream.write("hello".getBytes());
outputStream.close();
outputStream.write("hello".getBytes());

错误:当流被关闭之后,不能在进行操作.

案例:

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

 

mport java.io.*;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Properties;
/*
分析:
标准输入流 System.in
集合--list
字符串切割
序列化/反序列化
Properties
File
FileInputStream
FileOutputStream
 */
public class test {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //1.将读取的数据放入List<Person>
        List<Preson> list =getData2();
        System.out.println(list);
        //2.将List进行序列化到工程下的file/source.txt,并反序列化测试
        //序列化
        writePerson(list);
        //反序列化
        List<Preson> list1=readPreson();
       System.out.println("反序列化后的list:" +list1);
        //3.找到姓名是zhangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件
        //4.读取内容,将年龄修改成40并再次写入.properties文件.
        changePro();
    }

    //1.将读取的数据放入List<Person>
    //第一种直接使用标准输入流
    public static List<Preson> getData1() throws IOException {
        //创建List保存获取数据
        List<Preson> list = new ArrayList<>();
        //从控制台读取数据
        //System.in:标准输入流
        //"标准"输入流。此流已打开并准备提供输入数据。通常,此流对应于键盘输入或者由主机环境或用户指定的另一个输入源。
        /*
        //通过setIn将标准输入流的输入源改成了hell.txt
        //输入源:数据的来源
        //输出源:数据的去处
        //System.setIn(new FileInputStream("hell.txt"));
         */
        //System.out:标准输出流
        InputStream inputStream = System.in;
        /*
        //从键盘接受数据---阻塞式方法
        int num=inputStream.read();
         */
        //实现从控制台一次接受一行数据:
        StringBuffer stringBuffer=new StringBuffer();
        while(true){
            int num=inputStream.read();
            //在windows中换行符认为是\r\n
            if (num=='\r'){
                continue;
            }else if (num=='\n'){//读完一行时
                //当我们输入over是,认为输入结束
                if (stringBuffer.toString().equals("over")){
                    break;
                }
                //将当前
                list.add(new Preson(stringBuffer.toString()));
               stringBuffer.delete(0,stringBuffer.length());
            }else {
                stringBuffer.append((char)num);
            }
        }
        return list;
    }
    //第二种借助转换流去使用字符缓冲流readLine
    //虽然我们字符缓冲流是通过标准输入字节流转换过来的,但是由于它本身也是字符流,所以不嫩归队文本之外的数据进行处理
    public static List<Preson> getData2(){
        List<Preson> list = new ArrayList<>();
        //获取字符转换流
        try(BufferedReader bufferedReader=new BufferedReader(new InputStreamReader(System.in));) {
            String data=null;
            while((data=bufferedReader.readLine())!=null){
                if (data.equals("over")){
                    break;
                }
                list.add(new Preson(data));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
    static enum Gender {
        Male, FeMale
    }

    static class Preson implements Serializable{
        // generated:由编译器自动生成的,后面加L表示long型  
        private static  final long serialVersionUID=-123453465643445L;
        private String name;
        private int 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 Preson(String name, int age, Gender gender) {
            this.name = name;
            this.age = age;
            this.gender = gender;
        }

        @Override
        public String toString() {
            return "Preson{" +
                    "name='" + name + '\'' +
                    ", age=" + age +
                    ", gender=" + gender +
                    '}';
        }

        public Preson(String str) {
            //切第一刀:;
            String[] strs = str.split(";");
            for (String string : strs) {
                String[] pair = string.split(":");
                //去空格
                String key = pair[0].trim();
                String value = pair[1].trim();
                //正则表达式
                if (key.equals("name")) {
                    this.name = value;
                } else if (key.equals("age")) {
                    this.age = Integer.parseInt(value);
                } else if (key.equals("sex")) {
                    if (value.equals("Male")){
                        this.gender=Gender.Male;
                    }else {
                        this.gender=Gender.FeMale;
                    }
                }
            }
        }
    }
    //2.将List进行序列化到工程下的file/source.txt,并反序列化测试
    //序列化
    public static void writePerson(List<Preson> list) throws IOException {

        ObjectOutputStream objectOutputStream=new ObjectOutputStream(new FileOutputStream(getUrl("source.txt")));
        objectOutputStream.writeObject(list);
        objectOutputStream.close();
    }

    //反序列化
    public static List<Preson> readPreson() throws IOException, ClassNotFoundException {
        ObjectInputStream objectInputStream=new ObjectInputStream(new FileInputStream(getUrl("source.txt")));
        return (List<Preson>) objectInputStream.readObject();
    }

    //创建file目录
    public  static String getUrl(String fileName) throws IOException {
        String url="E:\\src\\Moning\\file";
        File file=new File(url);
        if (!file.exists()){
            file.mkdir();
        }
        return url+"\\"+fileName;
    }
    //3.找到姓名是zhangsan的人,并将所有数据以key-value形式存入file/zhang.properties文件
    public static void writeToPro(List<Preson> list) throws IOException {
        Properties properties=new Properties();
        for (Preson preson : list) {
            if (preson.name.equals("zhangsan")){
                properties.setProperty("name",preson.name);
                properties.setProperty("age",preson.age+"");
                if (preson.gender==Gender.Male){
                    properties.setProperty("sex","Male");
                }else{
                    properties.setProperty("sex","FeMale");
                }
            }
        }
        //通过Properties 的store方法将数据写入zhang.properties 文件
        properties.store(new FileWriter("0607/file/zhang.properties"),"save张三的信息");
    }
    //4.读取内容,将年龄修改成40并再次写入.properties文件.
    public static void changePro() throws IOException {
        Properties properties =new Properties();
        properties.load(new FileReader("0607/file/zhang.properties"));

        //修改内容
        properties.setProperty("age",40+"");
        //写回zhang.properties
        properties.store(new FileWriter("0607/file/zhang.properties"),"将zhang的年龄修改成了40");
        properties.list(System.out);
    }
}