• Java学习笔记33——特殊操作流


    特殊操作流

    标准输入输出流

    System类中有;两个静态的成员变量

    • public static final InputStream in:标准输入流。通常该流对应于键盘输入或者主机环境或者用户指定的一个另一个输入源
    • public static final PrintStream out:标准输出流。通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标。

    打印流

    只负责输出数据,不负责读数据

    字节打印流

    PrintStream
    使用继承父类的write写数据,查看时会自动转码,使用特有方法(print和println)则不会

    字符打印流

    PrintWriter

    方法名说明
    PrintWriter(String fileName)使用指定的文件名创建一个新的PrintWriter,而不会自动执行刷新
    PrintWriter(Writer out, boolean autoFlush)创建一个新的PrintWriter
    out:字符输出流
    autoFlush:一个布尔值,为真则print、println或format方法将自动刷新缓冲区
    用字符打印流改进复制Java文件
    public class PrintStreamDemo {
        public static void main(String[] args) throws IOException {
            /*
            BufferedReader br=new BufferedReader(new FileReader("test.java"));
            BufferedWriter bw=new BufferedWriter(new FileWriter("copy05.java"));
            String line;
            while((line=br.readLine())!=null){
                bw.write(line);
                bw.newLine();
                bw.flush();
            }
            br.close();
            bw.close();
            */
            //打印流只能写不能读
            BufferedReader br=new BufferedReader(new FileReader("test.java"));
            PrintWriter pw=new PrintWriter(new FileWriter("copy06.java"),true);
            String line;
            while((line=br.readLine())!=null){
                pw.println(line);
            }
            br.close();
            pw.close();
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27

    对象序列化流

    对象序列化:指的是将对象保存到磁盘中,或者在网络中传输对象。这种机制就是使用一个字节序列表示一个对象,该字节序列包括:对象的类型、对象的数据和对象中存储的属性等信息字节序列写到文件后,相当于在文件中持久保存一个对象的信息。
    该字节序列还可以从文件中读取回来,重构对象,进行反序列化

    对象序列化流

    ObjectOutputStream
    将Java对象的原始数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来实现对象的持久存储。如果流是网络套接字流,则可以在另一个主机或者进程中重构对象

    • 构造方法
      ObjectOutputStream(Outputstream out):创建一个写入指定的OutputStream的ObjectOutputStream

    • 序列化对象的方法
      void writeObject(Object obj):将指定的对象写入ObjectOutputStream

    对象序列化

    public class ObjectOutputStreamDemo  {
        public static void main(String[] args) throws IOException{
            ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("src\\com\\itheima02\\oos.txt"));
            //创建对象
            Student s=new Student("杨天伦",24);
            /*
                需要实现Serializable接口不然无法序列化和反序列化
                标识接口不需要重写方法
             */
            //写入文件
            oos.writeObject(s);
            oos.close();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    注意!!!

    • —个对象要想被序列化,该对象所属的类必须必须实现Serializable接口
    • Serializable是个标记接口,实现该接口,不需要重写任何方法

    对象反序列化流

    ObjectInputStream

    • ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数居和对象

    • 构造方法
      ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectlnputStream

    • 反序列化方法
      Object readObject(): 从ObjectlnputStream读取一个对象

    public class ObjectInputStreamDemo {
        public static void main(String[] args) throws IOException, ClassNotFoundException {
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("src\\com\\itheima02\\oos.txt"));
            Object obj = ois.readObject();
            Student s = (Student) obj;
            System.out.println(s.getName()+","+s.getAge());
            ois.close();
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    对象序列化流的三个问题

    1. 用对象序列化流序列化了一个对象后,假如我们修改了对象所属的类文件,读取数据会不会出问题呢?
      会出问题。抛出 InvalidClassException
    2. 如果出问题了,如何解决呢?
      显式声明序列化id值,对象所属的类加 private static final long serialVersionUID
    3. 如果一个对象中的某个成员变量的值不想被序列化,又该如何实现呢?
      给成员变量加上关键字 transicent
      transicent修饰的关键字不参与序列化。会赋上默认值。

    Properties

    Properties作为Map集合的使用

    public class PropertiesDemo {
        public static void main(String[] args){
            Properties prop=new Properties();
            prop.put("001","杨天伦");//没泛型,默认是Object类型的
            prop.put("002","李昊");
            prop.put("003","朱长坤");
            Set<Object> keySet=prop.keySet();
            for (Object key:keySet) {
                Object value = prop.get(key);
                System.out.println(key+","+value);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    Properties作为集合的特有方法

    方法名说明
    Object setProperty(String key,String value)设置集合的键和值,都是String类型,底层调用Hashtable方法put
    String getPorperty(String key)使用此属性列表中的指定的键搜索属性
    Set stringPorpertyNames()从该属性列表返回一个不可修改的键集,其中键及其对应的值都是字符串
    public class PropertiesDemo {
        public static void main(String[] args){
            Properties prop=new Properties();
            prop.setProperty("001","杨天伦");
            prop.setProperty("002","李昊");
            prop.setProperty("003","朱长坤");
            System.out.println(prop.getProperty("0011"));
            System.out.println(prop);
            Set<String> names=prop.stringPropertyNames();
            System.out.println(names);
            for (String key:names) {
                System.out.println(prop.getProperty(key));
            }
            
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    Properties和IO流结合的方法

    方法名说明
    void load(InputStream inStream)从输入字节流读取属性列表(键和元素对)
    void load(Reader reader)从输入字符流读取属性列表(键和元素对)
    void store(OutputStream out, String comments)将此属性列表(键和元素对)写入此Properties表中,以适合于使用load(lnputStream)方法的格式写入输出字节流
    void store(Writer writer,String comments)将此属性列表(键和元素对)写入此 Properties表中,以适:使用load(Reader)方法的格式写入输出字符流
    public class PropertiesDemo {
        public static void main(String[] args) throws IOException {
    
            myStore();
            myLoad();
        }
    
        private static void myLoad() throws IOException {
            Properties prop=new Properties();
            FileReader fr=new FileReader("src\\com\\itheima02\\fw.txt");
            prop.load(fr);
            fr.close();
            System.out.println(prop);
        }
    
        public static void myStore() throws IOException {
            Properties prop=new Properties();
            prop.setProperty("001","杨天伦");
            prop.setProperty("002","李昊");
            prop.setProperty("003","朱长坤");
    
            FileWriter fw=new FileWriter("src\\com\\itheima02\\fw.txt");
            prop.store(fw,null);
            fw.close();
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    Web3的数字签名方案
    Android集成其他应用的sdk(aar)如何实现application合并
    GBase 8c 核心技术
    算法-DFS+记忆化/动态规划-不同路径 II
    微信小程序canvas2d使用封装与案例使用
    【Linux系统】第二篇、权限管理篇
    XSS-labs通关游戏
    C++ 结合mysql写一个服务端
    【广度优先搜索】leetcode 515. 在每个树行中找最大值
    总结:Prometheus存储
  • 原文地址:https://blog.csdn.net/Lz0113/article/details/132641972