总结
在学习过程中学习很大,每天都是新的内容如果对前一天的内容没有很好的理解消化
第二天的内容学起来就很吃力,理论知识是重点但是敲代码更重要,如果不经常去敲代码
那很多知识点是无法理解并记住的对本周知识点做以下总结:
TCP方式来发送和接受数据
1)创建TCP协议这种方式的客户端的Socket对象
2)写数据--写给服务器
3)关闭资源
TCP服务器端
1)创建服务器端的Socket对象-->绑定端口
2)服务器端监听客户端连接-->获取到指定客户端的Socket对象
3)获取通道的内输入流-->读数据
4)关闭服务器端的Socket对象
客户端发送数据,服务器端接受数据,展示客户端发送的数据,并同时反馈客户端数据,客户端读取反馈的数据
TCP客户端不断的去发送消息,服务器端不断的去接受数据,展示数据(服务器端不关闭)
TCP和UDP的区别
1)是否建立连接通道
TCP需要建立连接通道
UDP不需要建立连接通道
2)是否是可靠连接
TCP是可靠连接, --同步的 --执行效率低
UDP是不可靠数据 --不同的--执行效率高
3)是否传输数据大小有限制
TCP是无限制传输,以一种"字节流"的方式
UDP有数据大小限制(理论64kb),以一种"数据报包"的方式
TCP客户端和服务器进行数据传输的代码实现
//客户端
//1)创建客户端的Socket
Socket s = new Socket("10.35.165.44",8888);
//2)获取通道内的字节输出流
OutputStream out = s.getOutpiutStream() ;
//3)写数据
out.wrrite("hello,TCP".getBytes()) ;
//4)释放资源
s.close() ;
//服务器端
//1)创建服务器端的Socket
ServerSocket ss = new ServerSocket(6666) ;
//2)监听客户端连接
Socket s = ss.accept() ;
//3)获取通道的字节输入流对象
INputStream in = s.getInputStream() ;
//4)一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = in.read(bytes) ;
String message = new String(bytes,0,len) ;
//获取ip
String ip = s.getInetAddress().getHostAddress() ;
//展示数据
System.out.println("date from-->"+ip+",内容是:"+message) ;
//释放资源
ss.close() ;
获取一个类的字节码文件对象的形式
三种方式
1)object类的getClass()方法-->使用对象访问这个方法
2)任意java类型的class属性
3)calss-->字节码文件对象(类对象)
public static Class forName(String classPathname) :参数是当前类或者接口的全限定名称
包类.类名
IO流的分类
BIO:阻塞式流
流的方向:
输入/输出
类型:
字节
字节输入流
InputStream
FileInPutStream 文件字节输入流
BufferedInputStream 字节缓冲输入流
ObjectInputStream:反序列化
字节输出流
OutputStream
FileOutputStream 文件字节输出流
BufferedOutStream 字节缓冲输出流
ObjetOutputStream:序列化
字符
字符输入流
Reader
InputStreamReader(InputStream in)-->将字节输入流转换成字符输出流
字符输出流
Writer
OutputStreamWriter(OutputStream out)-->将文字输出流转换成字符输出流
便捷类-->FileWriter
BufferedWriter:字符缓冲输出流
printWriter:字符打印流
NIO-->非阻塞式流-->
dobbo框架(发现服务/治理服务)-->地产NIO方式
如何读取src下面的exx.properties文件的内容
class Demo{
public static void main(String[] args){
//arc下面--类路径下user.properties (xx.proprties配置文件)
zhangsan=30
//获取配置文件所造字节输入流
InputStream in =
Demo.class.getClassLoader().getResourceAsStream("user.properties") ;
//创建属性集合列表
Properties prop = new Properties() ;
//将配置文件的内容"以字节输入流"的方式加载到属性集合列表中
prop.load(in) ;
}
}
什么是单例设计模式,有哪两种,分别什么有特点
单例设计模式:
始终在内存只有当前这个类或者接口的一个实例;
分为:
饿汉式和懒汉式
饿汉式的特点(不会出现安全的单例模式)
1)当前类具体类
2)这个一加载,就创建当前类的静态实例(私有的)
3)构造方法私有化--外界不能new
4)对外提供静态的公共方法,返回值是当前类本身!
懒汉式的特点(可能出现线程安全问题的一种单例设计模式)
1)当前类具体类
2)当类的成员位置:声明私有的当前类的变量 (静态的)
3)构造私有化--外界不能new
4)对外提供静态的公共方法,返回值是当前类本身
需要对当前类的变量进行判断,如果为null, 才创建当前类实例
返回当前类实例;
class Student{
private static Student s ;
private Student(){}
public synchronized static Student getInsance(){//静态的同步方法,解决线程安全问题!
if(s==null){//需要用的时候才创建对象
s = new Student() ;
}
return s ;
}
}
什么是反射?
某一个类在运行状态中,可以动态的获取类的字节码文件同时创建当前类实例,可以调用成员方法,去动态去给成员变量进行赋值;--满足Java语言特点 "动态性"----->就可以在运行过程某个类或者接口的成员方法,来完成一种
"动态代理"
jdk动态代理--->前提必须有接口
cglib动态代理
如何获取一个类的构造器并去创建对象?
//1)获取这个类的字节码文件对象
Class c = Class.forName("类的完全限定名称-就是包名.类名") ;
//2)获取私有的构造方法所在的Constructor类对象---带有两个参数:String和int类型
Constructor con = c.getDeclaredConstructor(String.class,int.class) ;
//3)防止出现非法访问异常--->取消Java语言访问检查
con.setAccessiable(true) ;
//4)创建当前类实例:使用Constructor类对象
Object obj = con.newInstance("高圆圆",44) ;
数据库定义语句DDL之创建库/删除库/修改库字符集/查询库字符集语法
/*
多行注释
*/
-- 单行注释
# 特殊注释
-- 创建库
create database 库名;
create database if not exists 库名;
-- 删除库
drop database 库名;
drop database if exists 库名;
-- 查询库的字符集
show create database 库名;
-- 修改库的字符集
alter database 库名 (default) character 字符集格式;
-- 查询msyql服务器中已知存在的所有的库
show databases ;
-- 使用哪一个库
use 库名;
-- mysql自带的函数--查询正在使用的库的名称
select database() ;
创建表/删除表/修改表相关语法/删除表
-- 创建表
create table 表名(
字段名称1 字段类型1,
字段名称2 字段类型2,
字段名称3 字段类型3,
...
字段名称n 字段类型n
);
-- 删除表
drop table 表名;
drop table if exists 表名;
-- 修改表的字段
alter table 表名 change 字段名称 新的字段名称 以前的字段类型;
-- 修改表的字段类型 modify
alter table 表名 modify 字段名称 新的字段类型;
-- 修改表:添加新的字段
alter table 表名 add 字段名称 字段类型;
-- 修改表:删除某一列(字段)
alter table 表名 drop 字段名称;
-- 查询表的结构
desc 表名;
-- 查询指定库的所有表
show tables ;
-- 复制表
create table 新表名 like 旧表名;
线程的创建方式
1)继承关系
a)自定一个类继承自Thread
b)重写run方法
c)在用户线程中创建当前类对象(设置线程名称),启动线程
2)实现Runnable接口
a)自定义一个类实现Runnable接口
b)重写run
c)在用户线程main创建Runnable接口实现类对象(资源类),创建Thread类对象,将资源类对象作为参数传递,启动线程
3)线程池
ExecutorService pool = Executors.newFixedThreadPool(几条线程) ;--->创建固定可重用的线程数的线程池
//提交异步任务
要么pool.submit(Runnable接口对象) ;--->计算异步的结果---Future
要么pool.submit(Callable接口对象) ;---->Future
关闭线程池
pool.shutdown() ;
delete from表名和truncate table表名的区别?
共同点:
两个都是将整个表的所有记录数全部删除
不同点:
1)是否会删除表
delete from表名 ;仅仅是将表的所有记录数删除,不会删除这张表
truncate table表名;会将表直接删除(所有数据清空)
2)是否会影响自增主键id值
detele from表名,由于不会删除表,表的结构还在,只是表的数据清了,再次去插入数据,会在上次的基础上id继续自增
truncate table表名,由于删除表,自动一张一模一样的空表,将之前的结构就删除了,直接影响了自增长主键id的值;
DQL语句中的聚合函数列举
-- 查询某列最大的值
select max(字段名称) from 表名;
-- 查询某列的平均分
select avg(字段名称) from 表名;
-- 某列的总数:求和
select sum(字段名称) from 表名;
-- 统计表的总记录数(总条数)
select count(非业务字段) from 表明;
关于数据库的备份和还原
备份和还原
图形界面化方式备份 和还原(简单易于上手)
命令行的备份和还原(记住一些指令)
DBA(数据库管理员)设计完数据库,对库中的所有的数据以及结构进行备份;
防止数据库的信息丢失等等
数据库还原:就是将备份库 加载已知存在的库中(使用备份好.sql脚本文件,执行这个sql脚本)
备份和还原:
1)命令行方式的备份(dos管理员的身份运行)
mysqldump -uroot -p输入密码 库名称>指定磁盘路径"d:\\mysql_dump\\xx.sql文件"
1)命令行方式的还原:
1.1)dos登录mysql,将之前的库删除
1.2)新建一个新的库,使用库
1.3)source 执行本地或者远程路径上的.sql文件
2)使用图形界面化工具去备份
如何的图形界面化工具都是一样的'
备份:
在已知的库上右键->backup-->backup SQL备份到本地磁盘上的sql脚本
还原:删除已知库,新建库,使用库,在图形界面化工具右键-->选择执行 execute SQL script 本地sql文件
数据库的约束(约束用户操作库中的某张表的行为)
每一张表的id,不重复(唯一),非空,设置自增长
约束:限制用户操作数据库的行为
举例:插入数据的时候,直接插入null值
通过约束将上面的用户插入非法数据的行为进行限制!
默认约束:default