JavaCoreⅡ
[TOC]
详细的总结一下这章用什么干了什么即可8
第一章 Java8的流库
流遵行了做什么而非怎么做原则
long count = words.stream()
.filter(w->w.length>12)
.count();
将steam修改为parallelStream就可以让流库以并行的方式来执行过滤和计数
创建流
API P7 P8
对流的处理
Stream<T> filter (Predicate<? super T> predicate)
产生一个流-包含流中所有满足谓词条件的元素
<R> Stream<R> map (Function<? super T,? extends R> mapper)
产生一个流-流中为对所有元素应用了mapper的结果
<R> Stream<R> flatMap (Function<? super T,? extends Stream<? extends R>> mapper)
产生一个流-流中为对所有元素应用了mapper的结果链接在一起(每个结果都是一个流)
抽取子流
API P10
limit()
skip()..
组合流
Steam.concat
流转换
API P11
distinct() 剔除重复元素
sorted()流排序
约简
从流数据中获取答案
是一种终结操作
API P12
Optional类型
Optional<T> 包装器对象
,可以将null包装
API P13 14 16
收集结果
API P22 23
查看流的结果
stream.iterator()//产生旧风格的迭代器,终结操作
stream.foreach()
stream.foreachOrdered() //顺序处理 会部分或全部丧失并行处理的优势
将流收集至数据结构
API 27
toArray()//返回一个Object[]
Collectors.toList() \ toSet()
Collectors.toCollection(数据结构构造函数)
链接操作Collectors.joining("连接符")
Collectors.toMap() 收集到映射表,可处理相同键的值
Function.identity();//一个返回传参的lamda表达式
(t)->t;
群组和分区
#示例
Map<String,List<Locale>> countryToLocales = locales.collect(
Collectors.groupingBy(Locale::getCountry))
下游收集器
API P32
约简操作
处理流中所有元素(假如将所有元素相加)
基本类型流*
API P36 37 38 39
并行流
parallelStream()
parallel()
API P42
第二章 输入与输出
输入输出流
可以从其中读入/==写入==一个字节序列的对象称作输入流/==输出流==
读写字节
read()和write()在执行时都将阻塞,直至字节被读入或写出,这意味着如果流不能被访问当前线程将被阻塞,可以使用in.available()来检测在不阻塞情况下可获取的字节数
API 45 46 49
flush()
close()
流家族

组合输入输出流过滤器
输入流默认情况下不被缓存区缓存,可以这样组合
new DataInputStream(//二进制输入流
new BufferedInputStream(//缓存输入流(置入缓存区)
new FileInputStream("x.dat")))//文件输入流
API P51 52
写入文本
InputStreamReader
写出文本
写出器:PrintWriter
调用println时会自动冲刷
new PrintWriter(
new OutputStreamWriter(//FileOutputStream设置true为追加
new FileOutputStream("x.txt",true),StandardCharasets.UTF_8)
,true)//autoflush
读写二进制文件
DataInput和DataOutput接口
Write/Read
int
4
double
8
boolean
1
short
2
long
8
float
4
char
取决于编码方式
随机访问文件
RandomAccessFile
对象输入输出流与序列化
可序列化类必须实现Serializable接口 或者使用@Serializable注解
API 73 74
操作文件
Path
目录名序列,可加文件名
以根部件开始就是绝对路劲,否则就是相对路径
不必对应存在的文件
组合或解析路径
p.resolve(q);
//如果q是绝对路径,则结果就是q
//否则,根据文件系统的规则:p后面跟着q
p.resolveSibling("q")
//将产生p的兄弟路径的q
p.relative("q")
//产生相对路径
p.toAbsolutePath()
//产生绝对路径
Paths.get(String[] args)//解析连接起来的结果,可能会抛出异常
//列如
Path p = Paths.get("/hom","","");
读写文件
API P89
//读写轻量二进制文件
byte[] bytes = Files.readAllBytes(path);
Files.readString(path,Charset);//不设置默认为覆盖原文件
Files.write(path,Byte[],charset);
创建文件和目录
Files.creatDiretory(path);//在已有路劲创建目录
Files.creatDiretories(path);//递归创建目录
Files.creatFile(path);//创建文件
//创建临时文件不做讨论
复制移动和删除文件
Files.copy(fromPath,toPath);//路劲已存在将操作失败
//有多种重载方法可以控制copy
Files.move(fromPath,toPath);
//move()失败的原因,Path是文件的路径,而不单单是所在目录路劲
Files.delete(path);//文件不存在将会抛出异常,可以使用
Files.deleteIfExists(path);
获取文件信息
API P93
访问目录中的项
Stream<Path> entries = Files.list(path);//不会遍历子目录
Stream<Path> entries = Files.walk(path);//会便利所有目录,可提供参数控制深度
若想精细度控制遍历,可查看P95-P97
内存映射文件
将文件加载到内存中,涉及计算时有用,先把文件加载到内存再去计算
文件加锁机制
FileChannel channel = FileCannel.open(path);
FileLock lock = channel.lock();//阻塞直至获得锁
FileLock lock = channel.tryLock();//立即返回锁或者null
//锁后文件将被锁定直到通道关闭或者在锁上调用release方法
正则表达式
Pattern pattern = Pattern.compile(patternString);
Matcher matcher = pattern.matcher(input);//可以设置属性,如忽略大小写,忽略空白字符 P113
matcher.matches();//返回是否存在
matcher.find();//可以理解为游标,指向第一组,默认指向group(0);
//例子 获取网页中的token
Pattern pattern = Pattern.compile("token: '(.*)'");
Matcher matcher = pattern.matcher(html);
分割,替换匹配 P117
第三章 XML
XML文档的结构
<?xml version="1.0" encoding="utf-8" ?>//文档头,可选但建议使用
<!DOCTYPE config...>//文档类型定义DTD
<element attr="attr">
....
</element>
解析XML
java提供两种XML解析器
树形解析器 DOM ,将XML文档解析为树结构
流机制解析器 列如SAX(Simple API for XML),在读文档时生成响应的事件
//读取XML文档
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
DocumentBuilder builder = factory.newDocumentBuiler();
//分析文档
Document doc = builder.parse(file||url);
//获取根元素
Element root = doc.getDocumentElement();
//得到该元素的子元素(子元素包含空格字符)
NodeList children = root.getChildNodes();
//获取该子元素
Node child = children.item(i);
//获取前可以判断元素类型
if(child instanceof Element);//Text
//获取元素类型
NamedNodeMap attrs = element.getAllAttributes();

