1.前一天重点内容复习
IO流的分类
按照方向划分
输入流,进行读操作
输出流,进行写操作
按照流类型划分
字节流,以字节形式读取数据
字符流,以字符形式读取数据
流的方向及类型划分
字节输入流,InputStream
FileInputStream:文件字节输入流
BufferedInputStream:字节缓冲输入流
字节输出流,OutputStream
FileOutputStream:文件字节输出流
BufferedOutputStream:字节缓冲输出流
字符输入流,Reader
InputStreamReader字符转换输入流
FileReader:字符转换输入流便捷类
字符输出流,Writer
OutputStreamWriter字符转换输出流
FileWriter:字符转换输出流便捷类
静态代理:代理模式的一种
思想:让代理角色帮助真实角色完成一些事情,使真实角色专注于自己的事情,静态代理对真实角色的功能做一个增强处理
条件:真实角色和代理角色都必须实现同一个接口
单例设计模式
单例模式:内存中始终只有一个类对象存在
实现方式
饿汉式:永远不会出现问题的单例模式
1.在类成员位置,创建一个静态实例变量
2.构造方法私有化,外界不能够创建对象,保证安全性
3.提供静态的公共访问方法,返回值就是当前类本身
懒汉式:可能会出现安全问题的单例模式
1.在类的成员位置,声明当前类的静态变量
2.构造方法私有化,外界类不能创建对象,保证安全性
3.判断当前静态变量是否为空,用的时候才去创建对象
2.字节缓冲输入流
BufferedReader
成员方法
public int read() throws IOException:一次读取一个字节
public String readLine() throws IOException:一次读取一行内容,返回值为null,来判断读完毕
3.字节缓冲输出流
BufferedWriter
成员方法
public String newLine() :写入一个分隔符号,以此来实现换行
4.使用字节缓冲输入流来代替Scanner类对象
核心思想为将使用Scanner类中的nextLine()方法去读数据的方式替换为字节缓冲输入流对象的readLine()方法的方式去读数据
Scanner sc = new Scanner(System.in);可拆分为
InputStream in = System.in;
Scanner sc = new Scanner(in);
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));可拆分为
InputStream in = System.in;
nputStreamReader ir = new InputStreamReader(System.in);
BufferedReader br = new BufferedReader(ir);
5.SequenceInputStream
介绍:文件合并流,将多个文件字节流串联,依次读取到此流中
构造方法:
public SequenceInputStream(InputStream s1,InputStream s2):将两个文件的字节流读入此流
public SequenceInputStream(Enumeration<? extends InputStream> e):操作两个以上文件,将这些文件的字节流全部写入此文件合并流中
6.序列化流
ObjectOutputStream:将一个java对象的原始数据变为流数据在网络中传输,前提条件为此对象必须实现标记接口Serializable(序列化接口)
构造方法:
public ObjectOutputStream(OutputStream out) throws IOException:创建序列化流对象
成员方法:
public final void writeObject(Object obj) throws IOException():将对象信息写入序列化流对象
7.反序列化
ObjectInputStream:将网络中传输的对象流数据转为具体对象信息
构造方法
public ObjectInputStream(InputStream in) throws IOException:创建反序列化对象
成员方法
public final Object readObject() throws IOException,ClassNotFoundException:将对象的流数据转为具体对象
8.InvalidClassException异常
名称:序列化版本ID异常
出现原因:因为序列化时,类中的相关编码信息会产生一个序列化版本ID,当修该该类成员时,就会产生一个新的序列化版本ID,因为在反序列化中需要比较在内存中的流的序列化版本ID和源文件流的版本ID,不一致时,就会报错
解决方法:勾选设置序列化ID的相关设置,使序列化版本ID为一个静态常量,也可以通过关键字transient修饰不参与序列化的成员,修改时不影响序列化版本ID
9.Properties
介绍:属性列表,描述一组属性及属性值,属性及属性值均为String类型,可以保存到流中或者从流中加载,继承自HashTable<K,V>,实现Implements Map<K,V>接口,可以使用Map的基本功能添加功能put(K,V),获取所有键功能keySet(),通过键获取值功能get(K key),但是在此不使用这些功能
特有功能:
添加属性及属性值
public Object setProperty(String key,String value)
遍历属性列表中所有的键
public Set<String> stringPropertyNames()
通过键获取值
public String getProperty(key)
将指定文件内容加载到属性列表中
load(Reader reader/InputStream)
将属性列表的内容保存到指定文件中
store(Writer writer,String comments):参数2为对属性列表的信息描述
10.网络编程
网络:不同地域位置不同计算机通过通信线路相互连接,就形成网络
网络编程:就是某个程序在不同计算机之间进行数据传输
网络编程三要素
ip地址
A类:前一个号段为网络号段,后三个为主机号段
B类:前两个号段为网络号段,后两个为主机号段
C类:前三个号段为网络号段,后一个为主机号段
port端口
0~65535
0~1024为保留端口
协议
UDP协议:不可靠,不需要建立通道,数据大小有限制,通过数据报包传递数据
TCP协议:可靠,需要建立通道,数据大小没有限制,通过字节流传输数据
11.Socket编程
介绍:就是使用套接字流的方式发送和接受数据
特点:两端都必须有Socket对象,而且发送端要有ip和端口号,接受端有端口号
12.InetAddress
介绍:该类表示Internet协议的IP地址
成员方法:
public static InetAddress getByName(String host) throws UnKnownHostException:通过主机名称(计算机全名)获得ip地址文本的字符串形式,返回值代表互联网的IP地址
public String getHostAddress():通过ip地址对象获取ip地址的字符串形式
13.UDP发送端及接受端实现
发送端
1.创建发送端的Socket对象:DatagramSocket用于发送或者接受数据报包的套接字
public DatagramSocket() throws ScocketException
2.创建一个数据报包:DatagramPacket
public static InetAddress getByName(String host):将ip地址的字符串形式转为ip地址对象
public DatagramPacket(byte[] buf,int length,InetAddress address,int port)
3.使用UDP发送端的Socker发送数据报包
public void send(DatagramPacket p) throws IOException
4.释放资源
接受端
1.创建接收端Socket对象
public DatagramSocket(int port) throws SocketException
2.创建一个自定义缓冲字节数组作为参数传入数据报包构造方法,创建接受容器
public DatagramPacket(byte[] buf,int length)
3.通过接受容器接受数据报包
public void receive(DatagramPacket p) throws IOException
4.解析数据报包
public byte[] getData():接受容器调用此方法可以获取到数据报包中的真实数据
public int getLength():接受容器调用此方法可以获取到数据报包的真实长度
5.展示数据
public InetAddress getAddress():接受容器调用此方法可以获取到数据报包的ip地址的字符串形式
6.释放资源