使用 先得到集合或数组的Stream流,把元素放上去,然后用这个Stream流简化的API来方便操作元素
一个Stream流只能有一个终结方法,是流水线上的最后一个操作
可以使用Collection接口中的默认方法stream()生成流
default Stream <E> stream() 获取当前集合对象的Stream流
public static <T> Stream<T> stream (T [ ] array) 获取当前数组的Stream流
public static <T> Stream<T> of(T...values) 获取当前数组/可变数据的Stream流
Stream<T> filter(Predicate<? super T> predicate) 用于对流中的数据进行过滤
Stream<T> limit(long maxSize) 获取前几个元素
Stream<T> skip(long n) 跳过前几个元素
Stream<T> distinct() 去除流中重复的元素
Stream<T> map 加工方法 第一个参数 原材料 第二个参数 加工后的结果
static <T> Stream<T> concat(Stream a,Stream b) 合并a和b两个流为一个流
中间方法也成为非终结方法,调用完成后返回新的Stream流可以继续使用,支持链式编程
void forEach(Consumer acton) 对此流的每个元素执行遍历操作
long count() 返回流中元素数 【只能用long类型来接,因为它认为集合元素会很多】
收集Stream流的含义:就是把Stream流操作后的结果数据转回到集合或者数组中去
R collect(Collector collector) 开始收集Stream流,指定收集器
public static <T> Collector toList() 把元素收集到List集合中
public static <T> Collector toSet() 把元素收集到Set集合中
public static <T> Collector toMap(Function keyMapper,Function valueMapper) 把元素收集到Map集合中
因为zhangList已经收集到List集合,所以不能再收集到Set集合中去
但是我们把注释的那个zhangSet打开,如下,换成zhangSet,就ok
异常是程序在编译或者执行的过程中可能出现的问题 注意 语法错误不算在异常体系中
异常一旦出现,如果没有提前处理,程序就会退出JVM虚拟机而终止
Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题
RuntimeException及其子类:运行时异常,编译阶段不会报错(空指针异常,数组越界异常)
除RuntimeException之外的所有异常:编译时异常,编译阶段必须处理的,否则程序不能通过编译(日期格式化异常)
编译时异常:没有继承RuntimeException的异常,编译阶段就会报错
运行时异常:继承自RuntimeException的异常或其子类,编译阶段不报错,运行时会报错
直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能会出现的错误
数组越界异常 ArrayIndexOutOfBoundsException
空指针异常 NullPointerException 直接输出没有问题,但是调用空指针的变量的功能就会报错
不是RuntimeException或者其子类的异常,编译阶段就报错,必须处理,否则代码不通过
处理方法 在划红线的地方 alt+enter 选第一个,即可抛出异常
默认会在出现异常的代码那里自动创建一个异常对象:ArithmeticException
默认会从方法中出现的点这里抛出异常,调用者最终抛出给JVM虚拟机
throws 用在方法上,可以将方法内部出现的异常抛出去给方法的调用者处理
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡
抛出异常格式 方法 throws 异常1 异常2 异常3..{
} -------->这种方法只写一个Exception就ok
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理
这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行
建议格式 按Ctrl+alt+t选中可能会出现问题的代码,然后选择try/catch (此时不直接用Ctrl+enter因为想把多行代码放到try里面所以选中了多行代码,不能再用这个快捷键),代码会全部放在try里面,然后将catch后面的改为Exception,使其可以接受一切类型的异常,不用写多个catch
方式3 上面两种的结合 在方法里抛出异常,即ctrl+enter 时选第一个,然后再main方法里,ctrl+alter选第二个try catch
好处 调用方法的地方知道自己哪里错了,其实和上面都一样,三种我们具体选那种看公司规范
运行时异常编译阶段不会报错,是运行时才可能出错的,所以编译阶段不处理也可以
注意 throw 在方法内部直接创建一个异常对象,并从此点抛出 throws 在方法的申明上,抛出方法内部的异常
程序中的日志可以用来记录程序运行过程中的信息,并可以进行永久存储
输出位置 只能是控制台 可以将日志信息写入到文件或者数据库中
取消日志 需要修改代码,灵活性比较差 不需要修改代码,灵活性比较好
日志规范接口 Commons Logging(JCL) Simple Logging Facade for Java(slf4j)
日志实现框架 Log4j JUL(Java.util,logging) logback 其他实现
因为对Commons Logging(JCL)不满意,有人做了 Simple Logging Facade for Java(slf4j),因为对 Log4j不满意,有人就搞了 logback
logback-core :logback-core模块为其他两个模块奠定了基础,必须有
logback-class :它是log4j的一个改良版本,同时它完整实现了slf4j API
logback-access 模块与Tomcat 和Jetty等Servlet容器集成,以提供HTTP访问日志功能
1 在项目下新建文件夹lib,导入Logback相关的jar包到该文件夹下,并添加到项目依赖库中(选中三个然后右键选add as library)
2 将Logback的核心配置文件logback.xml直接拷贝到src目录下
3 在代码中获取日志对象(写的时候最好在main方法底下写,会有提示,写完后再移到上面)
通过logback.xml中的<append>标签可以设置输出位置和日志信息的详细格式
通常可以设置2个日志输出位置:一个控制台、一个是文件系统文件中
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
级别程度依次是:TRACE<DEBUG<INFO<WARN<ERROR 默认级别是debug(忽略大小) ,对应其方法
作用:用于控制系统中哪些日志级别是可以输出的,只输出级别不低于设定级别的日志信息
具体在<root level="INFO">标签的level属性中设置日志级别
File类在包java.io.File下,代表操作系统的文件对象(文件,文件夹)
File类提供了诸如:定位文件,获取文件本身的信息、删除文件、创建文件(文件夹)等功能 但是不能读写文件内容
File封装的对象仅仅是一个路径名,这个路径可以是绝对路径,也可以是不存在的
public File(String pathname) 根据文件路径创建文件对象 ---> 一般用这种
public File(String parent ,String child) 从父路径和子路径名字符串创建文件对象
public File(File parent,String child) 根据父路径对应文件对象和子路径名字符串创建文件对象
public boolean isDirectory() 测试此抽象路径表示的File是否为文件夹
public boolean isFile() 测试此抽象类表示的File是否为文件
public boolean exists() 测试此抽象路径名表示的File是否存在
public String getAbsolutePath() 返回此抽象路径名的绝对路径名字符串
public String getPath() 将此抽象路径名转换为路径名字符串
public String getName() 返回此抽象路径名表示的文件或文件夹的名称
public long lastModified() 返回文件最后修改的时间毫秒值
public boolean createNewFile() 创建一个新的空的文件
public boolean mkdir() 只能创建一级文件
public boolean mkdirs() 可以创建多级文件
public boolean delete() 删除此抽象路径名表示的文件或空文件夹
delete方法直接删除不走回收站;delete方法默认只能删除空文件夹
public String[] list() 获取当前目录下所有的"一级文件名称"到一个字符串数组中去返回
public File[] listFiles() 获取当前目录下所有的"一级文件对象"到一个文件对象数组中去返回
当调用者是一个有内容的文件夹时,将里面的所有文件和文件夹的路径放在File数组中返回
当调用者是一个有隐藏文件的文件夹时,将里面的所有文件和文件夹的路径放在File数组中返回,包含隐藏
把一个复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解
上面针对规律化的递归,还有非规律化的递归 例如文件搜索 买啤酒问题
买啤酒问题(2元买一瓶 4个盖换一瓶 2个瓶换一瓶 问10元最多买几瓶 剩几个瓶 几个盖)
byte[] getBytes() 使用平台的默认字符集将该 String 编码为一系列字节,将结果存储到新的字节数组中
byte[] getBytes(String charsetName) 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
String(byte[] bytes)使用平台的默认字符集将指定的字节数组来构造新的String
String(byte[] bytes,String charsetName)通过指定的字符集解码指定的字节数组中来构造新的String
前三个数字是 a b c 的 后面十个每两个一组分别代表一个汉字(GBK是如此,如果为utf-8,则有18个字符,前3个是 a b c 的,十五个每三个一组表示汉字)
I 表示input,是数据从硬盘文件读入到内存的过程,称之为输入,负责读
O表示output,是内存程序的数据从内存写到硬盘文件的过程,称之为输出,负责写
字节输入流:以内存为基准,来自磁盘文件/网络的数据以字节的形式读入到内存中去的流称为字节输入流
字节输出流:以内存为基准,把内存中的数据以字节写出到磁盘文件或者网络中去的流称为字节输出流
字符输入流:以内存为基准,来自磁盘文件/网络的数据以字符的形式读入到内存中去的流称为字节输入流
字符输出流:以内存为基准,把内存中的数据以字符写出到磁盘文件或者网络中去的流称为字节输出流
文件字节输入流(每次读取一个字节) read()返回的是读取的那个字节是多少比如96
文件字节输入流(每次读取一个字节数组) read(byte[] buffer) 返回的是读取的数量 比如 3
自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成
字节输出流如何实现数据追加(因为默认是用新的数据将旧的数据全部覆盖)
close()方法是关闭流,关闭包含刷新,关闭后流不可以继续使用了
他可以复制任何东西,包括视频、文档等,因为所有的都是以字节组成的
finally:在异常处理时提供finally来执行所有清除操作,比如说IO流中的释放资源
特 点 :被finally控制的语句最终一定会执行,而且比return先执行,除非JVM退出( System.exit(0); )
可以在finally中结束流操作,因为如果像上面文件拷贝那样结束流,很有可能在结束流操作前遇到错误,导致其不能正常结束流操作
字节输出流如何实现数据追加 在后面加true之后,就的数据不会被清除
close()方法是关闭流,关闭包含刷新,关闭后流不可以继续使用了
缓冲流也成为高效流,或者高级流,之前学习的字节流可以称为原始流
作用:缓冲流自带缓冲区,可以提高原始字节流、字符流读写数据的性能
字节缓冲输入流自带了8kb缓冲池,以后我们直接从缓冲池读取数据,所以性能较好
字节缓冲输出流自带了8kb缓冲池,数据就直接写入到缓冲池中去,写数据性能极高
字节缓冲输入流:BufferedInputStream,提高了字节输入流读取数据的性能,读写功能上并无变化
字节缓冲输出流:BufferedOutputStream,提高了字节输入出流读取数据的性能,读写功能上并无变化
作用:提高字符输入流读取数据的性能,除此之外多了按照行读取数据的功能
必须文件和代码编码一致才不会乱码 如果文件和代码编码不一致,读取将出现乱码
InputStreamReader,可以把原始的字节流按照指定编码转换成字符输入流
OutputStreamWriter,可以把字节输出流按照指定编码转换成字符输出流
作用 可以指定编码把字节输出流转换成字符输出流,从而指定写出去的字符编码
作用:以内存为基准,把内存中的对象存储到磁盘文件中去,成为对象序列化
作用:以内存为基准,把存储到磁盘文件中去的对象数据恢复成内存中的对象,成为对象反序列化
作用:打印流可以实现方便、高效的打印数据到文件中。打印流一般指 PrintStream PrintWriter
可以实现打印什么数据就是什么数据,例如打印整数97 写出去就是97 打印boolean 的true 写出去就是true
打印数据功能上(println)是一模一样的,都是使用方便,性能高效
PrintStream 继承自字节输出流OutputStream,仅支持写字节数据的方法
PrintWriter 继承自字符输出流Writer ,仅支持写字符数据出去
其实System.out.println就是一种输出流,将内容输出到控制台
如下,只打印前两句到控制台,而下面两句在log.txt文件中
其实就是一个Map集合,但我们一般不会当集合使用,因为HashMap更好用
Properties代表的是一个属性文件,可以把自己对象中的键值对信息存入到一个属性文件中去
属性文件 后缀是 .properties 结尾的文件,里面的内容是key=value 后续做系统配置信息的