验证XML
**DTD **
API P139 P140
简单用法
<!DOCTYPE config[
<!ELEMENT SCHEDULE (MISSION+)>
....
]>
可以声明储存在外部
如果处理的是相对URL,详见P134 P135
<!DOCTYPE config System "config.dtd">
<!DOCTYPE config System "http://.....dtd">
XML Schema
使用XPath定位信息
简单例子: html中的某个元素
/html/body/form[1]//索引从1开始
//计算XPath表达式,首先需要一个XPathFactory
XpathFactory factory = XpathFactory.newInstance();
path = factory.newXPath();
//获取文本
String username = path.evaluate("/html/body/title/text()",doc);
详见P149 151
命名空间
流机制解析器
SAX解析器 (事件回调)
StAX
使用SAX解析器
解析时会生成报告事件不会以任何形式存储文档,实际上DOM解析器就是在SAX基础上构建的
//得到流机制解析器
SAXParseFactory factory = SAXParseFactory.newInstance();
SAXParser parser = factory.newSAXParser();
//处理文档
parser.parse(source,handler);
DefaultHandler为以下四个接口定义了空的方法,可以使用匿名子类覆盖方法
ContentHandler
DTDHandler
EntityHandler
ErrorHandler
var handler = new DefaultHandler()
{
//覆盖
};
详见P157 158
使用StAX解析器
可以只使用基本循环来迭代所有事件
第五章 JDBC
sql与java之间数据类型的对应
bit
BIT
boolean
char
CHAR
String
float
DOUBLE
double
imagevarbinary(max)
LONGVARBINARY
byte[]
varchar(max)text
LONGVARCHAR
String
nchar
CHARNCHAR (Java SE 6.0)
String
nvarchar
VARCHARNVARCHAR (Java SE 6.0)
String
nvarchar(max)ntext
LONGVARCHARLONGNVARCHAR (Java SE 6.0)
String
numeric
NUMERIC
java.math.BigDecimal
real
REAL
float
smallint
SMALLINT
short
varbinaryudt
VARBINARY
byte[]
varchar
VARCHAR
String
tinyint
TINYINT
short
uniqueidentifier
CHAR
String
xml
LONGVARCHARSQLXML (Java SE 6.0)
StringSQLXML
time
TIME (1)
java.sql.Time (1)
date
DATE
java.sql.Date
datetime2
TIMESTAMP
java.sql.Timestamp
datetimeoffset (2)
microsoft.sql.Types.DATETIMEOFFSET
microsoft.sql.DateTimeOffset
Last updated