• day30_io&网络编程基础


    • 转换流
    • 序列化流
    • 打印流
    • 软件架构
    • 网络通信三要素
    • TCP通信

    转换流:

    练习:将GBK编码的文本文件转换为UTF-8编码文本文件

    分析:

    1. ​ 指定GBK编码的转换流,读取文本文件
    2. ​ 使用UTF-8编码的转换流写入新的文本文件中
     		InputStreamReader isr = new InputStreamReader(new FileInputStream("day30_io\src\com\zhiyou100\demo01\GBK"),"GBK");
            OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("day30_io\src\com\zhiyou100\demo01\UTF-8"));//平台默认编码格式为UTF-8,可以省略不写
            char[] chars = new char[1024];
            int len = 0; //记录读取到的有效字符数量
            while ((len = isr.read(chars)) != -1) {
                System.out.println(chars);
                 osw.write(chars,0,len);
            }
            osw.close();
            isr.close();
    

    序列化流:

    ​ Java提供了一种对象序列化的机制,用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性信息。字节序列写入到文件中后,相当于在文件中保存了一个对象信息。反之,该字节序列还可以从文件中读取出来,重构对象,对它进行反序列化。对象的数据、对象的类型、对象中存储的数据信息,都可以用来在内存中创建对象

    ObjectOutputStream 类 :序列化,将对象转换为字节持久化存储到硬盘中

    java.io.ObjectOutputStream

    构造方法:

    • ​ public ObjectOutputStream (OutputStream out):创建写入指定的OutputStream的对象序列化流中

    特有的独有方法:

    • ​ void writeObject(Object obj):将指定的对象写入到ObjectOutputStream 类对象中

    序列化操作

    一个对象想要序列化和反序列化,必须满足两个条件:

    • ​ 实现java.io.Serializable接口
    • ​ 该类的所有属性必须是可以实现序列化和反序列化,如果有一个属性不想让它参与序列化和反序列化,则该属性必须标明是瞬时的、瞬态的 。关键字为transient

    transient

    transient修饰的属性,在序列化时被忽略,序列化与反序列化时其值为系统给的隐式初始化值。

    static

    优先于非静态加载到内存当中(优先于对象进入内存中)

    被static修饰的成员变量,不能被序列化,序列化的都是对象。两个关键字虽然效果相同,但一般使用transient

    public class Student implements Serializable {
        private String name;
        private transient Integer age;//不让age参与序列化
    }
    
    当某个类对象需要进行序列化时,如果没有实现序列化接口会抛出NotSerializableException
    
    解决:实现Serializable接口,启用序列化功能,未实现此接口的类将无法使其在任何状态序列化或进行反序列化
    Serializable接口:
    java.io.Serializable是一个标记型接口
         要进行序列化和反序列化的时候,给该类添加一个标记,实现此接口
         当进行序列化和反序列化的时候,首先检测该类是否有序列化标记
    
    ObjectInputStream 类:反序列化,通过读取字节重构对象

    java.io.ObjectInputStream

    构造方法:

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

    特有的方法:

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

    总结 :

    1.    对于JVM来说,能够进行反序列的对象,前提必须是可以找到class文件的类,如果找不到该类的class文件,抛出NotSerializableException
      
    2. ​ 当JVM序列化对象时,能够找到class文件,但是class文件在序列化对象后,类内容发生了修改,那么反序列化时会抛出InvalidClassException,原因如下:
    • ​ 该类的序列化版本号与从流中读取出来描述该类版本号不一致
    • ​ 该类包含了未知数据类型
    • ​ 该类没有可访问的无参构造方法

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

    练习:存储多个对象

    ObjectInputStream ois = new ObjectInputStream(new FileInputStream("day30_io\students.txt"));
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("day30_io\students.txt"));
            ArrayList<Student> list = new ArrayList<>();
            list.add(new Student("Lily",23));
            list.add(new Student("BOb",32));
            list.add(new Student("Machine",12));
            list.add(new Student("Ben",18));
            list.add(new Student("Faker",30));
            oos.writeObject(list);    //写入集合对象,包含多个学生对象
            oos.close();
    
            Object object = ois.readObject();
            if(object instanceof ArrayList){ //
                ArrayList<Student> student = (ArrayList)object;
                for (Object o : student) {
                    System.out.println(o);
                }
            }
            ois.close();
    

    打印流

    `java,io.PrintStream`打印流
    PrintStream类除了常规的IO流操作,还有方便的打印各种数据值的方式
    
    PrintStream:
        1.只负责数据的输出,不负责数据的读取
        2.与其他流不同,不会抛出IOException
        3.特有的方法:
                void print(任意类型的值)
                void Println(任意类型的值并且打印换行)
    
    构造方法:
            PrintStream(File file):输出目的地是一个文件
            PrintStream(String filename):输出目的地是一个文件路径
            PrintStream(OutputStream out):输出的目的地是一个字节输出流
    PrintStream  extends  OutputStream
    
    ​    注意事项:
    ​        如果使用来自于父类当中的方法write()写入数据,查看数据时会查询编码表
    ​        如果使用自己特有的方法print()或者println()写入数据,写入的数据和输出的数据是一样的
    
    改变打印流的方向

    ​ 正常System.out就是PrintStream类型的,数据的流动位置在控制台中,改变数据的流动位置,通过System.setOut(PrintStream print)来改变流向

    PrintStream out = System.out;
    out.println(123);//控制台中打印
    //创建一个打印流对象
    PrintStream printStream = new PrintStream("day30_io\print.txt");
    System.setOut(printStream);//改变打印流方向
    System.out.println("我已经改变了输出数据的位置");//输出在指定的文件中
    

    网络编程基础

    软件架构

    • ​ C/S架构:client / server(客户端 / 服务器端)架构,响应快速,对网络要求低
    • ​ B/S架构:browser / server(浏览器 / 服务器)架构,简化了系统的开发、维护和使用

    区别:

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

    两种架构各有优劣,但是无论使用哪种架构,都离不开网络的支持、网络编程。就是在一定的协议下,实现计算机通信的程序

    网络通信协议

    ​ 通信协议是计算机通信必须遵从的一种规则,协议中对数据的传输格式、传输的速率、传输的步骤等都做了统一的规定,通信双方必须同时遵守、最终实现数据的正确传输和交换

    ​ TCP / IP (TCP)传输控制协议 / 因特网互联协议(IP) 它们俩定义了计算机如何联网、数据如何交换和传输的标准。它们内部包含了一系列用于处理数据通信的协议,并采用了4层的分层模型,每一层都呼叫下一层提供的协议来完成自己的请求

    应用层(HTTP、FTP、SMTP)
    传输层(TCP、UDP)
    网络层(IP、ICMP、ARP、IGMP)
    链路层

    协议分类:

    • ​ TCP协议:传输控制协议,该协议是面向连接的通信协议,即数据传输前,在发送端和接收端先建立逻辑连接,然后再传输数据,它提供了了两台计算机之间可靠的无差错的数据传输

    ​ 三次握手:在数据发送的准备阶段,客户端和服务器之间通过三次交互,保证连接的可靠性,可以保证数据传输的安全性,所以应用广泛,下载文件...

    • ​ UDP协议:用户数据报协议,它是一个面向无连接的协议,在进行数据传输时,不需要建立连接,无论对方是否连接,直接将数据、数据源、目的地封装到数据报中发送,发送数据报不大,限制在64k内,数据有可能丢失,数据传输不安全、速度极快,QQ聊天

    网络编程三要素

    ​ 协议:计算机通信必须遵守的规则

    ​ IP地址:互联网协议地址,即IP,用来给网络中的计算机编订一个唯一的编号

    ​ 端口号:端口号是唯一标识设备中的进程(应用程序),IP地址是唯一标识网络中的设备

  • 相关阅读:
    APC 注入
    远程线程注入突破SESSION 0
    .Net审计之.Net Json反序列化
    PHP审计之BEESCMS审计案例
    Thinkphp5学习笔记
    mysql 必知必会整理—触发器[十五]
    mysql 必知必会整理—游标[十四]
    mysql 必知必会整理—存储过程[十三]
    mysql 必知必会整理—视图[十二]
    mysql 必知必会整理—表[十一]
  • 原文地址:https://www.cnblogs.com/mitoris/p/14152392.html
Copyright © 2020-2023  润新知