文件和IO
File
-
File:文件 & 文件夹
-
文件操作:创建、删除、控制
-
文件夹操作:创建、删除、遍历
IO流
-
概念:Input 输入,读入,Output 输出,写入
-
IO主体:内存
-
数据源 : 提供数据的文件
-
数据端: 接收数据的文件
-
工具:流
-
字节流:继承自 InputStream / OutputStream 这两个抽象类。 FileInputStream / FileOutputStream ObjectInputStream / ObjectOutputStream
-
字符流:继承自 Reader / Writer 这两个抽象类。 FileReader / FileWriter
-
缓冲流:缓冲流是一种装饰器类,目的是让原字节流、字符流新增缓冲的功能。 BufferedInputStream & BufferedOutputStream BufferedReader & BufferedWriter
-
数据流:允许字节流直接操作基本数据类型和字符串。 DataOutputStream & DataInputStream
-
-
Serializable && Externalizable
-
Serializable
接口主要用于对象的序列化和反序列化。序列化是将对象的状态转换为字节流,以便可以保存到文件中或通过网络传输,而反序列化则是将字节流恢复为对象。 -
实现
Serializable
接口非常简单,只需让类实现这个接口即可 -
用于存储到本地磁盘或网络传输的对象必须实现序列化接口Serializable,如果对象中的某些属性不想被序列化,将该属性用transient(临时的)修饰即可。另外,static成员也不会被序列化。
-
-
持久化
-
数据从内存转存到可掉电设备
-
为什么要实现 Serializable
接口?
-
持久化:
- 使对象能够被存储到文件、数据库或其他存储介质中,以便在后续使用时恢复。
-
网络传输:
- 在分布式系统中,通过网络发送对象时,需要将其序列化为字节流,接收方再进行反序列化。
-
深度复制:
- 可以通过序列化和反序列化来实现对象的深度复制,即创建一个对象的完全独立副本。
-
简化代码:
- Java 提供了内置的序列化机制,使用
Serializable
接口可以避免手动编写复杂的序列化逻辑。
- Java 提供了内置的序列化机制,使用
XML
-
XML: eXtensible Markup Language ,可扩展标记语言
-
应用范围:
-
数据存储
-
系统配置
-
数据交换
-
XML文档结构
-
文档声明
-
DTD 约束 (可选)
-
文档正文
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE team SYSTEM "team.dtd"> <team> <coach> <name>张三</name> <sex>男</sex> </coach> <players> <player id="1"> <name>李四</name> <age>25</age> <height>178</height> <weight>68</weight> </player> <player id="2"> <name>王五</name> <height>185</height> <weight>70</weight> </player> </players> </team>
-
XML元素命名规则
-
名称可以含字母、数字以及其他的字符
-
名称不能以数字或者标点符号开始
-
名称不能以字符 “xml”(或者 XML、Xml)开始
-
名称不能包含空格
-
标签名大小写敏感
-
DTD: Document Type Definition
-
作用:规范元素、属性以及元素间的关系
-
量词:
?
: 被修饰的元素可以出现0次或1次+
: 被修饰的元素至少要出现1次*
: 被修饰的元素可以出现任意次
<!ELEMENT team (coach,players)> <!ELEMENT coach (name,sex)> <!ELEMENT players (player+)> <!ELEMENT player (name,age?,height,weight)> <!ATTLIST player id CDATA #REQUIRED > //#REQUIRED:必须的,#IMPLIED:非必须的 <!ELEMENT name (#PCDATA)> <!ELEMENT age (#PCDATA)> <!ELEMENT sex (#PCDATA)> <!ELEMENT height (#PCDATA)> <!ELEMENT weight (#PCDATA)>
XML解析
-
DOM: 把整个xml文件读入内存进行解析
-
SAX:一次读一部分,分段解析
反射
-
概念:java程序在运行时加载、使用编译期完全未知的类信息。
-
Class: class:类型修饰符 Class:是一个数据类型
-
对比:
Class:描述所有的类(数据类型) 共性:成员变量、构造器、成员方法
Student:描述所有的学生 。共性:学号、姓名、学习
Java 的反射机制是 Java 语言的一项强大特性,允许程序在运行时动态地获取类的信息,包括类的属性、方法和构造函数等,并能够操作它们。反射机制可以用于许多场景,例如框架开发、动态代理、序列化与反序列化等。
反射的基本概念
-
Class 类:Java 中每个对象都是由一个
Class
对象来描述的。可以通过Class.forName()
、实例的getClass()
方法或者使用.class
来获取类的Class
对象。 -
获取信息:反射提供了多种方法来获取类的信息,包括:
- 获取类的名称
- 获取类的字段
- 获取类的方法
- 获取类的构造函数
-
访问成员:通过反射,可以动态调用方法、访问和修改字段的值。
反射的优缺点
优点
- 灵活性:可以在运行时动态加载和操作类,增强了程序的灵活性和扩展性。
- 框架支持:许多 Java 框架(如 Spring、Hibernate)利用反射机制来提供 DI(依赖注入)、AOP(面向切面编程)等功能。
缺点
- 性能开销:反射机制通常比直接调用慢,因为它涉及到动态查找和类型检查。
- 安全性:通过反射可以访问和修改私有成员,可能会破坏封装性,增加安全隐患。
- 复杂性:反射代码相对较难理解和维护。
注解
-
注释:说明
-
注解:功能
-
Java 注解(Annotations)是 Java 5 引入的一种元数据机制,允许开发者在代码中添加额外的信息,这些信息可以在编译时、类加载时或者运行时被读取和处理。注解通常用于提供编译器指令、配置框架行为、生成文档等。
语法
@interface()
内置注解
-
@Override 重写
-
@SusspressWarnings 抑制警告
-
@FunctionalInterface 函数式接口(只有一个抽象方法的接口)
自定义注解
public @interface SqlProvider { String value() default "delete from tableName"; String sql() default ""; }
四大元注解
-
元数据:说明数据的数据
-
元注解:说明注解的注解
-
四大元注解
-
@Target
-
@Retention
-
@Documented
-
@Inherited
-
注解的用途
编译时检查:提供额外信息供编译器使用,以进行检查。
运行时处理:框架(如 Spring 和 Hibernate)利用反射处理注解,以增加灵活性和功能。
生成文档:javadoc 可以提取注解信息生成文档。