• 10java进阶——IO2


    1. Properties类

    Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

    特点:

    1. Hashtable的子类,map集合中的方法都可以用。
    2. 该集合没有泛型。键值都是字符串。
    3. 它是一个可以持久化的属性集。键值可以存储到集合中,也可以存储到持久化的设备(硬盘、U盘、光盘)上。键值的来源也可以是持久化的设备。
    4. 有和流技术相结合的方法。
    • load(InputStream)  把指定流所对应的文件中的数据,读取出来,保存到Propertie集合中
    • store(OutputStream,commonts)把集合中的数据,保存到指定的流所对应的文件中,参数commonts代表对描述信息

    package cn.jxufe.java.chapter09.demo05;
    
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.util.Properties;
    import java.util.Set;
    
    /*
     *  集合对象Properties类,继承Hashtable,实现Map接口
     *  可以和IO对象结合使用,实现数据的持久存储
     */
    public class Test01Property {
    
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            System.out.println("使用Properties集合,存储键值对:");
            function();
            System.out.println("
    Properties集合特有方法 load:");
            function_1();
            System.out.println("
    Properties集合的特有方法store:");
            function_2();
    
        }
    
        /*
         * Properties集合的特有方法store
         * store(OutputStream out)
         * store(Writer w)
         * 接收所有的字节或者字符的输出流,将集合中的键值对,写回文件中保存
         */
        public static void function_2() throws IOException {
            Properties properties = new Properties();
            properties.setProperty("name", "zhaosi");
            properties.setProperty("age", "31");
            properties.setProperty("email", "13657914425@163.com");
    
            // 键值对,存回文件,使用集合的方法store传递字符输出流
            FileWriter fr = new FileWriter("d:\pro.properties");
            properties.store(fr, "byZhao");
    
        }
    
        /*
         * Properties集合特有方法 load
         * load(InputStream in)
         * load(Reader r)
         * 传递任意的字节或者字符输入流
         * 流对象读取文件中的键值对,保存到集合
         */
        public static void function_1() throws IOException {
            Properties properties = new Properties();
            FileReader fileReader = new FileReader("d:\pro.properties");
            // 调用集合的方法load,传递字符输入流
            properties.load(fileReader);
            fileReader.close();
            System.out.println(properties);
        }
    
        /*
         * 使用Properties集合,存储键值对
         * setProperty等同与Map接口中的put
         * setProperty(String key, String value)
         * 通过键获取值, getProperty(String key)
         */
        public static void function() {
            Properties properties = new Properties();
            properties.setProperty("a", "1");
            properties.setProperty("b", "2");
            properties.setProperty("c", "3");
            System.out.println(properties);
    
            String value = properties.getProperty("a");
            System.out.println(value);
            // 方法stringPropertyNames,将集合中的键存储到Set集合,类似于Map接口的方法keySet
            Set<String> set = properties.stringPropertyNames();
            for (String key : set) {
                System.out.println(key + "  " + properties.getProperty(key));
            }
        }
    }

    2.序列化流与反序列化流

    用于从流中读取对象的

    操作流 ObjectInputStream    称为 反序列化流

    用于向流中写入对象的操作流 ObjectOutputStream   称为 序列化流

    特点:用于操作对象。可以将对象写入到文件中,也可以从文件中读取对象。

     

    2.1实例

    package cn.jxufe.java.chapter09.demo05;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class Test02ObjectStream {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            // TODO Auto-generated method stub
            writeObject();
            readObject();
        }
    
        /*
         * ObjectInputStream
         * 构造方法:ObjectInputStream(InputStream in)
         * 传递任意的字节输入流,输入流封装文件,必须是序列化的文件
         * Object readObject()  读取对象
         */
        public static void readObject() throws IOException, ClassNotFoundException {
            FileInputStream fis = new FileInputStream("d:\person.txt");
            // 创建反序列化流,构造方法中,传递字节输入流
            ObjectInputStream ois = new ObjectInputStream(fis);
            // 调用反序列化流的方法 readObject()读取对象
            Object object = ois.readObject();// ClassNotFoundExcept,因为要有person.class文件
            System.out.println(object);
            ois.close();
        }
    
        /*
         * ObjectOutputStream
         * 构造方法: ObjectOutputStream(OutputSteam out)
         * 传递任意的字节输出流
         * void writeObject(Object obj)写出对象的方法
         */
        public static void writeObject() throws IOException {
            // 创建字节输出流,封装文件
            FileOutputStream fos = new FileOutputStream("d:\person.txt");
            // 创建写出对象的序列化流的对象,构造方法传递字节输出流
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            Person person = new Person("lisi", 20);
    
            oos.writeObject(person);
            oos.close();
    
        }
    }
    
    class Person implements Serializable {
        public String name;
        public int age;
    //    public transient int age;/*transient阻止成员变量序列化*/
        // 类,自定义了序列号,编译器不会计算序列号
    //    private static final long serialVersionUID = 1478652478456L;
    
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public Person() {
        }
    
        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;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    
    }

    2.2静态不能序列化

    package cn.jxufe.java.chapter09.demo05;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.io.Serializable;
    
    public class Test02ObjectStream {
    
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            // TODO Auto-generated method stub
    //        writeObject();
            readObject();
        }
    
        /*
         * ObjectInputStream
         * 构造方法:ObjectInputStream(InputStream in)
         * 传递任意的字节输入流,输入流封装文件,必须是序列化的文件
         * Object readObject()  读取对象
         */
        public static void readObject() throws IOException, ClassNotFoundException {
            FileInputStream fis = new FileInputStream("d:\person.txt");
            // 创建反序列化流,构造方法中,传递字节输入流
            ObjectInputStream ois = new ObjectInputStream(fis);
            // 调用反序列化流的方法 readObject()读取对象
            Object object = ois.readObject();// ClassNotFoundExcept,因为要有person.class文件
            System.out.println(object);
            ois.close();
        }
    
        /*
         * ObjectOutputStream
         * 构造方法: ObjectOutputStream(OutputSteam out)
         * 传递任意的字节输出流
         * void writeObject(Object obj)写出对象的方法
         */
        public static void writeObject() throws IOException {
            // 创建字节输出流,封装文件
            FileOutputStream fos = new FileOutputStream("d:\person.txt");
            // 创建写出对象的序列化流的对象,构造方法传递字节输出流
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            Person person = new Person("lisi", 19);
    
            oos.writeObject(person);
            oos.close();
    
        }
    }
    
    class Person implements Serializable {
        public String name;
    //    public  int age;
        public static int age;
    //    public transient int age;/*transient阻止成员变量序列化*/
        // 类,自定义了序列号,编译器不会计算序列号
    //    private static final long serialVersionUID = 1478652478456L;
    
        public Person(String name, int age) {
            super();
            this.name = name;
            this.age = age;
        }
    
        public Person() {
        }
    
        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;
        }
    
        @Override
        public String toString() {
            return "Person [name=" + name + ", age=" + age + "]";
        }
    
    }

    注:此处的序列化是针对对象的,而静态成员是属于类的,所以不能序列化。

    2.3序列化接口

    当一个对象要能被序列化,这个对象所属的类必须实现Serializable接口。否则会发生异常NotSerializableException异常。

    同时当反序列化对象时,如果对象所属的class文件在序列化之后进行的修改,那么进行反序列化也会发生异常InvalidClassException。发生这个异常的原因如下:

    • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
    • 该类包含未知数据类型
    • 该类没有可访问的无参数构造方法

    Serializable标记接口。该接口给需要序列化的类,提供了一个序列版本号。serialVersionUID. 该版本号的目的在于验证序列化的对象和对应类是否版本匹配。

    2.4序列化数组

    package cn.jxufe.java.chapter09.demo05;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    
    public class Test03ObjectStreamForArray {
    
        public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
            // TODO Auto-generated method stub
            int[] numbers = { 1, 2, 3, 4, 5 };
            String[] strings = { "John", "Susan", "Kim" };
            try (ObjectOutputStream output = new ObjectOutputStream(new FileOutputStream("d:\array.dat", true));) {
                output.writeObject(numbers);
                output.writeObject(strings);
    
            }
            try (ObjectInputStream input = new ObjectInputStream(new FileInputStream("d:\array.dat"));) {
                int[] newNumbers = (int[]) (input.readObject());
                String[] newStrings = (String[]) (input.readObject());
                for (int number : newNumbers) {
                    System.out.print(number + " ");
                }
                System.out.println();
    
                for (String string : newStrings) {
                    System.out.print(string + " ");
                }
    
            }
        }
    
    }

    3. 打印流

    3.1打印流的概述

    打印流添加输出数据的功能,使它们能够方便地打印各种数据值表示形式.

    打印流根据流的分类:

    • 字节打印流  PrintStream
    • 字符打印流  PrintWriter

    方法:

    • void print(String str): 输出任意类型的数据,
    • void println(String str): 输出任意类型的数据,自动写入换行操作
    package cn.jxufe.java.chapter09.demo05;
    
    import java.io.File;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.io.OutputStreamWriter;
    import java.io.PrintWriter;
    
    /*
     *  打印流
     *    PrintStream
     *    PrintWriter
     *  打印流的特点:
     *   1. 此流不负责数据源,只负责数据目的
     *   2. 为其他输出流,添加功能
     *   3. 永远不会抛出IOException
     *      但是,可能抛出别的异常
     *   
     *   两个打印流的方法,完全一致
     *    构造方法,就是打印流的输出目的端
     *    PrintStream
     *       构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream
     *    PrintWriter  
     *       构造方法,接收File类型,接收字符串文件名,接收字节输出流OutputStream, 接收字符输出流Writer
     *   
     */
    public class Test04PrintWriter {
    
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            function();
            function_1();
            function_2();
        }
    
        /*
         * 打印流,输出目的,是流对象
         * 可以是字节输出流,可以是字符的输出流
         * OutputStream  Writer
         */
        public static void function_2() throws IOException {
            FileOutputStream fos = new FileOutputStream("d:\3.txt");
            OutputStreamWriter output = new OutputStreamWriter(fos, "utf-8");
            PrintWriter pw = new PrintWriter(output);
            pw.println("打印流");
            pw.close();
        }
    
        /*
         * 打印流,输出目的,String文件名
         */
        public static void function_1() throws FileNotFoundException {
            PrintWriter pw = new PrintWriter("d:\2.txt");
            pw.println(3.5);
            pw.close();
        }
    
        /*
         * 打印流,向File对象的数据目的写入数据
         * 方法print println  原样输出
         * write方法走码表
         */
        public static void function() throws FileNotFoundException {
            File file = new File("d:\1.txt");
            PrintWriter printWriter = new PrintWriter(file);
            printWriter.print(true);
            printWriter.print(100);
            printWriter.close();
        }
    
    }

    3.2打印流完成数据自动刷新

    可以通过构造方法,完成文件数据的自动刷新功能

    构造方法:

    开启文件自动刷新写入功能

    • public PrintWriter(OutputStream out, boolean autoFlush)
    • public PrintWriter(Writer out, boolean autoFlush)
    package cn.jxufe.java.chapter09.demo05;
    
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    public class Test05PrintWriter {
    
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            function();
        }
    
        /* 
         * 打印流,可以开启自动刷新功能
         * 满足2个条件:
         *   1. 输出的数据目的必须是流对象
         *       OutputStream  Writer
         *   2. 必须调用println,printf,format三个方法中的一个,启用自动刷新
         */
        public static void function() throws IOException {
            // File f = new File("XXX.txt");
            FileOutputStream fos = new FileOutputStream("d:\4.txt");
            PrintWriter pw = new PrintWriter(fos, true); //true 开启自动刷新
            pw.println("i");
            pw.println("love");
            pw.println("java");
            pw.close();
        }
    }

    3.3文件复制

    package cn.jxufe.java.chapter09.demo05;
    
    import java.io.BufferedReader;
    import java.io.FileNotFoundException;
    import java.io.FileReader;
    import java.io.FileWriter;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    /*
     * 打印流实现文本复制
     *   读取数据源  BufferedReader+File 读取文本行
     *   写入数据目的 PrintWriter+println 自动刷新
     */
    public class Test06PrintWriterCopy {
    
        public static void main(String[] args) throws IOException {
            // TODO Auto-generated method stub
            BufferedReader bfr = new BufferedReader(new FileReader("c:\a.txt"));
            PrintWriter pw = new PrintWriter(new FileWriter("d:\a.txt"), true);
            String line = null;
            while ((line = bfr.readLine()) != null) {
                pw.println(line);
            }
            pw.close();
            bfr.close();
        }
    
    }
  • 相关阅读:
    document.ready和window.onload的区别
    那些年,我们坚持着。
    JavaScript去除前后空格
    男孩的梦
    shapefile格式说明及读写代码示例 http://www.gispower.org/article/arcgis/arcother/2008/48/0848115049GB922C13K2I22H7G06A4.html
    如何在C#中加载自己编写的动态链接库(DLL)http://www.kehui.net/index.php/article/read/30/26323
    对象复制
    影像复制程序集在不关闭应用程序的前提下更新程序集
    ibatisnet系列(一) 总览 http://hjf1223.cnblogs.com/archive/2006/04/24/383118.html
    创建项模板模板参数
  • 原文地址:https://www.cnblogs.com/xinmomoyan/p/10972268.html
Copyright © 2020-2023  润新知