集合体系:
Collection
--List
--ArrayList 基于数组
--LinkedList 基于链表
--Set
--HashSet 基于HashMap
--TreeSet
元素对应的类必须实现Comparable接口 实现其中compareTo方法-自然顺序
比较器-Comparator接口 实现compare方法
TreeSet(比较器对象)
Arrays.sort(数组,比较器对象)
Collections.sort(List集合对象,比较器对象)
迭代遍历
foreach底层就是基于迭代器实现的
迭代器-Interator接口
hashNext()
next()
remove()
如果希望能通过增强for循环来遍历,实现Interable接口,实现interator抽象方法
注意:
迭代过程中必须通过迭代器对象的remove方法来移除
Map
--HashMap 基于数组+链表+红黑树
原理
遍历HashMap:
1、先获取key的set集合,遍历set集合,根据当前key来获取对应的value值
2、获取entry的set集合,遍历set集合,根据entry获取key value
IO流
方向分类:
I:Input 输入 从外部读取数据到程序中
O:Output 输出 数据从程序中写出到外部某个地方
数据单位:
字节
字符
四大基本流:
字节输入流-InputStream
字节输出流-OutputStream
字符输入流-Reader
字符输出流-Writer
以上四大基本流都是抽象类,不能创建对象,不能直接使用
数据源:
磁盘 内存 网络 外部设备
File+基本流:
FileReader-文件字符输入流
FileWriter-文件字符输出流
FileInputStream-文件字节输入流
FileOutputStream-文件字节输出流
FileReader+FileWriter:
只适用于文本文件
FileReader:读取文件数据
构造方法:
public FileReader(File file)
public FileReader(String fileName)
方法:
public int read()-读取数据 每次读取一个字符
返回值int:表示当前读取到的字符的码表值
如果读取到文件末尾 返回-1
public int read(char[] cbuf)-读取数据到字符数组中
返回值int: 表示当前读取的字符个数
如果读取到文件末尾 返回-1
字符数组作用缓冲数组,提高读取的效率
每次读取不会清空字符数组,注意一定要通过返回值来确定本次真正读取的数据个数
close()-关闭流
FileWriter:写出数据到文件
构造方法:
public FileWriter(File file)--写出的数据会将原来文件中的内容清空
FileWriter(String fileName) --写出的数据会将原来文件中的内容清空
追加内容写出:
public FileWriter(File file,boolean append)
append:true 写出数据时追加的效果
FileWriter(String fileName,boolean append)
append:true 写出数据时追加的效果
方法:
write(int c)--写出单个字符
write(String str)--写出字符串类型
write(char[] cs)--写出字符数组
flush()--将缓冲区的数据刷到文件中
close()-关闭流
注意:
如果文件不存在,则FileWriter会自动创建该文件;如果存在,默认情况是直接清空再写入数据。
FileWriter底层有一个缓冲区,写出数据时是先将数据写出缓冲区中,如果缓冲区满了,则自动将数据写出到文件;如果缓冲区数据没满,则程序停止,可能会将缓冲区中的数据吞掉,从而丢失数据;建议写出数据之后一定要调用flush的方法刷新底层的缓冲区;
流在程序中是会占用大量资源的,流一旦使用完毕务必关流
练习:
编写程序完成文件复制:
e:\\code\\hello.txt复制到e:\\hello.txt
文件剪切
FileInputStream-文件字节输入流
读取数据
构造方法:
public FileInputStream(File file)
public FileInputStream(String name)
方法:
public int read()-读取一个字节数据
返回值:
当前读取到的字节
如果读取到文件末尾 则返回-1
public int read(byte[] b)-将数据读取到字节数组中
返回值:
当前读取到的字节个数
如果读取到文件末尾 则返回-1
FileOutputStream-文件字节输出流
写出数据
构造方法:
public FileOutputStream(File file)-清空
public FileOutputStream(File file,boolean append)-追加
public FileOutputStream(String fileName)-清空
public FileOutputStream(String fileName,boolean append)-追加
方法:
public void write(int b)-写出一个字节数据
public void write(byte[] b)-写出一个字节数组
练习:
图片的复制
不能用字符流 必须用字节流
将e:\\code\\cat.jpg复制到e盘根目录 文件名和之前保持一致
流的异常处理
try catch捕获流的异常并且进行处理
步骤:
1、流对象的外置定义 初始值为null
2、try包裹可能会产生异常的代码 catch来捕获异常
3、try中创建流对象进行赋值
4、无论try中是否会抛出异常,都一定要在finally中关闭流资源对象
5、在finally中先判断对象是否为null,如果不为null则调用close方法来关闭资源;如果没有判断是否为null,则可能会抛出空指针异常
6、close方法也有异常,通过try catch包裹处理,finally中将流对象强制设置为null
等待垃圾回收器回收流对象资源
参考代码:
//将e:\\code\\cat.jpg复制到e盘根目录 文件名和之前保持一致
File file = new File("e:\\code\\cat.jpg");
//流对象的外置定义 初始值为null
FileInputStream in = null;
FileOutputStream out = null;
try{
//给流创建对象进行初始化赋值
//字节输入流读数据--FileInputStream
in = new FileInputStream(file);
//字节输出流写出数据--FileOutputStream
out = new FileOutputStream("e:\\" + file.getName());
//读取数据
byte[] bs = new byte[1024];
int len;
while((len = in.read(bs))!=-1){
//数据读取到bs数组中
//将读取到的数据写出
out.write(bs,0,len);
out.flush();
}
}catch(FileNotFoundException e1){
e1.printStackTrace();
}catch (IOException e2){
e2.printStackTrace();
}finally {
//无论是否抛出异常都要执行的代码
//关流
//判断in不为null
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
//不让in再引用输入流堆空间 当垃圾回收器扫描到输入流对象时就会将该对象回收掉
in = null;
}
}
if(out != null){
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
out = null;
}
}
}
缓冲流
特点:
提供了读取数据或写出数据的缓冲区,提高读取或写出的效率
设计原理:
对于真正读取数据或写出数据的流对象包装了一个缓冲区,就称为了缓冲流
对于用户编写程序时感觉缓冲流和之前的流使用方式几乎一致的
分类:
BufferedReader-字符缓冲输入流
BufferedWriter-字符缓冲输出流
BufferedInputStream-字节缓冲输入流
BufferedOutputStream-字节缓冲输入流
BufferedReader:
构造方法:
public BufferedReader(Reader in)
Reader抽象 传参为Reader子类 FileReader的对象
方法:
public String readLine()--读取一行数据
如果已经达到文件末尾 则返回null
BufferedWriter:
构造方法:
public BufferedWriter(Writer out)
方法:
public void newLine()-换行
作业:
字符串缓冲流实现文件复制
BufferedInputStream
BufferedOuputStream
自行测试
创建对象
完成数据读取或写出
转换流
字节<->字符互相转换
作用:
解决中文乱码问题
字节->字符:InputStreamReader--读取数据
构造方法:
public InputStreamReader(InputStream in, String charsetName)
--指定读取数据时使用的码表
字符->字节:OutputStreamWriter--写出数据
构造方法:
public OutputStreamWriter(OutputStream out, String charsetName)
序列化和反序列化流
序列化:将内存中的对象写出
持久化:将内存中的对象写出到文件中
反序列化:读取数据还原回内存中的对象
第三方的序列化技术:
avro
Goggle ProtoBuf
ObjectOutputStream
序列化
构造方法:
public ObjectOutputStream(OutputStream out)
方法:
writeObject(Object obj)
ObjectInputStream
反序列化流
构造方法:
public ObjectInputStream(InputStream in)
方法:
Object readObject()
类型的强制转换
注意:
要想被序列化,要求对象的类必须实现Serializable接口
Serializable接口中没有抽象方法 标记接口
如果实现了该接口 对象可以被序列化
如果没实现 不能序列化