输入流:从数据源-》程序
输出流:程序-》数据源
字符流:
字符数据:字符流将原始数据解释成字符的序列
依赖编码方法:文件数据存储依赖文件编码方式,字符流的输入和输出是需要编码和解码的(效率低)
字节流:
字节(二进制)数据:字节流会将数据解释成原始的二进制数据
可移植:与主机的编码方法是无关的
效率高:二进制数据不需要编码和解码
面试题1:字符流和字节流的区别
面试题2:javaio中常见类、字节流、字符流、具体实现类、阻塞方法
按照角色分为节点流和处理流
节点流:程序直接连接到实际的数据源,和实际的输入/输出节点相连
处理流:在节点流之上进行了封装,通过封装后的流来进行数据的读写
带缓冲的字节流BufferedInputStream BufferedOutputStream
8*1024 KB
带缓冲的字符流 BufferedReader BufferedWriter
序列化和反序列化
序列化过程:类的对象 转化为字节流 保存到磁盘
反序列化过程:从字节流恢复类的对象
与平台无关
面试题3:序列化的目的?
对象序列化事实上将对象保存在磁盘中,或允许在网络中直接传输序列化的对象,对象序列化机制把内存中的对象转换为与平台无关的二进制流,可以将二进制持久地保存在磁盘中,或者通过网络传输到另外一个网络节点,其他程序一旦获得这种二进制,都可以将二进制流恢复成之前的java对象,实现了java对象的持久化保存,使得对象可以脱离java程序而独立存在;
面试题4:如何去实现序列化?
- 实现java.io.Serlizable接口,标记当前类是可序列化的,(标记接口,不包含任何方法和字段,只是用于标记),使用Serliable接口去实现序列化,则会产生一个序列化ID,其是一个标识符号,它通常使用对象哈希序列化标记在对象上,可以使用序列化ID对对象实现版本控制
- 创建一个ObjectOutputStream对象
- 通过ObjectOutputStream对象的writeObject方法可以输出可序列化的对象
反序列化的步骤?
- 创建ObjectInputStream对象
- 通过ObjectInputStream对象的readObject方法读取流中的对象,将对象反序列化为真实的对象
注意:抛出的异常(ClassNotFound)、无需通过构造器、可序列化若有父类父类也需序列化
Java8 新特性
lambda表达式
lambda表达式是一段可以传递的代码,将面向对象中的传递数据 ----》传递行为
Runnable r =new Runnable(){
@Override
public void run(){
sout("hello world");
}
}
Runnable r=()->sout("hello world");
()和->:(variable),->是lambda表达式的操作符,将参数和方法的具体逻辑分离,这个线程启动后执行的是->之后的代码片段
fun(int x,int y){
x+y;
}
==》 int sum=(x,y)->x+y;
其实这个和web前端中的js语法相同
Stream
对集合进行链状流式操作
对数据进行处理,负责计算数据,和CPU打交道
一个集合存储Student数据,删选学生名为小王的学生;删选出年龄大于20的学生;通过Stream对其删选
Stream操作步骤
- 创建一个Stream
- 使用Stream操作数据,中间流,返回一个流
- 终止流,终止Stream,直接返回结果
- 关闭流
基本方法:
filter:接受lambda,从流中排除一些数据
limit(n):使其元素不超过给定对象
skip(n):跳过元素,返回一个扔掉前n个元素的流
distict:通过流所生成的元素的hashcode和equals进行去重
foreach():遍历
map:接受lambda,该函数会被应用到每一个元素
sorted():排序
终止Stream
allMatch(lambda)-检查所有的元素是否都匹配
anyMatch(lambda)-检查至少有一个元素可以匹配
noneMatch(lambda)-检查是否没有一个元素匹配
findFirst-返回第一个元素
findAny-返回任意元素
count-返回流中元素的总个数
max-返回流中元素的最大值
min-返回流中元素最小值
reduce:可以将流中的元素结合起来,得到一个总的值
collect:将流转换为,接受一个Collector接口实现
获取流:1)IntStream stream=Arrays.stream(array);
2)Stream stream=Stream.of(“1”,“2”);
3)Stream stream=Stream.iterate(0,(x)->x+1)