基本术语
术语 | |
---|---|
Host | 主机:计算机在计算机网络中的学名 |
IP Address | IP 地址:网际协议中用于标识发送或接收数据报的设备的一串数字 |
IPv4 - Internet Protocol version 4 | 4 byte => 32 位 => 2 ^ 32 个地址 => 使用 . 连接起来 |
IPv6 - Internet Protocol version 6 | 16 byte => 128位 => 2 ^ 128 个地址 |
DNS - Domain Name System | 域名服务 |
Port | 端口:共 65536 个 Port |
Default Port | 端口指定了通讯主机的归属地 |
HTTPS Default Port | 443 |
HTTP Default Port | 80 |
TCP / UDP | 通讯协议 |
TCP - Transport Control Protocol | 基于流的协议 => 全双工协议 => 双方可以同时接收 & 发送 => 定义了字节流在网络上如何发送和接收 |
HTTP - HyperText Transfer Protocol | 超文本传输协议 => 在与主机的连接中发送一些规定的字符 |
HTML - HyperText Markup Language | |
XML - Extended Markup Language | |
CPU - Central Processing Unit | 中央处理器:解释计算机指令以及处理计算机软件中的数据 |
Memory - 内存 | CPU 能直接寻址的存储空间。内存特点是访问速率快 => 断电丢失 => CPU 这个世界慢死了 |
HDD - Hard Disk Drive | 硬盘 => 存储数据,容量大,断电不丢失,慢 |
SSD - Solid-state Disk | 固态硬盘 / 固态驱动器:以集成电路制作的电脑存储设备 |
文件 & IO
文件
- 文件就是一段字节流
- 每个程序负责解释文件中的字节流
java.io.File
// TODO
IO
- 输入输出永远是站在程序的角度上考虑的
- InputStream | OutputStream => 抽象的输入输出操作
- 永远使用绝对路径
java.io.File => 文件的路径
File
class 只代表一个路径 => 抽象的文件路径 => 文件 | 文件夹
方法
-
exists()
|isFile()
|isDirectory()
toPath()
NIO
NIO Java7+ => New IO => Non-Blocking IO => 非阻塞 IO
- java.nio.file.Path -> interface => NIO 的
Path
就是旧版本的File
- java.nio.file.Files -> class => file 的工具类方法
java.nio.file.Path
// TODO
java.nio.file.Files
// TODO
java.nio vs java.io
- 经典的IO模型是基于流的
- 优点:容易理解,方便抽象 => 一份代码既可以读写文件,也可以读写网络
- 缺点:慢
- NIO 基于块的 => 对应的模型是 java.nio.ByteBuffer
- 优点:块之间没有顺序,可以同时写
异常体系 Exception
Exception 异常体系就是在 return
语句之外为方法提供另外一种出口
-
Throwable
=> 可以被抛出的东西 => checked exception => 有毒 -
Exception
=> checked exception => 受检异常 => 有毒 => 预料之内的异常 => 需要对预料之内的异常进行处理 =>IOException
=> 可以恢复-
RuntimeException
=> unchecked exception => 运行时异常,无毒 => 意料之外的 => Bug => 不需要声明
-
-
Error
=> unchecked exception => 错误,无毒 => 不能恢复的异常
try catch finally
- 在栈帧中一旦碰到
throw
它会结束当前栈帧,如果没有try
,异常将击穿所有栈帧,直到遇到try catch
-
try catch finally
中的finally
无论什么情况都会被执行,即使try
|catch
中有return
-
finally
块中不建议写return
语句,finally
块中最好的实践是执行资源的清理工作 -
catch
中做的事情- 处理异常
- 在日志里打印异常
- 返回对应的对异常的处理
-
try-with-resources
=> JDK 7+ =>try(content) {}
=>content
会在finally
中自动的 close => 隐式的finally
=> content 必须实现AutoCloseable
interface
throw vs throws
- throw => 抛出一个
Throwable
,终止方法当前的操作 - throws => 只是一个声明 => 表示一个方法可能会抛出一个异常 => 后果:任何调用了它的方法都有被迫在自己的方法签名上丢一个
throws
语句或者加try catch
catch 的级联与合并
级联
public static void main(String[] args) {
try{
throwCheckedException();
} catch (FileNotFoundException e) {
System.out.println("文件没找到");
} catch (EOFException e) {
System.out.println("文件已到达末尾");
} catch (Exception e) {
e.printStackTrace();
}
}
catch
错误的顺序按照从小到大的顺序排列
合并 Java 7+
public static void main(String[] args) {
try{
throwCheckedException();
} catch (NullPointerException | IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalStateException | IllegalArgumentException e) {
// 做点别的事情
}
}
StackTrace 栈轨迹 & 异常链 Caused by
排查问题最重要的信息,没有之一
public static void main(String[] args) {
try {
processUserData();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
private static class UserAlreadyExistException extends RuntimeException {
public UserAlreadyExistException(String message, Throwable cause) {
super(message, cause);
}
}
private static void processUserData() {
int userId = 1;
try {
insetIntoDatabase();
} catch (SQLException e) {
throw new UserAlreadyExistException("插入 id 为" + userId + "的数据的时候发生了异常", e);
}
}
private static void insetIntoDatabase() throws SQLException {
throw new SQLException("重复的键值");
}
Stack Trace & Caused by
异常抛出原则
- 能用
if else
处理的,不要使用异常(try catch
)- 无法保证
catch
到的异常一定是想抓到的,可能错误的catch
到了更深层次的异常 - 相比于正常的
if
判断,异常的创建是非常,非常昂贵的操作
- 无法保证
- 尽早抛出异常 => 如果可以处理异常,则处理,如果处理不了,要立刻抛出这个异常
- 异常要准确,带有详细信息
- 抛出异常也比悄悄的执行错误的逻辑强的多
异常的处理原则
- 本方法是否有责任处理这个异常? => 不要处理不归自己管的异常
- 本方法是否有能力处理这个异常? => 如果自己无法处理,就抛出
- 如非万分必要,不要忽略异常
try { URLDecoder.decode("", "UTF-8"); } catch (UnsupportedEncodingException ignored) { // 忽略异常 }
JDK 内置异常
NullPointerException
-
ClassNotFoundException
|NoClassDefFoundError
-
IllegalStateException
|IllegalArgumentException
|IllegalAccessException
ClassCastException
知识点
- File Leak Detector => 用于检测没有被正确关闭的文件 => 如果打开一个文件没有关闭的话是很危险的 => 读取一个文件之后一定要正确的关闭它
- CSV => Comma Separated Value => 逗号分隔符文件 => 保存结构化数据的方式
-
String
不可变 - 浏览器对于
application/zip
的 HTTP Response HeaderContent-Type
的处理方式是直接下载 - HTTP 协议是无状态的
- IO 的速度和 CPU 的速度不是一个量级的,可以采用以下两个方式改善性能
- 缓冲 -> buffer | cache => 缓存放在内存中
- 并发 -> 多线程 => CPU 在等待 IO 的过程中去做了其他的事情
- IO 太慢了怎么办?
答:java.io.BufferedReader | java.io.BufferedWriter => 一次性读取 | 写入好多东西到缓冲区 => 缓存放在内存中 - 轮子 => org.apache.commons.io.FileUtils & org.apache.commone.io.IOUtils
- IOException 通常代表预期之内的异常
网友评论