Java周记——第三周

这篇博客详细介绍了Java的I/O框架,包括字节流、字符流、File和Properties的操作。接着讲解了网络编程基础和常见协议,深入到InetAddress类的理解。此外,还探讨了反射机制,包括类对象、反射调用和设计模式。最后,文章涵盖了Java8的新特性,如Lambda表达式、方法引用、Stream以及新的时间API。
摘要由CSDN通过智能技术生成

一: I/O框架

1.1. 流

        概念:流是内存与存储设备之间传输数据的通道;

        按方向分类:

                输入流:将存储设备中的内容读入到内存中。

                输出流:将内存中的内容写入到存储设备中。

        按单位分类:

                字节流:以字节为单位,可以读写所有数据;

                字符流:以字符为单位,只能读写文本数据;

        按功能分类:

                节点流:具有实际传输数据的读写功能;

                过滤流:在节点流的基础之上增强功能;

1.2.字节流

1.2.1 字节抽象类

InputStream 字节输入流
        public int read(){}。
        public int read(byte[] b){}。
        public int read(byte[] b,int off,int len){}。
OutputStream 字节输出流
        public void write(int n){}。
        public void write(byte[] b){}。
        public void write(byte[] b,int off,int len){}

1.2.2 字节节点流

 FileOutputStream
        public void write(byte[] b)。
        一次写多个字节,将b 数组中所有字节,写入输出流。
 FileInputStream
        public int read(byte[] b)。
        从流中读取多个字节,将读到内容存入b 数组,返回实际读到的字节数。
        如果达到文件的尾部,则返回-1

1.2.3 字节缓冲流

缓冲流: BufferedOutputStream/BufferedInputStream
        提高IO 效率,减少访问磁盘的次数。
        数据存储在缓冲区中,flush 是将缓存区的内容写入文件中,也可以直接 close

1.2.4 对象流

对象流: ObjectOutputStream/ObjectInputStream
        增强了缓冲区功能。
        增强了读写8 种基本数据类型和字符串功能。
        增强了读写对象的功能:
        readObject() 从流中读取一个对象。
        writeObject(Object obj) 向流中写入一个对象。
对象序列化的细节:
        必须实现Serializable 接口。
        必须保证其所有属性均可序列化。
        transient修饰为临时属性,不参与序列化。
        读取到文件尾部的标志:java.io.EOFException

1.3 字符编码

ISO-88591 :收录除ASCII 外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符
号。
UTF-8: 针对Unicode 的可变长度字符编码。
GB2312: 简体中文。
GBK: 简体中文、扩充。
BIG5: 台湾,繁体中文。
注:当编码方式和解码方法不一致时,会出现乱码。

1.4 字符流

1.4.1 字符抽象类

Reader 字符输入流
        public int read(){}。
        public int read(char[] c){}。
        public int read(char[] b,int off,int len){}。
Writer 字符输出流
        public void write(int n){}。
        public void write(String str){}。
        public void write(char[] c){}。

1.4.2 字符节点流

FileWriter
        public void write(String str) 。 一次写多个字符,将b数组中所有字符,写入输出流。
FileReader
        public int read(char[] c) 。
        从流中读取多个字符,将读到内容存入c 数组,返回实际读到的字符数;如果达到文件的尾
部,则返回 -1

1.4.3 字符缓冲流

缓冲流: BufferedWriter/BufferedReader
        支持输入换行符。
        可一次写一行、读一行。

1.4.4 打印流

PrintWriter
        封装了print() / println() 方法,支持写入后换行。
        支持数据原样打印。

1.4.5 转换流

转换流: InputStreamReader/OutputStreamWriter
        可将字节流转换为字符流。
        可设置字符的编码方式。

1.5 File、FileFilter

1.5.1 File类

概念:代表物理盘符中的一个文件或者文件夹。
常用方法:
createNewFile()
创建一个新文件。
mkdir()
创建一个新目录。
delete()
删除文件或空目录。
exists()
判断 File 对象所对象所代表的对象是否存在
getAbsolutePath()
获取文件的绝对路径
getName()
取得名字。
getParent()
获取文件 / 目录所在的目录。
isDirectory()
是否是目录。
isFile()
是否是文件。
length()
获得文件的长度。
listFiles()
列出目录中的所有内容。
renameTo()
修改文件名为。

