关于Stream流io流实用小整理

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代码 ,相对路径指的是从工程的根目录开始的路径, ./表示工程根目录,作为开头可以省略

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方法)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

岛森年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值