本帖最后由 小石姐姐 于 2018-4-27 10:43 编辑
学习笔记
#------------------------web之前---------------------------
IO体系结构(终结版)
# 按照流的用途分:
文件输入输出流
|_ 字节流
|_ FileInputStream
|_ FileOutputStream
|_ 字符流
|_ FileReader
|_ FileWriter
缓冲输入输出流
|_ 字节流
|_ BufferedInputStream
|_ BufferedOutputStream
|_ 字符流
|_ BufferedReader
|_ BufferedWriter
对象输入输出流
|_ ObjectInputStream
|_ ObjectOutputStream
打印输出流
|_ 字节流
|_ PrintStream
|_ 字符流
|_ PrintWriter
# 体系结构:
字节流
|_ InputStream # 字节输入流
| |_ FileInputStream # 专门操作文件的字节输入流
| |_ BufferedInputStream # 带有缓冲区的字节输入流, 效率高
| |_ ObjectInputStream # 对象输入流
|
|_ OutputStream # 字节输出流
|_ FileOutputStream # 专门操作文件的字节输出流
|_ BufferedOutputStream # 带有缓冲区的字节输出流, 效率高
|_ ObjectOutputStream # 对象输出流
|_ PrintStream # 字节打印流
字符流
|_ Reader # 字符输入流
| |_ BufferedReader # 带有缓冲区的字符输入流, 效率高
| |_ InputStreamReader # 将字节流转换为字符流的转换输入流
| |_ FileReader # 专门操作文件的字符输入流
|
|_ Writer # 字符输出流
|_ BufferedWriter # 带有缓冲区的字符输出流, 效率高
|_ OutputStreamWriter # 将字节流转换为字符流的转换输出流
|_ FileWriter # 专门操作文件的字符输出流
|_ PrintWriter # 字符打印流
#乱码
1.原因: 读的编码与写的编码不一致
2.解决方法: 保证读和写的编码一致, 即可解决
处理乱码的2种方式:
1.String通过指定编码转为byte数组, 然后再创建String: (GBK字符串转UTF-8字符串写入文件)
先将String通过目标编码转为byte数组: byte[] bys = "月薪过万".getBytes("UTF-8");
再将byte数组转换为String: String str = new String(bys);
写入到文件: fw.write(str);
2.OutputStreamWriter可以指定编码写入文件, 免去使用String通过编码转换为byte数组的步骤
OutputStreamWriter OutputStreamWriter(OutputStream out, String charsetName): 创建转换流对象, 并指定编码
多线程中的常见问题
1. 资源共享: 卖票问题
* 共享资源定义位置: 共享资源要定义在多个线程能够共同使用的地方, 如:
* 多个Thread共用同一个Runnable实现类对象, 则定义为Runnable实现类的非静态成员变量
* 如果只用Thread子类, 则可以定义为Thread子类的静态成员变量
* 操作共享数据的线程安全问题: 使用同步解决
* 同步代码块
* `synchronized (锁对象) {}`
* 锁对象
* 必须是多个线程共享的对象:
* 一个类的Class对象
* 如果是实现Runnable, 则可以是this
* 同步方法
* `public (static) synchronized void method() {}`
* 锁对象
* 静态同步方法, 锁对象是: 方法所在类的Class对象
* 非静态同步方法, 锁对象是: this
2. 不同线程之间通信:
* wait(), notify(), notifyAll()
* 这三个方法必须在同步代码块中, 用锁对象来调用, 否则会抛异常
3. 死锁: 同步代码块中的线程不出来, 也不释放锁; 同步代码块外的线程拿不到锁, 只能等在外面.
* 发生死锁的原因:
* 同步代码块内的线程, 可能处在死循环, IO阻塞, 或sleep状态
* 多个线程互相持有锁又不释放锁
# UDP收发数据步骤
* 发送端
1. 为发送端创建Socket对象(DatagramSocket):
* `DatagramSocket udp = new DatagramSocket();`
2. 创建数据并打包:
* `DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);`
3. 发送数据:
* `DatagramSocket`对象的`void send(DatagramPackage p)`
4. 释放资源:
* `DatagramSocket`对象的`void close()`
* 接收端
1. 创建接收端Socket对象:
* `DatagramSocket DatagramSocket(int port)`
2. 接收数据
* 创建包对象: `DatagramPacket datagramPackage(byte[] buf, int length)`
* 接收包: `DatagramSocket`对象的`void receive(DatagramPacket p)`, 该方法会阻塞等待接收数据
3. 解析数据
* 获取发送端信息
* `DatagramPacket`对象的`InetAddress getAddress()`: 获取客户端
* `DatagramPacket`对象的`byte[] getData()`: 获取数据
* `DatagramPacket`对象的`int getLength()`: 获取数据长度
4. 输出数据
5. 释放资源:
* `DatagramSocket`对象的`void close()`
#TCP收发数据步骤
* 客户端
1. 创建客户端Socket对象(建立连接):
* `Socket Socket(InetAddress add, int port)`
2. 获取输出流对象:
* `Socket`对象的`OutputStream getOutputStream()`
3. 发送数据:
* `OutputStream`对象的`void write(byte[] b)`
4. 释放资源:
* `OutputStream`对象的`close()`
* `Socket`对象的`close()`
* 服务端
1. 创建服务端ServerSocket对象:
* `ServerSocket ServerSocket(int port)`
2. 监听数据:
* `ServerSocket`对象的`Socket accept()`, 获取客户端Socket对象
* 监听时是阻塞的
3. 获取输入流对象:
* `Socket`对象的`InputStream getInputStream()`
4. 获取数据:
* `InputStream`对象的`int read(byte[] buf)`
5. 输出数据:
* 将获取的字节数组转换为String打印输出
6. 释放资源:
* `Socket`对象的`void close()`方法
* `ServerSocket`对象的`void close()`方法
#反射
* 概念: 在程序运行时, 获取任何一个类的所有属性和方法(包括私有的). 调用任意一个对象的所有属性和方法(包括私有的)
* 前提:
* 获得字节码对象
* 获取字节码对象的3种方法
1. `对象.getClass()`
2. `类名.class`
3. `Class.forName(String fullClassName)`
* 反射能干的事
* 获取一个类的字节码对象, 通过该字节码对象:
* 获取一个类的构造方法(public或全部权限的)
* 创建一个类的对象
* 获取一个类的成员属性(public或全部权限的)
* 获取属性值
* 设置属性值
* 获取一个类的成员方法(public或全部权限的)
* 调用成员方法
#------------------------web第一天---------------------------
HTML的排版标签
标题标签:h标签<h1>...<h6>
段落标签:p标签
字体加粗标签:b标签
字体斜体标签:i标签
字体下划线:u标签
居中标签:<center>标签
图片标签:<img>
* 属性:
* src:图片的来源.
* width:图片的宽度.
* height:图片的高度.
* alt:图片找不到显示的内容.
HTML的超链接标签
HTML的超链接标签:<a>
* 属性:
* href:链接的路径
* target:打开的方式
* _self :在自身页面打开
* _blank:新打开一个窗口
无序列表的属性:
* type属性
* disc :实心点.
* circle:空心圆
* square:方块.
有序列表的属性:
* type属性:
* 1 :数字类型
* a :英文类型
* i :罗马字符
* start属性:从哪开始
HTML的表格标签
属性:
width :表格宽度
height :表格高度
border :边框
align :表格水平位置:
* left
* center
* right
<td>的属性:
* colspan=”列数”
* rowspan=”行数”
HTML的表单标签
HTML的表单标签:<form>
* 常用属性:
* action属性:提交的路径.默认提交到当前页面
* method属性:请求的方式.GET和POST.默认是GET.
GET方式和POST方式的区别
* GET :数据会显示到地址栏中.GET方式提交是有大小的限制.
* POST :数据不会显示到地址栏中.POST方式提交的是没有大小限制.
#HTML中表单元素:
* <input type=”text”> :文本框.
* 常用属性:
* name :表单元素的名称.必须有name属性,然后后台才可以接收数据.
* value :文本框的默认值.
* size :文本框的长度.
* maxlength:文本框输入的最大长度.
* readonly:只读文本框.
* <input type=”password”>:密码框.
* 常用属性:
* name :表单元素的名称.必须有name属性,然后后台才可以接收数据.
* value :密码框的默认值.
* size :密码框的长度.
* maxlength:密码框输入的最大长度.
* <input type=”radio”>:单选按钮.
* 常用的属性:
* name :表单元素的名称.必须有name属性,然后后台才可以接收数据.
* value :单选按钮的默认值.
* checked:单选按钮默认被选中.
* <input type=”checkbox”>:复选按钮.
* 常用的属性:
* name :表单元素的名称.必须有name属性,然后后台才可以接收数据.
* value :单选按钮的默认值.
* checked:单选按钮默认被选中.
* <input type=”button”> :普通按钮.没有任何功能的按钮.
* <input type=”submit”> :提交按钮.
* <input type=”reset”> :重置按钮.
* <input type=”file”> :文件上传的表单项.
* <input type=”hidden”> :隐藏字段.
* <input type=”image”> :图片按钮
* <select>:下拉列表.
* <textarea>:文本域.
|
|