1.5.2 FileFilter接口

FileFilter 文件过滤器接口
        boolean accept(File pathname)。
        当调用File 类中的 listFiles() 方法时,支持传入 FileFilter 接口接口实现类,对获取文件进行过
滤,只有满足条件的文件的才可出现在 listFiles() 的返回值中。

1.6 Properties实现流操作

Properties:属性集合
特点:
        存储属性名和属性值。
        属性名和属性值都是字符串类型。        
        没有泛型。
        和流有关。

二:网络编程

2.1 网络

网络:由点和线构成,表示诸多对象之间的相互联系;

计算机网络:为实现资源共享和信息传递,通过通信线路连接起来的若干主机;

常见计算机网络:

        互联网:(Internet)点与点相连;

        万维网:(WW-Word Wide Web)端与端相连;

        物联网:(loT - Internet of things)物与物相连;

        网络编程:让计算机与计算机之间建立连接、进行通信。

网络模型:

        OSI参考模型:OSI(Open System Interconnect),即开放式系统互联。 是ISO组织在1985年研究的网络互联模型。 该体系结构标准定义了网络互联的七层框架(物理层数据链路层网络层传输层会话层表示层应用层)。每层功能:

第七层:应用层负责文件访问和管理、可靠运输服务、远程操作服务。( HTTP FTP
SMTP )。
第六层:表示层负责定义转换数据格式及加密,允许选择以二进制或 ASCII 格式传输。
第五层:会话层负责使应用建立和维持会话,使通信在失效时继续恢复通信。(断点续
传)。
第四层:传输层负责是否选择差错恢复协议、数据流重用、错误顺序重排。( TCP
UDP )。
第三层:网络层负责定义了能够标识所有网络节点的逻辑地址。( IP 地址)。
第二层:链路层在物理层上,通过规程或协议(差错控制)来控制传输数据的正确性(MAC )。
第一层:物理层为设备之间的数据通信提供传输信号和物理介质。(双绞线、光导纤维)。

        TCP/IP模型:TCP/IP模型是因特网使用的参考模型,将协议分成四层:网络接口层、网络层、传输层、应用层。每层功能:

第四层:应用层负责传送各种最终形态的数据,是直接与用户打交道的层,典型协议是
HTTP FTP 等。
第三层:传输层负责传送文本数据,主要协议是 TCP UDP 协议。
第二层:网络层负责分配地址和传送二进制数据,主要协议是 IP 协议。
第一层:接口层负责建立电路连接,是整个网络的物理基础,典型的协议包括以太网、 ADSL
等等。

2.2 常见协议

Tcp协议:Transmission Control Protocol 传输控制协议:
        是一种面向连接的、可靠的、基于字节流的传输层通信协议。数据大小无限制。连接过程需要三次握手,断开连接的过程需要四次挥手。
UDP协议:User Datagram Protocol用户数据包协议:
        是一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,每个包的大小64KB
IP协议:Integer Protocol Address互联网协议地址/网际协议地址:
        分配给互联网设备的数字标签(唯一标识)
IP地址版本:
        IPV4: 4 字节 32 位整数,并分成 4 8 位的二进制数,每 8 位之间用圆点隔开,每 8 位整数可以
转换为一个 0~255 的十进制整数。
格式: D.D.D.D 例如: 255.255.255.255
        IPV6: 16 字节 128 位整数,并分成 8 段十六进制数,每 16 位之间用圆点隔开,每 16 位整数可
以转换为一个 0~65535 的十进制数。
格式: X.X.X.X.X.X.X.X 例如: FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF.FFFF
IP地址分类:
        A类:政府机构, 1.0.0.1 ~ 126.255.255.254
        B类:中型企业, 128.0.0.1 ~ 191.255.255.254
        C类:个人用户, 192.0.0.1 ~ 223.255.255.254
        D类:用于组播, 224.0.0.1 ~ 239.255.255.254
        E类:用于实验, 240.0.0.1 ~ 255.255.255.254
        回环地址:127.0.0.1 ,指本机,一般用于测试使用。
