zoukankan      html  css  js  c++  java
  • day30_IO 序列化流 序列化对象 打印流 网络编程基础

    今日内容:

    • IO流--转换流

    • 序列化对象

    • 打印流

    • 网络编程基础

    IO流--转换流

    1. 指定GBK编码的转换流,读取文本文件。InputStreamReader

    2. 使用UTF-8编码的转换流,写入到文本文件中。 OutputStreamWriter

        public static void main(String[] args) throws IOException {
            //1.指定GBK编码的转换流,读取文本文件。InputStreamReader
            final InputStreamReader isr= new InputStreamReader(new FileInputStream("day30_IO\GBK.txt"), "GBK");
           //1.2使用UTF-8编码转换流,写入到文本文档中。OutputStreamWriter  此时不写默认就是UTF-8
            final OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day30_IO\UTF-8.txt"), "UTF-8");
            //2.使用转换流读取数据源文件
            //2.1顶一个指定长度的字符数组
            final char[] chars = new char[1024];
            //2.2定义一个变量,记录读取到的有效字符个数
            int len =0;
            //2.3循环读取
            while ((len=isr.read(chars))!= -1 ){
                //读取出来的数据要写入到目的地文件中
                osw.write(chars,0,len);
            }
            //3.释放资源
            osw.close();
            isr.close();
        }

    序列化流

      序列化:将信息输入硬盘 反序列化:读入内存

    ObjectOutputStream类

    java.io.ObjectOutputStream类,将java对象的原始数据类型写到文件中,实现对象的持久化存储

      构造方法:

    public ObjectOutputStream(OutputStream out):  创建一个指定的OutputStream的ObjectOutputStream类对象。

      特有方法:

    void weiteObject(Object obj): 将指定的对象写入到ObjectOutputStream类对象中。

      序列化操作

    一个对象想要能够序列化和反序列化,必须满足两个条件:
    
    1.该类必须事先java.io.Serializable接口,Serializable接口,是一个标记型接口,如果该类没有实现Serializable接口,将会抛出NotSerializableException。
    2.该类的所有属性必须是可以实现序列化或者反序列化。如果有一个属性不想让他参与序列化,则该属性必须标明是瞬态的,瞬时的,这个关键字是transient。

    ObjectInputStream类

      java.io.ObjectInputStream类是反序列化流,将之前使用ObjectInpputStream序列化流的原始数据恢复为对象。

      构造方法:

    public ObjectInputStream(tInputStream in): 创建一个指定的InputStream的对象反序列化流对象

      特有方法:

    public final Object readObject():从反序列化流中读取一个对象

      附带异常问题:

    对于JVM来说,能够进行反序列的对象,前提条件是必须能够找到class文件的类,如果找不到该类的class文件,则会抛出一个classNotFoundException异常。另外,当JVM序列化对象时,能够找到class文件,但是class文件在序列化对象时,发生了修改,那么反序列化操作会跑出一个InvalidClassException异常,原因如下:
        该类的序列化版本号与从流中读取出来描述该类的版本号不一致。
        该类包含了未知的数据类型。
        该类没有可访问的无参构造方法。
    
    Serializable接口需要序列化的类,提供了一个序列化版本号,serialVersionUID 该版本号的目的就是在于验证序列化的对象和对应的类是否是版本一致的。

    如何存储一堆的对象实现序列化和反序列化动作

        public static void main(String[] args) throws IOException, ClassNotFoundException {
            //定义多个对象,存储在集合中
            ArrayList<Student> list = new ArrayList<>();
            list.add(new Student("小孙", 30));
            list.add(new Student("小王", 20));
            list.add(new Student("小赵", 40));
            list.add(new Student("小刘", 10));
            list.add(new Student("小丽", 25));
            //2.使用序列化技术,把该集合对象写入到文件中
            ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day30_IO\\student.txt"));
            //3.写入进去,调用writeObject
            oos.writeObject(list);
            //4.反序列化技术,把文件中保存的集合对象读取出来
            ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day30_IO\\student.txt"));
            //5.读取对象数据,调用readObject()方法
            Object obj = ois.readObject();
            //6.向下转型
            if (obj instanceof ArrayList){
                ArrayList student = (ArrayList)obj;
                //7.   遍历该集合对象
                for (Object students : student) {
                    System.out.println(students);
                }
            }
            //8.释放资源
            ois.close();
            oos.close();

    打印流

      java.io.PrintStream类能够很方便的打印各种数据类型的值。

      构造方法

    public PrintStream(String filename): 使用指定的文件名创建一个新的打印流对象。

      改变打印流向(改变打印的顺序)

    正常System.out就是PrintStream类型的,数据的流动的位置在控制台中,改变数据的流动位置。通过System.out(PrintStream print)改变流向。
    
    PrintStream out = System.out;
    out.print(123);//在控制台中
    //1.构造方法创建一个打印流对象
    PrintStream printStream = new PrintStream("day30_IO\print.txt");
    System.setOut(printStream);
    System.out.println("我已经改变了输出数据的位置");
    System.out.println("我想在输出台上输出数据");
    System.out.println("啦啦啦啦啦");

    网络编程基础

      软件架构:

    C/S架构:即Client/Server(客户端/服务器端)架构,QQ,迅雷。
    
    B/S架构:即Browser/Server(浏览器端/服务器端)架构,简化了系统的开发,维护和使用。谷歌,火狐

      两种架构的区别

    C/S架构鲫鱼局域网的,而B/S架构基于广域网的基础上。
    硬件环境不同,C/S建立在专用网络上,小范围的网络,可以专门的服务器提供数据链接和数据交换
    C/S架构一般数据要求高,面向的是固定的用户群体对信息的安全控制较高一点。
    对程序的架构不同,C/S对权限的多层校验,
    用户接口不同
    用户接口不同:C/S架构大多建立在Windows平台上,B/S建立在浏览器上,不仅可以应用在Windows平台上,也可以应用在Unix/Linux等平台上。

      网络通信协议

    网络通信协议:通信协议是对计算机通信必须遵从的一种规则,协议中对数据的传输格式,传输的速率,传输的步骤等都做了统一的规定,通信双方必须同时遵守,最终实现数据的正常传输和交换。
    
    TCP/IP:传输控制协议(TCP)/因特网互联协议(IP),他们俩定义了计算机如何联网,数据如何交换和传输的标准。它的内部包含了一系列用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫下一层的所提供的协议来完成自己的请求。

        协议分类:

    1.TCP协议:传输控制协议,该协议是面向连接的通信协议,即数据传输前,在发送端和接收端先建立逻辑连接,然后再传输数据,它提供了两台计算机之间可靠的无差错的数据传输。
    
        三次握手:在数据发送的准备阶段,客户端和服务器之间通过三次交互,保证连接的可靠性。
        第一次:客户端向服务器端发送连接请求,等待服务器确认。
        第二次:服务器端向客户端响应了信息,通知客户端收到了你的连接请求
        第三次:客户端再次向服务器端发送了一个确认信息,确认连接。
    
        通过三次握手,建立连接之后,客户端和服务器端就可以进行数据传输了。由于这种面相连接的特性,TCP协议能够数据传输的安全,所以应用广泛,下载文件等。
    
    2.UDP:用户数据报协议(Uoer DataProgram Protocal),他是一个面相无连接的协议,在进行数据传输时,不需要建立连接。不管对方在不在,直接将数据,数据源和目的地封装到数据包中,发送过去。每次发送的数据不能很大,限制在64k以内,数据有可能丢失,数据传输时不安全,速度快。QQ聊天

      网络编程三元素

    协议:计算机通信必须遵循的规则。
    
    IP地址:互联网协议地址。俗称IP,IP地址用来给网络中的计算机编订一个唯一的编号。
    
    端口号:就是唯一标识设备中的进程(应用程序)。IP地址是唯一标识网络中的设备。
  • 相关阅读:
    「UVA12293」 Box Game
    「CF803C」 Maximal GCD
    「CF525D」Arthur and Walls
    「CF442C」 Artem and Array
    LeetCode lcci 16.03 交点
    LeetCode 1305 两棵二叉搜索树中的所有元素
    LeetCode 1040 移动石子直到连续 II
    LeetCode 664 奇怪的打印机
    iOS UIPageViewController系统方法崩溃修复
    LeetCode 334 递增的三元子序列
  • 原文地址:https://www.cnblogs.com/rxqq/p/14151403.html
Copyright © 2011-2022 走看看