Java基础知识拾遗(四)
IO
SequenceInputStream,允许链接多个InputStream对象。在操作上该类从第一个InputStream对象进行读取,知道读取完全部内容,然后切换到第二个InputStream
知道最后一个InputStream对象的末尾文职。到达每个文件末尾是,与之关联的流就会被关闭。
ObjectOutput接口,支持对象序列化。ObjectOutputStream实现了ObjectOutput接口,负责将对象写入流中。
ObjectInput接口,支持对象串行化。ObjectInputStream实现了ObjectInput接口,读取串行化对象的输入流。
NIO
NIO系统并非用于替换java.io中基于流的I/O。NIO系统构建于两个基础术语之上:缓冲区和通道。缓冲区用于容纳数据,通道表示打开的到I/O设备的链接。通常,为了
使用NIO系统,需要获取用于链接I/O设备的通道以及用于容纳数据的缓冲区。然后操作缓冲区,根据需要输入或者输出数据。
缓冲区,是Buffer的子类,定义了对所有缓冲区都通用的核心功能:当前位置、界限和容量。当前位置是缓冲区中下一次发生读取和写入操作的索引,当前位置通过大多数
读或写向前推进。界限是缓冲区最后一个有效位置之后下一个位置的索引。容量是缓冲区能够容纳的元素的数量。
MappedByteBuffer是Buffer的子类,用于将文件映射到缓冲区。
通道,是由java.nio.channels保定义的。表示到I/O源或者目标的打开的链接。通道实现了Channel接口并扩展了Closeable接口和AutoCloseable接口。可以使用带资源的try语句
管理通道。
字符集和选择器,字符集定义了将字节映射为字符的方法。可以使用编码器将一系列字符编码成字节,使用解码器将一系列字节解码城字符。字符集、解码器、编码器
由java.nio.charset包中定义的类支持。因为提供了默认的编码器和解码器,所以通常不需要显示第使用字符集进行工作。
选择器支持基于键的,非锁定的多通道I/O使用选择器可以通过多个通道执行I/O。选择器最适合用于基于套接字的通道。
Path接口,封装了文件的路径,Path被打包到java.nio.file中,并继承接口:Watchable、Iterable<Path>、Comparble<Path>。Watchable接口描述了可以被监视是否发生变化的对象。
Files类,对文件执行的许多操作都是由Files类中的静态方法提供的。要进行操作的文件是由文件的Path指定的。因此Files类的方法使用Path对象指定将要进行操作的文件。
文件属性接口,与文件关联的是一套属性。这些属性包括文件的创建时间,最有一次修改时间,文件是否是目录以及文件的大小等。NIO将文件属性组织到几个接口中。属性是
通过在java.nio,file.attribute包中定义的接口层次表示的。
流 API
流是数据的渠道。代表了一个对象的序列。流操作数据源,如数组或集合。刘本身不存储数据,而只是移动数据,自移动过程中可能会对数据执行过滤,排序或其他操作。
流操作不修改数据源。
Stream<T> T指定流中元素的类型。
缩减操作,流提供的min()和max()方法基于流中元素返回记过,他们代表了缩减操作,因为每个操作都将一个流缩减为一个值。除了它们还提供了reduce()方法。通过
reduce()方法,可以基于任意条件,从流中返回一个值。
Obtional<T> reduce(BinaryOperator<T> accumulator) Optionalle包含了结果
T reduce(T identityVal, BinaryOperator<T> accumulator) accumulator是一个操作两个值并得到结果的函数。identityVal,和流中任意元素的累计操作,得到的结果
就是元素本身,没有改变。BinaryOperator是一个函数式接口,扩展了BiFunction函数式接口。BinaryOperator
的apply():T apply(T val, U val2),在用到reduce()中时,val将包含前一个结果,val2将包含下一个元素在第一次
使用时,取决于所使用的reduce()版本,val将包含单位制或者第一个元素。
<U> U reduce(U identityVal, BiFunction<U, ? super T, U> accumulator, BinaryOperator<U> combiner) combiner定义的函数将accumulator函数得到的两个值合并起来。
需要理解的是,累加器操作必须满足一下按个约束:
-无状态
-不干预
-结合性
无状态以为这操作不依赖于任何状态信息。因此每个元素被单独处理。不干预是指操作不会改变数据源。最后,操作必须具有关联性。关联性使用的是其标准的数学含义。
即,给定一个关联运算符,在一系列操作中使用该运算符时,先处理哪一个无关紧要。
并行流,使用并行流有一点要记住:元素的顺序。流可以使有序的,也可以是无需的。如果数据源是有序的,那么流也是有序的。使用并行流的时候,有时候允许流是无序
的可以获得性能上的提升。当并行流无序时,流的每个部分都可以被单独操作,不需要与其他部分协调。
映射,将一个流的元素映射到另一个流。
<R> Stream<R> map(Function<? super T, ? extends R> mapFunc) R指定新流的元素类型,T指定调用流的元素类型。mapFunc是完成映射的Function实例。
映射函数必须是无状态和不干预的。因为map()方法返回一个新流,所以它是中间方法。
收集,有时候需要从流中获得集合。流API提供了collect()方法。它有两种形式:
<R, A> R collect(Collector<? super T, A, R> collectorFunc) R指定结果的类型,T指定调用流的元素类型。内部累计类型由A指定。collectorFunc指定收集过程如何执行。
collecto()方法是一个终端方法。
<R> R collect(Supplier<R> target, BiConsumer<R, ? super T> accumulator, BiConsumer <R, R> combiner) target指定如何创建用于保存结果的对象,如,要使用LinkedList
作为结果集合,需要指定其构造函数。accumulator函数将一个元素添加到结果中,而combiner函数合并两个部分结果。他们都必须是无状态和不干预,并且具有关联性。
target参数的类型是Supplier。它定义了get()方法。get()方法没有参数,在这里返回一个类型为R的对象。因此,在collect()方法中使用,get()方法返回一个指向可变存储
对象的引用。accumulator和combiner类型是BiConsumer.BiConsumer是java.util.function包中定义的一个函数式接口。指定了抽象方法accept(): void accept(T obj, U obj2)
Collectors类定义了许多可以直接使用的静态收集器方法。
迭代器和流,虽然流不是数据存储对象,但是仍然可以使用迭代器来遍历其元素,就如同使用迭代器遍历集合中的元素一样。流API支持两类迭代器。一类是传统的Iterator
一类是JDK8的Splitertor.
Java基础知识拾遗(四)的更多相关文章
- java基础知识拾遗(四)
1.Runnable对象 启动线程:(new Thread(new MyRunnable()).start() 2.jsp中<%@ page language="java" ...
- Java基础知识拾遗(一)
类型提升规则 Java定义了几个应用于表达式的类型提升规则:所有byte.short和char类型的值都被提升为int类型.如果有一个操作数是long类型,将这个表达式提升为 long 类型:如果有一 ...
- java 基础知识(四)
自己写一个简单的Map 清浅池塘 程序员,专栏:Java那些事儿唯一作者,咨询前请先点详细资料 130 人赞同了该文章 许多许多年以前,在自学Java的时候,笔者曾经写过一个简单的Map,当年很有 ...
- java基础知识(四)java内存机制
Java内存管理:深入Java内存区域 上面的文章对于java的内存管理机制讲的非常细致,在这里我们只是为了便于后面内容的理解,对java内存机制做一个简单的梳理. 程序计数器:当前线程所执行的字节码 ...
- Java 基础知识总结 (四、String)
四.String public final class String extends Object implements Serializable, Comparable<String>, ...
- Java基础知识拾遗(三)
集合框架 SortedSet接口,声明了以升序进行排序的行为. Queue接口,声明了队列行为,队列通常是先进先出的列表 Deque接口,扩展了Queue接口,声明了双端队列的行为.双端队列可以像标准 ...
- 正则表达式、Calendar类、SimpleDateFormat类、Date类、BigDecimal类、BigInteger类、System类、Random类、Math类(Java基础知识十四)
1.正则表达式的概述和简单使用 * A:正则表达式(一个字符串,是规则) * 是指一个用来描述或者匹配一系列符合某个语法规则的字符串的单个字符串.其实就是一种规则.有自己特殊的应用. * B: ...
- java基础知识拾遗(三)
1.类加载 bootstrap classloader -引导(也称为原始)类加载器,它负责加载Java的核心类. extension classloader -扩展类加载器,它负责加载JRE的扩展目 ...
- java基础知识拾遗(二)
1.finally public static int func (){ try{ return 1; }catch (Exception e){ return 2; }finally { retur ...
随机推荐
- Git的安装与配置
在安装Git之前,首先要下载Git安装包. 下载地址:https://gitforwindows.org/ 下载完后打开安装:如下步骤 按着以上步骤安装完成 ...
- APICloud Studio2新建应用报错和检出错误
今天心血来潮,闲暇时间想做个移动应用app,听一哥们说APICloud开发app很方便,就查询了一下,看了之后简直就是热血沸腾,我感觉正是我一直要找的工具 信心满满的开始着手使用,看了一下介绍我选择了 ...
- SQL Server含逗号分隔的数据匹配维表
日常有时候导出数据需求时,数据列会遇到带有分隔符的ID,但又需要匹配维表(如下图所示)将ID变成名称. 这种情况可以采用“分隔-匹配-合并”的方法 具体代码为: -- 准备工作1:创建事实表数据 CR ...
- 记一次zabbix排错(数据库安装在其它服务器上)
记一次zabbix排错 故障现象 1.在/var/log/zabbix/zabbix_server.log中出现以下报错: 12106:20190314:090947.010 [Z3001] conn ...
- Vue.js02:数据绑定v-model用法
<!-- v-model 实现数据的双向绑定 --> <!-- v-model 只能用在表单元素中 --> 示例: <!DOCTYPE html> <!-- ...
- Windows 组策略的生效规则
一般的继承与处理规则 若上层父OU的某个组策略项目被设定,但是其下层子OU未设定该项目,则下层子OU继承上层父OU的这个组策略项目设定值 若在下层子OU内的某个组策略项目被设定,则此设定值预设会覆盖由 ...
- python从开始到放弃想标题的day12
上次有说道函数的返回值,但是不是所有的数据类型都有返回值,一些常用的比如str基本都有返回值,list基本都没有返回值,dict基本都有返回值,还有就是函数和函数之间的数据是互不影响的,哪怕是一个函数 ...
- 学习storm实现求和操作
1 storm求和简单操作 主要逻辑,就是spout发送数据源,blot进行处理数据,主要注意的点就是 spout这有个nextTuple自旋,和使用父类的declare..方法声明要发送到下游的名称 ...
- C语言之输入月收入,输出该月应纳税额-2019(简易版)
#include<stdio.h> #include<stdlib.h> #include<string.h> #define s1 0.03 //税率b < ...
- [Alpha阶段]发布说明
[Alplha阶段]发布说明 小小易校园小程序发布说明 版本功能 [Alpha版本]功能说明 1.注册及登录功能 2.修改密码功能 3.自动登录.退出登录功能 4.个人资料修改及简历模板功能 5.查看 ...