查看 IP 命令: ipconfig
测试 IP 命令: ping D.D.D.D
端口号:在通信实体上进行网络通讯的程序的唯一标识。
端口分类:
        公认端口:0~1023
        注册端口:1024~49151
        动态或私有端口:49152~65535
常用端口:
        MySql: 3306
        Oracle: 1521
        Tomcat: 8080
        SMTP: 25
        Web服务器: 80
        FTP服务器: 21

2.3InetAddress类

概念:表示互联网协议( IP )地址对象,封装了与该 IP 地址相关的所有信息,并提供获取信息的常
用方法。
常见方法:
public static InetAddress getLocalHost()
获得本地主机地址对象
public static InetAddress getByName(String host)
根据主机名称获得地址对象
public static InetAddress[] getAllByName(String host)
获得所有相关地址对象
public String getHostAddress()
获取 IP 地址字符串
public String getHostName()
获得 IP 地址主机名

三:反射

3.1 类对象

类的对象:基于某个类new出来的对象,也称为实例对象。

类对象:类加载的产物,封装了一个类的所有信息(类名、父类、接口、属性、方法、构造方法);每个类加载到内存都会生成一个唯一的类对象。

获取类对象的方法

(1)Student s = new Student(); Class c = s.getClass();

(2)Class c = 类名.class;

(3)Class c = Class.forName("包名.类名(全限定名)");

3.2 反射调用操作

常见方法:

public String getName()
获取类的完全名称
public Package getPackage()
获取包信息
public Class<? super T> getSuperclass()
获取父类
public Class<?>[] getInterfaces()
获取实现父接口
public Field[] getFields()
获取字段信息
public Method[] getMethods()
获取方法信息
public Constructor<?>[] getConstructors()
获取构造方法
public T newInstance()
反射创建对象

3.3 设计模式

概念:
        一套被反复使用、多数人知晓的、经过分类编目的、代码设计经验的总结。
        可以简单理解为特定问题的固定解决方法。
        在Gof 的《设计模式》书中描述了 23 种设计模式。
好处: 使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性、重用性。
工厂设计模式:
        开发中有一个非常重要的原则“ 开闭原则 ,对拓展开放、对修改关闭。
        工厂模式主要负责对象创建的问题。
        可通过反射进行工厂模式的设计,完成动态的对象创建。
单例模式:
        单例:只允许创建一个该类的对象
方式一:饿汉式(类加载时创建,天生线程安全)。
public class SingleTon { 
    private static final SingleTon instance=new SingleTon(); 
    private SingleTon() {}
    public static SingleTon getInstance() { 
        return instance; 
    } 
}

方式二:懒汉式(使用时创建,线程不安全,加同步)。

public class SingleTon2 { 
    // 创建对象 
    private static SingleTon2 instance = null; 
    // 私有化构造方法 
    private SingleTon2() { }
    // 静态方法 
    public static SingleTon2 getInstance() { 
        if(instance==null) {
            //提高执行效率 
            synchronized (SingleTon2.class) { 
                if (instance == null) { 
                    instance = new SingleTon2(); 
                } 
            } 
         }
         return instance; 
    } 
}
方式三:懒汉式(静态内部类写法)
public class SingleTon3 { 
    private SingleTon3() {} 
    private static class Holder{ 
        static SingleTon3 instance=new SingleTon3(); 
    }
    public static SingleTon3 getInstance() { 
        return Holder.instance; 
    } 
}

3.4 枚举和注解

枚举是一个引用类型,枚举是一个规定了取值范围的数据类型。
        枚举变量不能使用其他的数据,只能使用枚举中常量赋值,提高程序安全性。
        定义枚举使用enum 关键字。
枚举的本质:
        枚举是一个终止类,并继承Enum 抽象类。
        枚举中常量是当前类型的静态常量。
注意:
        枚举中必须包含枚举常量,也可以包含属性、方法、私有构造方法。
        枚举常量必须在前面,多个常量之间使用逗号隔开,最后分号可写可不写。
注解概念:
        是代码里的特殊标记, 程序可以读取注解,一般用于替代配置文件。
        开发人员可以通过注解告诉类如何运行。
Java 技术里注解的典型应用是:可以通过反射技术去得到类里面的注解,以决定怎么去运
行类。
注解属性类型:
        String类型
        基本数据类型
        Class类型
        枚举类型
        注解类型
        以上类型的一维数组
