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()

流家族

44582388_1

组合输入输出流过滤器

输入流默认情况下不被缓存区缓存,可以这样组合

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();
image-20220304202959329

验证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之间数据类型的对应

SQL Server 类型
JDBC 类型 (java.sql.Types)
Java 语言类型

bigint

BIGINT

timestampbinary

BINARY

bit

BIT

boolean

char

CHAR

String

decimalmoneysmallmoney

DECIMAL

java.math.BigDecimal

float

DOUBLE

double

INTEGER

int

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

datetimesmalldatetime

TIMESTAMP

java.sql.Timestamp

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