IO
InputStream - 字节流(以字节为单位进行读取) - 二进制文件
Reader - 字符流(以字符为单位进行读取) - 文本文件
OutputStream
Writer
FileWriter构造器的第一个参数是文件名或者文件对象
第二个参数用来指定是否启动追加模式(在原来文件的末尾输出新的内容)
try 把可能在运行时出现状况的代码放在try块中保护起来执行,如果出现了异常状况就通过后面的catch来捕获异常对象并进行相应的处理
FileInputStream的构造器用throws关键字声明了FileNotFoundException异常而且该构造器的代码中判定如果文件无效就用throw关键字抛出异常对象
一个try块后面可以跟多个catch用于捕获不同的异常类型
但是在书写上要保证先捕获子类型异常再捕获父类型异常
如果捕获的异常之间没有父子类关系 那么捕获顺序随意
从Java7开始如果多个catch代码是一致的,可以合并为一个catch打印异常栈轨迹 - 对于调试程序很有帮助的一个方法
e.printStackTrace();
-总是执行代码块 - 不管程序正常异常此处都要执行
此处最适合释放程序中打开的各种外部资源(文件、数据库、网络)
finally {
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
TWR - try-with-resources
从Java7开始可以使用TWR语法将需要释放的外部资源直接放在try后的圆括号中
这样的话不管正常离开还是异常离开try块 外部资源会直接自动关闭
实现了AutoCloseable接口的外部资源对象可以使用TWR语法自动关闭如果频繁的进行IO操作会使得CPU的利用率非常低下
因为I/O操作会导致CPU产生I/O中断 CPU不能满负荷工作
创建一个字节数组作为输入缓冲区 将文件中的数据直接读入缓冲区中
这种做法可以减少I/O中断的次数 从而保证CPU能够不被频繁中断
byte[] buffer = new byte[4096];
package com.baidu;
import java.util.Comparator;
class Test01 {
//折半查找
//面试题
public static <T extends Comparable<T>> int binarySearch(T[] search,T key){
int start = 0;
int end = search.length - 1;
while(start <= end){
//int mid = (start + end) / 2; // 有溢出的风险
//int mid = (end - start) / 2 + start;
int mid = (start + end) >>> 1;
if(search[mid].equals(key)){
return mid;
}
else if(search[mid].compareTo(key) > 0){
end = mid - 1;
}
else{
start = mid + 1;
}
}
return -1;
}
public static <T> int binarySearch(T[] search,T key,Comparator<T> comp){
int start = 0;
int end = search.length - 1;
while(start <= end){
//int mid = (start + end) / 2;
int mid = (end - start) / 2 + start;
if(search[mid].equals(key)){
return mid;
}
else if(comp.compare(search[mid], key) > 0){
end = mid - 1;
}
else{
start = mid + 1;
}
}
return -1;
}
public static void main(String[] args) {
// int a = 1300000000;
// int b = 1000000000;
// System.out.println(a + b);//发生溢出
}
}