元注解:用来描述注解的注解
@Retention: 用于指定注解可以保留的域。
        RetentionPolicy.CLASS:
        注解记录在class 文件中,运行 Java 程序时 , JVM 不会保留,此为默认值。
        RetentionPolicy.RUNTIME:
        注解记录在 class 文件中,运行 Java 程序时, JVM 会保留,程序可以通过反射获取该注释
        RetentionPolicy.SOURCE:
        编译时直接丢弃这种策略的注释。
@Target
        指定注解用于修饰类的哪个成员。

四: Java8新特性

4.1 Lambda表达式

概念:
         Lambda 表达式是特殊的匿名内部类,语法更简洁。
        Lambda表达式允许把函数作为一个方法的参数(函数作为方法参数传递),将代码像数据
一样传递。
语法:
        <函数式接口 > < 变量名 > = ( 参数 1 ,参数 2...) -> {]()
        //方法体
        [};
基本使用:
        Lambda引入了新的操作符: ->( 箭头操作符 ) -> 将表达式分成两部分:
        左侧:( 参数 1 ,参数 2…) 表示参数列表
        右侧:{ } 内部是方法体
注意事项:
        形参列表的数据类型会自动推断。
        如果形参列表为空,只需保留() 。
        如果形参只有1个,()可以省略,只需要参数的名称即可。
        如果执行语句只有一句,且无返回值,{}可以省略,若有返回值,则若想省去{},则必须同时省略 return,且执行语句也保证只有一句。
        Lambda不会生成一个单独的内部类文件。
函数式接口概念:
        如果一个接口只有一个抽象方法,则该接口称之为函数式接口。
        函数式接口可以使用Lambda 表达式, Lambda 表达式会被匹配到这个抽象方法上 。
                @FunctionalInterface 注解检测接口是否符合函数式接口规范。
常用函数式接口:
接口
参数类型
返回类型
说明
Consumer< T >
费型接口
Tvoidvoid accept(T t);对类型为T的对象应用操作
Supplier< T > 供给
型接口
T
T get(); 返回类型为 T 的对象
Function< T,R >
数型接口
T
R
R apply(T t); 对类型为 T 的对象应用操作,并返回类
型为 R 类型的对象。
Predicate< T >
言型接口
T
boolean
boolean test(T t); 确定类型为 T 的对象是否满足条
件,并返回 boolean 类型。

4.2 方法引用

概念:

        方法引用是Lambda 表达式的一种简写形式。
        如果Lambda 表达式方法体中只是调用一个特定的已经存在的方法,则可以使用方法引用。
常见形式:
        对象:: 实例方法
        类:: 静态方法
        类:: 实例方法
        类::new

4.3 Stream

概念:流( Stream )与集合类似,但集合中保存的是数据,而 Stream 中保存对集合或数组数据的操作。
特点:
        Stream 自己不会存储元素。
        Stream 不会改变源对象。相反,他们会返回一个持有结果的新 Stream
        Stream 操作是延迟执行的,会等到需要结果的时候才执行
使用步骤:
创建:
        新建一个流。
中间操作:
        在一个或多个步骤中,将初始Stream 转化到另一个 Stream 的中间操作。
终止操作:
        使用一个终止操作来产生一个结果。该操作会强制之前的延迟操作立即执行,在此之后,该
Stream 就不能使用了
创建Stream:
       
        通过Collection 对象的 stream() parallelStream() 方法。
        通过Arrays 类的 stream() 方法。
        通过Stream 接口的 of() iterate() generate() 方法。
        通过IntStream LongStream DoubleStream 接口中的 of range rangeClosed 方法。
中间操作:
        filter、 limit skip distinct sorted
        map
        parallel
串行流和并行流:
        串行流使用单线程。
        并行流使用多线程,效率更高。
常见终止操作:
        forEach、 min max count
        reduce、 collect

4.4 新时间API

概述:
之前时间 API 存在问题:线程安全问题、设计混乱。
本地化日期时间 API
        LocalDate
        LocalTime
        LocalDateTime
        Instant:时间戳。
        ZoneId:时区。
        Date、 Instant LocalDateTime 的转换。
        DateTimeFormatter:格式化类。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值