Stream流
生成Stream流的方式
- 1 Collection体系集合(List Set)
- 使用默认方法stream()生成流
- 2 Map体系集合
- 把Map转成Set集合(keySet,entrySet),间接的生成流
- keySet().stream() 或者 entrySet().stream()
- 3 数组
- 通过Arrays中的静态方法stream生成流 Arrays.stream(arr)
- 4 同种数据类型的多个数据
- 通过Stream接口的静态方法of(T… values)生成流 , 原理还是数组变流
IO流
- OutputStream: 抽象类,表示字节输出流的所有类的超类
字节流(方便复制文件,操作一切文件)FileOutputStream,FileInputStream
实用子类: FileOutputStream类,字节写入
- public FileOutputStream(File file)
- public FileOutputStream(String name)
- .close (关闭流一定要关)
- 后面加true,表示从后面写入
- write,写入,可以写入字节数组
- 换行
- windows:\r\n
- linux:\n
- mac:\r
字节输入流FileInputStream 字节流提取
-
FileInputStream(File file)
-
FileInputStream(String name)
-
.close (关闭流一定要关)
-
read();读取
-
read(byte[] b): 从输入流中读取一些字节数,并将它们存储到字节数组 b中 ,返回读取的长度,如果没有数据,返回-1。
-
读取的是编码数字,需要转成char才能显示,一个中文三个字节
加入finally来实现释放资源
代码
- 1 把关闭流放到finally里 因为在close前可能会有异常 导致close无法执行到
- 2 finally里要判断流是否为null 因为流对象在赋值前也可能遇到异常,最后导致空指针
- 3 下面的日期格式的代码 是为了演示异常
public class Demo05 { public static void main(String[] args) { FileOutputStream fos = null; try { SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM"); sdf1.parse("20a2022-12345"); fos = new FileOutputStream("exceptionfile/aaa1/aaa.txt", true); byte[] bytes = {100, 101, 102, 103, 104, 105}; fos.write(bytes); SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); sdf.parse("20a2022-12345"); //fos.close(); } catch (IOException e) { e.printStackTrace(); } catch (ParseException e) { e.printStackTrace(); } finally { //3 关闭流 System.out.println("关闭流"); try { if (fos != null) { fos.close(); } } catch (IOException e) { e.printStackTrace(); } } } }
字符流(方便操作中文文件和文本文件)FileWriter,File Reader
jdk11后用字符文件读写流就可以指定编码了
格式为new FileWriter(“qqqqqq.txt”, Charset.forName(“utf-8”));
字符串常用方法
byte[] getBytes() 字符串转字节数组
byte[] getBytes(String charsetName) 字符串转字节数组
String (byte[] bytes) 字节数组转字符串
FileWriter 字符的写入
FileWriter(File file) 可以传入一个File对象
FileWriter(String fileName) 也可以传入一个字符串文件地址
后面加true,表示从后面写入
方法
wirte(char[])写入一个字符或者字符数组,可以指定字符数组开始写入的位置和结束位置
wirte(String[])写入一个字符串或者字符串数组,可以指定字符串数组开始写入的位置和结束
必须写.close (关闭)
到8kb才会自动写入除非写flush
FileReader 字符的提取
FileReader(File file) 可以传入一个File对象
FileReader(String fileName) 也可以传入一个字符串文件地址
方法
read() 读取一个字符或者一个字符数组长度( char[] )
必须写.close (关闭)
字符缓冲流 BufferedWriter ,BufferedReader(高效)
BufferedWriter 写数据
特有方法 newLine() 换行
write(字符串)
BufferedReader 读数据
readLine() 读一整行文字 结果是字符串类型 读取已达结尾返回null
.close(); 同样必须要关闭
转换流 InputStreamReader OutputStreamWriter (jdk 8 之前,jdk11之后字符流可以指定编码格式了)
InputStreamReader(new FileInputSream , String类型的格式) 使用指定格式创建InputStreamReader对象 读取
OutputStreamWriter(new FileOutputSream , String类型的格式)使用指定格式创建OutputStreamWriter对象 写
.close
File 文件类
官方定义:文件和文件夹 路径名的抽象表示形式
-
3种构造
- 1File(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的File实例
- 2File(String parent, String child) 从父路径名字符串和子路径名字符串创建新的File实例
- 3File(File parent, String child) 从父文件对象和子路径名字符串创建新的File实例
绝对路径和相对路径
- 绝对路径: 从盘符开始,一个文件的完整路径。
- 相对路径 有两种情况:
- 1 一般的理解:相对于当前写代码的文件所在目录,
./
表示当前文件所在目录,作为开头可以省略 - 2 在idea中创建工程写java代码 ,相对路径指的是从工程的根目录开始的路径,
./
表示工程根目录,作为开头可以省略
- 1 一般的理解:相对于当前写代码的文件所在目录,
File方法
new FIle 创建文件对象
对象 . createNewFile() 新建文件,如果已存在就不会创建,路径错误会异常
对象 . mkdir 创建文件夹
对象 . mkdirs 创建多个多层文件,包括不存在的父级目录
对象 . delete(); 删除文件,如果对象定义是文件夹只能删除空文件夹
对象 . isDirectory(); 检测是不是目录/文件夹
对象 . isFile(); 检测是不是文件
对象 . exists(); 检测存不存在
对象 . getAbsolutePath() 返回绝对路径(字符串)
对象 . getPath() 转换为路径字符串
对象 . getName() 返回文件或者目录名字符串
对象 . listFiles(); 把当前目录里的所有文件和文件夹放到一个File数组里,返回类型是个File数组
File[] files = file03.listFiles();
for (File file : files) {
System.out.println(file.getName());
}
遍历文件夹里面所有的文件夹或者文件
对象 . length 获取文件字节长度
Collections工具类
- 使用Collections添加多条数据到集合 addall
- 打乱集合 shuffle(list<?> list);
- 使用Collections给集合排序 sort
- 1 给要排序的类 实现Comparable接口 重写compareTo
- 2 传入比较器对象 Comparator 重写compare
Map集合
map集合的特点
- 双列集合,一个键对应一个值
- 键不存在重复的,值可以重复
常用方法
put(K V) 添加元素
removre( K ) 根据键删除键值对
clear 清空
containsKey( K ) 判断集合是否包含这个键
containsValue( V ) 判断集合是否包含这个值
isEmpty() 判断集合是否为空
size() 获取集合长度
获取数据的方法
get( K ) 根据键获取值
keySet() 获取所有键的集合 返回一个Set集合
valuse() 获取所有值的集合,返回一个集合
entrySet() 获取所有键值对 对象的集合,返回一个Set
第一种遍历
- get可以根据key获取值,keySet可以获取所有的key
- 可以遍历所有的key,再根据每个key获取值
第二种遍历
- entrySet()方法可以获取map里 所有的键值对(封装到了Entry类的对象中),然后都放到了一个set集合中返回
- 返回的set集合中,存的是Map.Entry类型的对象,每个对象可以获取到这条数据的key和value
Set<Map.Entry<String, String>> es = map.entrySet();
for (Map.Entry<String, String> e : es) {
System.out.println(e.getKey() + "=====" + e.getValue());
}
第三种遍历
- forEach
map.forEach((k, v) -> {
System.out.println(k + "====" + v);
});
TreeMap和HashMap
TreeSet add方法里是用的TreeMap的put方法
TreeSet所有的数据 都在TreeMap中作为key来保存的
TreeMap会给它的key排序
HashSet add方法里是用的HashMap的put方法
HashSet所有的数据 都在HashMap中作为key来保存的
Stream流
Stream流的三类方法
- 1获取Stream流
- 创建一条流水线,并把数据放到流水线上准备进行操作
- 2中间方法
- 流水线上的操作
- 一次操作完毕之后,还可以继续进行其他操作
- 3终结方法
- 一个Stream流只能有一个终结方法
- 是流水线上的最后一个操作
生成Stream流的方式
- 1 Collection体系集合(List Set)
- 使用默认方法.stream()生成流
- 2 Map体系集合
- 把Map转成Set集合(keySet,entrySet),间接的生成流
- keySet().stream() 或者 entrySet().stream()
- 3 数组
- 通过Arrays中的静态方法stream生成流 Arrays.stream(数组)
- 4 同种数据类型的多个数据
- 通过Stream接口的静态方法of(T… values)生成流 , 原理还是数组变流
- //Stream.of方法就是可以把同类型的多个数据转为流对象, 内部就是数组转流
Stream stream4 = Stream.of(“aaa”, “bbb”, “ccc”);
流的中间操作(常用方法)
filter代码 对流中的数据进行过滤
- 流的操作不影响原集合的数据
limit 获取几个数据 skip 跳过几个数据
//获取前5个 然后跳过前3个
al.stream().limit(5).skip(3).forEach(s -> System.out.println(s));
concat 合并流 distinct 去掉重复元素 返回剩余元素
Stream.concat(al.stream(), al1.stream()).forEach
Stream.concat(al.stream(), al1.stream()).distinct().forEach(
map flatMap 对管道流中的每一个数据元素进行转换操作。
map是把数据处理完 转为其他类型的对象
flatMap是把不同数据里的集合里的数据拿出来,合并放一个集合中
Stream流终结操作方法
写了终结操作之后流就关闭(不能再操作流了)
- 终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作
- forEath 对流的每个元素进行操作
- count 返回流中的元素个数
collect 终结收集操作
Collector toList 把元素收集到List集合当中
Collector toSet 把元素收集到Set集合中
Collector toMap 把元素收集到Map集合中 要重写方法什么做为键什么做为值(new Function然后重写apply方法,new Function然后重写apply方法)
个集合中
Stream流终结操作方法
写了终结操作之后流就关闭(不能再操作流了)
- 终结操作的意思是,执行完此方法之后,Stream流将不能再执行其他操作
- forEath 对流的每个元素进行操作
- count 返回流中的元素个数
collect 终结收集操作
Collector toList 把元素收集到List集合当中
Collector toSet 把元素收集到Set集合中
Collector toMap 把元素收集到Map集合中 要重写方法什么做为键什么做为值(new Function然后重写apply方法,new Function然后重写apply方法)