学习心得--I/O流、网络编程、反射
本周是在千锋学习的第七周,本周学习了I/O框架、网络编程—基于TCP的编程,以及反射。
I/O框架
- I/O流概念:内存与存储设备之间传输数据的通道。
- 字节流:字节输入流 InputStream、字节输出流 OutputStream
- 字节节点流:FileOutputStream、FileInputStream
- 字节过滤流:
(1)缓冲流:BufferedOutputStream/BufferedInputStream
(2)对象流:ObjectOutputStream/ObjectInputStream
(3)对象序列化:1)必须实现Serializable接口。2)必须保证其所有属性均可序列化。3)transient修饰为临时属性,不参与序列化。4)读取到文件尾部的标志:java.io.EOFException。 - File类:代表物理盘中的一个文件或者文件夹。
- File类方法:
- FileFilter接口:当调用File类中的listFiles()方法时,支持传入FileFilter籍人口实现类,对获取文件进行过滤,只有满足条件的文件才可出现在listFiles()的返回值中。
- 字符编码:UTF-8:针对Unicode的可变长度字符编码。GBK:简体中文、扩充;当编码方式和解码方式不一致时,会出现乱码。
- 字符流:字符输入流(Reader)、字符输出流(Writer)
- 字符节点流:FileWriter 、FileReader。
- 字符过滤流:缓冲流:BufferedWriter/BufferedReader、以及PrintWriter。
- 桥转换流:InputStreamReader/OutputStreamWriter
网络编程
- 网络模型:OSI开放式系统互联、 TCP/IP模型
- TCP/UDP协议:
(1)TCP协议(传输控制协议):是一种面向来连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。建立连接的过程需要三次握手,断开连接的过程需要四次挥手。
(2)UDP协议(用户数据报协议):是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64kb。(多用于游戏) - IP协议(互联网协议地址/网际协议地址):分配给互联网设备的数字标签(唯一标识)。
- Port端口号:在通信实体上进行网络通讯的程序的唯一标识。
- InetAddress类:表示互联网协议(IP)地址对象,封装了与该IP地址相关的所有信息,并提供获取信息的常用方法。
- InetAddress类方法:
1)public static InetAddress getLocalHost()
2)public static InetAddress getByName(String host)
3)public static InetAddress[] getAllByName(String host)
4)public String getHostAddress()
5)public String getHostName() - 基于TCP的网络编程(Socket、ServerSocket)
(1)服务器端:1)创建服务端套接字。2)调用accept等待客户端。3)通过客户端获取输入输出流。4)读取数据。5)响应数据。6)关闭
(2)客户端:1)创建客户端,连接指定的IP+端口号。2)取输入输出流。3)发送数据。4)接收响应数据。5)关闭
反射
- 类对象:
(1)类的对象:基于某个类new出来的对象,也称为实例对象。
(2)类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法)。 - 获取类对象:
(1)通过类的对象,获取类对象
(2)通过类名获取对象
(3)通过静态方法获取类对象 - 常用方法:
- 工厂设计模式:开发中有一个非常重要的原则“开闭原则”,对扩展开放、对修改关闭。
- 单例模式:只允许创建一个该类的对象。
(1)饿汉式:天生线程安全(无锁)、类加载时创建(不用的时候,也被迫创建了,占用资源)
(2)懒汉式:使用时创建、天生线程不安全(加同步锁);效率低。
(3)懒汉式:使用时创建、天生线程安全(效率高、不占空间)
JDK8
- Lambda表达式概念:允许把函数作为一个方法的参数(函数作为参数传递到方法中)。
- 函数式接口:如果一个接口只有一个抽象方法,则该接口称为函数式接口。
内置四个核心函数式接口:
1)Consumer 消费型接口 void accept(T t);
2)Supplier 供给型接口 T get();
3)Function<T,R> 函数型接口 R apply(T t);}
4)Predicate 断言型接口 boolean test(T t); - 方法引用:方法引用是Lambda表达式的一种简写形式,如果Lambda表达式方法体中只是调用一个特定的已存在的方法,则可以使用方法引用。使用::操作符将对象或类和方法名的名字分隔开来。
接下来附上基于TCP编写的聊天室小程序: