# JavaCoreⅡ

\[TOC]

> 详细的总结一下这章用什么干了什么即可8

### 第一章 Java8的流库

**流遵行了做什么而非怎么做原则**

```java
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;**

#### 群组和分区

```java
#示例
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](https://raw.githubusercontent.com/EddeCode/my-pic/main/202211261209653.jpg)

**组合输入输出流过滤器**

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

```java
new DataInputStream(//二进制输入流
	new BufferedInputStream(//缓存输入流（置入缓存区）
    	new FileInputStream("x.dat")))//文件输入流
```

**API P51 52**

**写入文本**

* InputStreamReader

**写出文本**

> **写出器:PrintWriter**
>
> 调用println时会自动冲刷

```java
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**

* 目录名序列，可加文件名
* 以根部件开始就是绝对路劲，否则就是相对路径
* 不必对应存在的文件

**组合或解析路径**

```java
p.resolve(q);
//如果q是绝对路径，则结果就是q
//否则，根据文件系统的规则：p后面跟着q
```

```java
p.resolveSibling("q")
//将产生p的兄弟路径的q
```

```java
p.relative("q")
//产生相对路径
p.toAbsolutePath()
//产生绝对路径
```

```java
Paths.get(String[] args)//解析连接起来的结果，可能会抛出异常
//列如
Path p = Paths.get("/hom","","");
```

**读写文件**

**API P89**

```java
//读写轻量二进制文件
byte[] bytes = Files.readAllBytes(path);
Files.readString(path,Charset);//不设置默认为覆盖原文件
Files.write(path,Byte[],charset);
```

**创建文件和目录**

```java
Files.creatDiretory(path);//在已有路劲创建目录
Files.creatDiretories(path);//递归创建目录
Files.creatFile(path);//创建文件
//创建临时文件不做讨论
```

**复制移动和删除文件**

```java
Files.copy(fromPath,toPath);//路劲已存在将操作失败
//有多种重载方法可以控制copy
Files.move(fromPath,toPath);
//move()失败的原因，Path是文件的路径，而不单单是所在目录路劲
Files.delete(path);//文件不存在将会抛出异常，可以使用
Files.deleteIfExists(path);
```

**获取文件信息**

**API P93**

**访问目录中的项**

```java
Stream<Path> entries = Files.list(path);//不会遍历子目录
Stream<Path> entries = Files.walk(path);//会便利所有目录，可提供参数控制深度
```

**若想精细度控制遍历，可查看P95-P97**

#### 内存映射文件

将文件加载到内存中,涉及计算时有用，先把文件加载到内存再去计算

#### 文件加锁机制

```java
FileChannel channel = FileCannel.open(path);
FileLock lock = channel.lock();//阻塞直至获得锁
FileLock lock = channel.tryLock();//立即返回锁或者null
//锁后文件将被锁定直到通道关闭或者在锁上调用release方法
```

#### 正则表达式

```java
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），在读文档时生成响应的事件

```java
//读取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](https://raw.githubusercontent.com/EddeCode/my-pic/main/202211261209861.jpg)

**验证XML**

**\*\*DTD \*\***

**API P139 P140**

简单用法

```xml
<!DOCTYPE config[
<!ELEMENT SCHEDULE (MISSION+)>
....
]>
```

可以声明储存在外部

如果处理的是相对URL，详见**P134 P135**

```xml
<!DOCTYPE config System "config.dtd">
<!DOCTYPE config System "http://.....dtd">
```

**XML Schema**

**使用XPath定位信息**

简单例子： html中的某个元素

```xml
/html/body/form[1]//索引从1开始
```

```java
//计算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基础上构建的

```java
//得到流机制解析器
SAXParseFactory factory = SAXParseFactory.newInstance();
SAXParser parser = factory.newSAXParser();
//处理文档
parser.parse(source,handler);
```

DefaultHandler为以下四个接口定义了空的方法，可以使用匿名子类覆盖方法

* ContentHandler
* DTDHandler
* EntityHandler
* ErrorHandler

```java
var handler = new DefaultHandler()
{
    //覆盖
};
```

> 详见P157 158

**使用StAX解析器**

可以只使用基本循环来迭代所有事件

### 第五章 JDBC

#### sql与java之间数据类型的对应

| SQL Server 类型                                                                         | JDBC 类型 (java.sql.Types)              | Java 语言类型                                                                             |
| ------------------------------------------------------------------------------------- | ------------------------------------- | ------------------------------------------------------------------------------------- |
| bigint                                                                                | BIGINT                                | [long](https://so.csdn.net/so/search?q=long\&spm=1001.2101.3001.7020)                 |
| [timestamp](https://so.csdn.net/so/search?q=timestamp\&spm=1001.2101.3001.7020)binary | BINARY                                | [byte](https://so.csdn.net/so/search?q=byte\&spm=1001.2101.3001.7020)\[]              |
| bit                                                                                   | BIT                                   | boolean                                                                               |
| char                                                                                  | CHAR                                  | String                                                                                |
| decimalmoneysmallmoney                                                                | DECIMAL                               | [java](https://so.csdn.net/so/search?q=java\&spm=1001.2101.3001.7020).math.BigDecimal |
| float                                                                                 | DOUBLE                                | double                                                                                |
| [int](https://so.csdn.net/so/search?q=int\&spm=1001.2101.3001.7020)                   | 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](https://so.csdn.net/so/search?q=sql\&spm=1001.2101.3001.7020).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                                                          |
