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地址是唯一标识网络中的设备

posted @ 2020-12-17 22:33  随风十万里  阅读(169)  评论(0)    收藏  举报