


[{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/categories/","section":"Categories","summary":"","title":"Categories","type":"categories"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/tags/elasticsearch/","section":"Tags","summary":"","title":"ElasticSearch","type":"tags"},{"content":" 数据格式 # Elasticsearch 是面向文档型的数据库，一条数据在这里就是一个文档。es里面的概念和关系型数据库中的概念比对如下，可以依此进行理解：\n索引操作 # 创建索引 # 对比关系型数据库，创建索引就等同于创建数据库。\n在Postman中，向ES服务器发送put请求：http://localhost:9200/shopping\n查询索引 # 查询索引用的是get请求：\n如果想查询当前ES所有的index（索引），怎么查呢？需要发送如下的get请求：\nhttp://localhost:9200/_cat/indices?v\n删除索引 # 发送DELETE请求：http://localhost:9200/shopping\n文档操作 # 创建文档 # 索引已经创建好了，接下来我们创建文档，并添加数据。这里的文档可以类比为关系型数据库中的表数据，添加的数据格式为JSON格式。\n在Postman中，向ES服务器发送POST请求：http://localhost:9200/shopping/_doc\n请求体内容为：\n{ \u0026#34;titile\u0026#34;: \u0026#34;小米手机\u0026#34;, \u0026#34;category\u0026#34;: \u0026#34;小米\u0026#34;, \u0026#34;images\u0026#34;: \u0026#34;http://www.gulixueyuan.com/xm.jpg\u0026#34;, \u0026#34;price\u0026#34;: 3999.00 } _doc就是表示文档，表示数据的意思，所以添加数据，就是用 _doc\n注意上面的post请求，返回数据中的 _id 是该条数据的id，是ES服务器随机生成的。\n如果我们想自定义生成数据的id，可以吗？答案是可以的，只需要在请求时携带我们自定义的ID即可：\nPOST http://localhost:9200/shopping/_doc/1001\n查询文档 # 上面是根据ID单个查询的数据，如果想查询出这个索引下所有的数据？\nGET http://localhost:9200/shopping/_search\n查询操作 # 条件查询 # 我们添加的数据中有一个分类（category）的属性，现在我们想查询分类是小米的数据：\nGET http://localhost:9200/shopping/_search?q=category:小米\n问号后面的q表示 query 的意思，后面跟键值对\n上面这种直接在请求的url后面跟参数，而且还是中文，有时候就会有问题，所以我们一般采用下面的方式：\nGET http://localhost:9200/shopping/_search\n查询所有的数据\n直接在请求体的参数中使用 match_all，查询所有的数据\n但是呀，这样有个问题，查询的数据量太大了。我们得分页查询啊\n分页查询 # 在请求参数中使用 from，size 参数\n只想获取目标数据中的指定字段 # 比如我们只想查看数据中的 category 字段\n排序 # 按照price字段，倒序输出\n多个组合条件查询 # 关键是请求体参数怎么写：\nAnd条件\nmust 表示多个条件之间的 and 并且关系\n{ \u0026#34;query\u0026#34;: { \u0026#34;bool\u0026#34;: { \u0026#34;must\u0026#34;: [ { \u0026#34;match\u0026#34;: { \u0026#34;category\u0026#34;: \u0026#34;小米\u0026#34; } }, { \u0026#34;match\u0026#34;: { \u0026#34;price\u0026#34;: 3999.00 } } ] } } } Or条件\nshould用来表示多个条件之间 or 的关系\n{ \u0026#34;query\u0026#34;: { \u0026#34;bool\u0026#34;: { \u0026#34;should\u0026#34;: [ { \u0026#34;match\u0026#34;: { \u0026#34;price\u0026#34;: \u0026#34;4999.00\u0026#34; } }, { \u0026#34;match\u0026#34;: { \u0026#34;price\u0026#34;: 3999.00 } } ] } } } 范围条件过滤\n比如想查询 price 大于 4000 的手机，这时候就得用 filter 了。\n{ \u0026#34;query\u0026#34;: { \u0026#34;bool\u0026#34;: { \u0026#34;should\u0026#34;: [ { \u0026#34;match\u0026#34;: { \u0026#34;price\u0026#34;: \u0026#34;4999.00\u0026#34; } }, { \u0026#34;match\u0026#34;: { \u0026#34;price\u0026#34;: 3999.00 } } ], \u0026#34;filter\u0026#34;: { \u0026#34;range\u0026#34;: { \u0026#34;price\u0026#34;: { \u0026#34;gt\u0026#34;: 4000 } } } } } } 精确匹配 # 使用 match_phrase，就不会被分词，只会精确匹配符合这个字符串的内容。\n高亮显示 # { \u0026#34;query\u0026#34;: { \u0026#34;match_phrase\u0026#34;: { \u0026#34;category\u0026#34;: \u0026#34;小米\u0026#34; } }, \u0026#34;highlight\u0026#34;: { \u0026#34;fields\u0026#34;: { \u0026#34;category\u0026#34;: {} } } } 以上就是设置 category 高亮显示。\n聚合查询 # aggs 表示的就是 聚合操作。\nterms 表示分组操作。\n分组\n{ \u0026#34;aggs\u0026#34;: { // 表示要进行聚合操作 \u0026#34;price_group\u0026#34;: {\t// 名称，随意起名 \u0026#34;terms\u0026#34;: { // 表示要进行分组操作 \u0026#34;field\u0026#34;: \u0026#34;price\u0026#34;\t// 分组字段 } } } } 平均值\n{ \u0026#34;aggs\u0026#34;: { // 表示要进行聚合操作 \u0026#34;price_avg\u0026#34;: {\t// 名称，随意起名 \u0026#34;avg\u0026#34;: { // 平均值 \u0026#34;field\u0026#34;: \u0026#34;price\u0026#34;\t// 分组字段 } } }, \u0026#34;size\u0026#34;: 0\t// 这个参数表示去掉原始数据，只显示聚合后的结果，上面的分组中也可以加入这个参数，也可不加 } 映射关系 # 接下来，我们先创建一个 user 的索引：\n执行 PUT请求 http://localhost:9200/user/\n然后，我们发起 PUT 请求时通过 _mapping 表示需要自定义 user 里面的字段映射关系，具体的映射关系需要在 请求体中给出：\n{ \u0026#34;properties\u0026#34;: { \u0026#34;name\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;text\u0026#34;, \u0026#34;index\u0026#34;: true\t// 这个index表示该字段可以被索引查询的 }, \u0026#34;sex\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;keyword\u0026#34;,\t// 这个keyword表示，该字段不能进行分词，必须完整匹配 \u0026#34;index\u0026#34;: true }, \u0026#34;tel\u0026#34;: { \u0026#34;type\u0026#34;: \u0026#34;keyword\u0026#34;, \u0026#34;index\u0026#34;: false\t// 表示它不能被索引 } } } 我们来添加三条数据：\nPUT\thttp://localhost:9200/user/_create/1001\nPUT\thttp://localhost:9200/user/_create/1002\nPUT\thttp://localhost:9200/user/_create/1003\n{ \u0026#34;name\u0026#34;: \u0026#34;小花\u0026#34;, \u0026#34;sex\u0026#34;: \u0026#34;女\u0026#34;, \u0026#34;tel\u0026#34;: \u0026#34;18298377557\u0026#34; } 接下来我们查询一下数据，发现当我们输入 名字是 \u0026lsquo;小\u0026rsquo; 时，是支持分词查询的，出现了两条数据：\n接下来我们试一下 sex字段，因为上面设置过 sex字段是 keyword 表示不支持分词，只能精确匹配，所以 sex字段必须是 完全精确匹配。\n但是当我们查询 tel 字段时，发现如下错误：\n原因就是因为 tel 设置了不支持索引。\nElasticSearch 配套的 JavaAPI demo 地址：\nes-java-api (github.com)\n","date":"2026-09-11","externalUrl":null,"permalink":"/posts/elasticsearch%E5%AD%A6%E4%B9%A0/","section":"文章","summary":"","title":"ElasticSearch学习","type":"posts"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/categories/it/","section":"Categories","summary":"","title":"IT","type":"categories"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/tags/","section":"Tags","summary":"","title":"Tags","type":"tags"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/categories/%E7%AC%94%E8%AE%B0/","section":"Categories","summary":"","title":"笔记","type":"categories"},{"content":"","date":"2026-09-11","externalUrl":null,"permalink":"/categories/%E6%95%99%E7%A8%8B/","section":"Categories","summary":"","title":"教程","type":"categories"},{"content":"这是用 Hugo + Pages CMS + GitHub Pages 发布的第一篇文章。\n如果本地预览和线上都能看到这段文字，说明搭建成功。\n","date":"2026-09-09","externalUrl":null,"permalink":"/posts/hello-hugo/","section":"文章","summary":"","title":"你好，Hugo","type":"posts"},{"content":"","date":"2026-09-09","externalUrl":null,"permalink":"/categories/%E7%94%9F%E6%B4%BB/","section":"Categories","summary":"","title":"生活","type":"categories"},{"content":"","date":"2026-09-09","externalUrl":null,"permalink":"/tags/%E5%BF%83%E6%83%85/","section":"Tags","summary":"","title":"心情","type":"tags"},{"content":"","date":"2026-09-09","externalUrl":null,"permalink":"/tags/cms/","section":"Tags","summary":"","title":"CMS","type":"tags"},{"content":"","date":"2026-09-09","externalUrl":null,"permalink":"/tags/github/","section":"Tags","summary":"","title":"GitHub","type":"tags"},{"content":"","date":"2026-09-09","externalUrl":null,"permalink":"/tags/github-pages/","section":"Tags","summary":"","title":"GitHub Pages","type":"tags"},{"content":"","date":"2026-09-09","externalUrl":null,"permalink":"/tags/hugo/","section":"Tags","summary":"","title":"Hugo","type":"tags"},{"content":"","date":"2026-09-09","externalUrl":null,"permalink":"/tags/pages-cms/","section":"Tags","summary":"","title":"Pages CMS","type":"tags"},{"content":"","date":"2026-09-09","externalUrl":null,"permalink":"/tags/wordpress/","section":"Tags","summary":"","title":"WordPress","type":"tags"},{"content":" 1. 前置准备 # 需要：\nGitHub 账号 本机 Git for Windows 本机 Hugo Extended（下文离线安装） 建议先装 Git，再装 Hugo。两者都用安装包 / zip，不走包管理器。\n1.1 离线安装 Git # 打开 https://git-scm.com/download/win 下载 64-bit Git for Windows Setup（.exe） 双击安装，选项保持默认 关键一项选 Git from the command line and also from 3rd-party software 装完后新开 PowerShell，执行： PowerShell\ngit --version 应输出类似 git version 2.x.x.windows.x。\n第一次使用 Git，再执行一次（只做一次）：\nPowerShell\ngit config --global user.name \u0026#34;你的名字\u0026#34; git config --global user.email \u0026#34;你的邮箱@example.com\u0026#34; 1.2 离线安装 Hugo Extended # 不要用：\nPowerShell\nwinget install Hugo.Hugo.Extended 按下面做。\n下载正确的压缩包 # 打开官方发布页：\nhttps://github.com/gohugoio/hugo/releases/latest\n当前版本以 v0.165.0 为例。滚到 Assets，只下载这一份：\n电脑类型 文件名 普通 64 位 Windows（绝大多数） hugo_extended_0.165.0_windows-amd64.zip ARM 电脑（Surface Pro X 等） hugo_extended_0.165.0_windows-arm64.zip 64 位直链：\nhttps://github.com/gohugoio/hugo/releases/download/v0.165.0/hugo_extended_0.165.0_windows-amd64.zip\n不要下载：\nhugo_0.165.0_windows-amd64.zip（没有 Extended，主题容易编不过） Source code (zip) / Source code (tar.gz)（源码，不是安装包） .deb / .tar.gz（Linux 包） 安装包大约 20MB。可以先下载再拷到离线电脑。\n解压到固定目录 # 建议放到不含空格、不会被清理的目录，不要留在「下载」里。\n在 C:\\ 下新建 C:\\Hugo\\bin 右键 zip → 全部提取 把解压出来的 hugo.exe 复制到 C:\\Hugo\\bin\\ 解压后通常有：\ntext\nhugo.exe ← 只要这一个 LICENSE README.md 最后应是：\ntext\nC:\\Hugo\\bin\\hugo.exe 把目录加入 PATH（图形界面） # 按 Win 键，搜索：编辑系统环境变量 点 环境变量 上面「用户变量」里选中 Path → 编辑 新建，填： text\nC:\\Hugo\\bin 一路确定保存 关掉所有已经打开的 PowerShell / CMD / Windows Terminal，再新开一个 验证 # 新开 PowerShell：\nPowerShell\nhugo version 成功时应类似：\ntext\nhugo v0.165.0+extended windows/amd64 ... 必须看到 +extended。如果提示「无法将 hugo 项识别为 cmdlet」：\nPATH 没加对，或旧终端没关 hugo.exe 不在 C:\\Hugo\\bin 下载了错的 zip 可再确认：\nPowerShell\nGet-Command hugo | Format-List Test-Path C:\\Hugo\\bin\\hugo.exe 以后升级 Hugo：再下一个新版本 zip，用新的 hugo.exe 覆盖 C:\\Hugo\\bin\\hugo.exe，不用改 PATH。本地版本尽量和后面 workflow 里的 HUGO_VERSION 一致。\n2. 创建 GitHub 仓库 # 打开 https://github.com/new 仓库名必须是：你的用户名.github.io\n例如用户名是 alice，仓库就叫 alice.github.io 选 Public 不要勾选 Add a README 点 Create repository 记下仓库地址，例如：\ntext\nhttps://github.com/alice/alice.github.io.git 用户站最终网址：\ntext\nhttps://alice.github.io 如果用项目站（仓库名任意），网址会变成 https://用户名.github.io/仓库名/，baseURL 也要带上仓库名。个人博客建议用用户站。\n3. 本地初始化 Hugo 站点 # 把下面的 alice 全部换成你的 GitHub 用户名。在 PowerShell 里执行：\nPowerShell\ncd $HOME git clone https://github.com/alice/alice.github.io.git cd alice.github.io # 目录已有 .git，必须加 --force hugo new site . --force --format toml 加上主题。这里用 PaperMod，以 git submodule 方式添加，这样 GitHub Actions 才能拉到主题：\nPowerShell\ngit submodule add --depth=1 https://github.com/adityatelange/hugo-PaperMod.git themes/PaperMod git submodule update --init --recursive 建图片目录、文章目录：\nPowerShell\nNew-Item -ItemType Directory -Force -Path static\\images, content\\posts 在仓库根目录新建 .gitignore：\ngitignore\n/public/ /resources/_gen/ .hugo_build.lock 不要把 public/ 提交进仓库。Hugo 每次构建都会重新生成它。\n4. 写 Hugo 配置 # 覆盖仓库根目录的 hugo.toml（把 alice、标题、作者改成你的）：\ntoml\nbaseURL = \u0026#39;https://alice.github.io/\u0026#39; languageCode = \u0026#39;zh-cn\u0026#39; defaultContentLanguage = \u0026#39;zh-cn\u0026#39; title = \u0026#39;我的博客\u0026#39; theme = \u0026#39;PaperMod\u0026#39; hasCJKLanguage = true enableRobotsTXT = true enableGitInfo = true pagination.pagerSize = 8 [caches.images] dir = \u0026#39;:cacheDir/images\u0026#39; [params] env = \u0026#39;production\u0026#39; description = \u0026#39;用 Hugo + Pages CMS 搭建的个人博客\u0026#39; author = \u0026#39;Alice\u0026#39; defaultTheme = \u0026#39;auto\u0026#39; ShowReadingTime = true ShowShareButtons = false ShowPostNavLinks = true ShowBreadCrumbs = true ShowCodeCopyButtons = true ShowRssButtonInSectionTermList = true ShowFullTextinRSS = false disableThemeToggle = false DateFormat = \u0026#39;2006-01-02\u0026#39; [params.homeInfoParams] Title = \u0026#39;你好，这里是 Alice\u0026#39; Content = \u0026#39;技术随笔 / 笔记 / 个人博客\u0026#39; [[params.socialIcons]] name = \u0026#39;github\u0026#39; url = \u0026#39;https://github.com/alice\u0026#39; [menu] [[menu.main]] identifier = \u0026#39;posts\u0026#39; name = \u0026#39;文章\u0026#39; url = \u0026#39;/posts/\u0026#39; weight = 10 [[menu.main]] identifier = \u0026#39;tags\u0026#39; name = \u0026#39;标签\u0026#39; url = \u0026#39;/tags/\u0026#39; weight = 20 [[menu.main]] identifier = \u0026#39;archives\u0026#39; name = \u0026#39;归档\u0026#39; url = \u0026#39;/archives/\u0026#39; weight = 30 [[menu.main]] identifier = \u0026#39;search\u0026#39; name = \u0026#39;搜索\u0026#39; url = \u0026#39;/search/\u0026#39; weight = 40 [outputs] home = [\u0026#39;HTML\u0026#39;, \u0026#39;RSS\u0026#39;, \u0026#39;JSON\u0026#39;] PaperMod 的搜索页和归档页需要两个特殊文件。\ncontent/search.md：\nMarkdown\n--- title: \u0026#34;搜索\u0026#34; layout: \u0026#34;search\u0026#34; summary: \u0026#34;search\u0026#34; placeholder: \u0026#34;输入关键词\u0026#34; --- content/archives.md：\nMarkdown\n--- title: \u0026#34;归档\u0026#34; layout: \u0026#34;archives\u0026#34; summary: \u0026#34;archives\u0026#34; --- 再写一篇测试文章 content/posts/hello-world.md：\nMarkdown\n--- title: \u0026#34;你好，世界\u0026#34; date: 2026-09-09T12:00:00+08:00 draft: false description: \u0026#34;这是第一篇文章，用来验证站点能编译、能发布。\u0026#34; tags: - 随笔 categories: - 博客 --- 这是用 **Hugo + Pages CMS + GitHub Pages** 发布的第一篇文章。 如果本地预览和线上都能看到这段文字，说明搭建成功。 本地先跑起来确认没问题：\nPowerShell\nhugo server -D 终端里会出现类似 http://localhost:1313/。浏览器打开，应能看到首页和《你好，世界》。能打开后再 Ctrl+C 停掉。\n5. 配置 GitHub Actions 自动部署 # 创建目录：\nPowerShell\nNew-Item -ItemType Directory -Force -Path .github\\workflows 新建 .github/workflows/hugo.yaml。时区用上海，Hugo 用 Extended，版本和本机保持一致：\nYAML\nname: Build and deploy on: push: branches: - main workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: pages cancel-in-progress: false defaults: run: shell: bash jobs: build: runs-on: ubuntu-latest env: DART_SASS_VERSION: 1.102.0 HUGO_VERSION: 0.165.0 TZ: Asia/Shanghai steps: - name: Checkout uses: actions/checkout@v4 with: submodules: recursive fetch-depth: 0 - name: Setup Pages id: pages uses: actions/configure-pages@v5 - name: Create a local tools directory run: mkdir -p \u0026#34;${HOME}/.local\u0026#34; - name: Install Dart Sass run: | curl -sfL --output-dir \u0026#34;${{ runner.temp }}\u0026#34; -O \u0026#34;https://github.com/sass/dart-sass/releases/download/${DART_SASS_VERSION}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz\u0026#34; tar -C \u0026#34;${HOME}/.local\u0026#34; -xf \u0026#34;${{ runner.temp }}/dart-sass-${DART_SASS_VERSION}-linux-x64.tar.gz\u0026#34; echo \u0026#34;${HOME}/.local/dart-sass\u0026#34; \u0026gt;\u0026gt; \u0026#34;$GITHUB_PATH\u0026#34; - name: Install Hugo run: | curl -sfL --output-dir \u0026#34;${{ runner.temp }}\u0026#34; -O \u0026#34;https://github.com/gohugoio/hugo/releases/download/v${HUGO_VERSION}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz\u0026#34; mkdir -p \u0026#34;${HOME}/.local/hugo\u0026#34; tar -C \u0026#34;${HOME}/.local/hugo\u0026#34; -xf \u0026#34;${{ runner.temp }}/hugo_extended_${HUGO_VERSION}_linux-amd64.tar.gz\u0026#34; echo \u0026#34;${HOME}/.local/hugo\u0026#34; \u0026gt;\u0026gt; \u0026#34;$GITHUB_PATH\u0026#34; - name: Log tool versions run: | hugo version command -v sass \u0026amp;\u0026amp; sass --version || true - name: Build run: | hugo \\ --gc \\ --minify \\ --baseURL \u0026#34;${{ steps.pages.outputs.base_url }}/\u0026#34; \\ --cacheDir \u0026#34;${{ runner.temp }}/.cache/hugo\u0026#34; - name: Upload artifact uses: actions/upload-pages-artifact@v3 with: path: ./public deploy: needs: build runs-on: ubuntu-latest environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v4 说明：\n这份 workflow 跑在 GitHub 的 Linux 机器上，和本机是不是 Windows 无关 本机 hugo.exe 只用于本地预览 也可以在仓库网页 Settings → Pages 里选 GitHub Actions，再套用官方 Hugo 模板；直接提交上面这份更稳，能保证 Extended、时区和子模块都开对 6. 配置 Pages CMS 可视化后台 # 在仓库根目录新建 .pages.yml（不是 .pages.config.yml）：\nYAML\nmedia: input: static/images output: /images rename: safe categories: [image] content: - name: posts label: 博客文章 type: collection path: content/posts format: yaml-frontmatter filename: template: \u0026#34;{year}-{month}-{day}-{title}.md\u0026#34; field: create view: fields: [title, date, draft] primary: title sort: [date, title] default: sort: date order: desc fields: - name: title label: 文章标题 type: string required: true - name: date label: 发布日期 type: date - name: draft label: 草稿 type: boolean - name: description label: 文章摘要 type: text - name: tags label: 标签 type: string list: true - name: categories label: 分类 type: string list: true - name: body label: 正文 type: rich-text 这样后台会：\n把新文章存成 content/posts/2026-09-09-文章标题.md 图片存到 static/images/，正文里引用 /images/xxx.jpg body 写在 YAML front matter 下面，正好是 Hugo 要的格式 Hugo 会把 static/ 原样拷到站点根目录，所以 static/images/foo.jpg 线上地址就是 /images/foo.jpg。不要用 assets/images，除非另外做 Hugo Pipes 处理。\n7. 第一次推上去，打开 GitHub Pages # PowerShell\ncd $HOME\\alice.github.io git add . git status git commit -m \u0026#34;Initialize Hugo site with Pages CMS\u0026#34; git branch -M main git push -u origin main 如果 git push 要登录：用浏览器弹出的 GitHub 登录，或在 GitHub → Settings → Developer settings → Personal access tokens 生成 token，密码处粘贴 token。\n然后在 GitHub 网页上：\n打开仓库 → Settings → Pages Build and deployment → Source 选 GitHub Actions（改完立刻生效，没有 Save 按钮） 打开仓库的 Actions 标签，等 “Build and deploy” 变成绿色 若第一次部署弹出 github-pages environment 等待审批，点 Review deployments → Deploy 大约 1–2 分钟后访问：\ntext\nhttps://alice.github.io 能看到首页和测试文章，这一步才算发布成功。\n常见失败：\nActions 报 submodule 拉不下来：确认主题是 git submodule add 加进去的，且 workflow 里有 submodules: recursive 页面 CSS 全无 / 链接 404：baseURL 或仓库名不是 用户名.github.io 构建失败缺 hugo：检查 HUGO_VERSION 是否写对、是否下载的 hugo_extended_\u0026hellip; 8. 用网页后台发文 # 前期配置完成后，日常可以不再碰命令行。\n打开 https://app.pagescms.org Sign in with GitHub 按提示 Install GitHub App，授权刚才那个仓库（只授权这一个即可） 回到 Pages CMS，点开该仓库 若提示没有配置文件，确认根目录已经有 .pages.yml 并已推到 main 日常发文：\n左侧选 博客文章 点 Add an entry 填标题、日期、摘要、标签 正文用可视化编辑器，或直接写 Markdown 图片拖进编辑器，会自动上传到 static/images/ 点保存 → Pages CMS 向仓库提交一次 commit → 自动触发 Actions → 约 1–2 分钟网站更新 草稿：把 草稿 打开保存。Hugo 默认不发布 draft: true 的文章，适合先写后发。\n9. 可选：自定义域名 # 在域名 DNS 加一条 CNAME：blog.example.com → alice.github.io 仓库 Settings → Pages → Custom domain 填 blog.example.com 勾选 Enforce HTTPS 把 hugo.toml 里的 baseURL 改成 https://blog.example.com/ 再 push 一次 10. 之后维护 # 要做的事 在哪做 写新文章、改旧文、传图 app.pagescms.org 改网站标题、菜单、主题参数 本地改 hugo.toml 后 git push，或把该文件也配进 .pages.yml 当单文件编辑 换主题 / 升级 Hugo 本地改 submodule，或改 workflow 里的 HUGO_VERSION，再 push 看发布是否成功 GitHub 仓库 Actions 升级主题：\nPowerShell\ncd $HOME\\alice.github.io\\themes\\PaperMod git pull cd ..\\.. git add themes/PaperMod git commit -m \u0026#34;Update PaperMod\u0026#34; git push 升级本机 Hugo：下载新的 hugo_extended_*_windows-amd64.zip，覆盖 C:\\Hugo\\bin\\hugo.exe，同时改 workflow 里的 HUGO_VERSION。\n最小验收清单 # hugo version 能跑，且带 +extended git \u0026ndash;version 能跑 hugo server -D 本地能看到测试文章 git push 后 Actions 全绿 https://你的用户名.github.io 能打开 Pages CMS 能登录、能看到「博客文章」 后台新建一篇、保存，1–2 分钟后线上出现 做完这 7 步，就可以当 WordPress 的免费替代来用：静态访问、自动部署、网页后台发文，个人博客长期零成本。\n附录：Windows 常见问题 # hugo version 没有 +extended\n下错包了。删掉 hugo.exe，改下 hugo_extended_\u0026hellip;_windows-amd64.zip。\n解压后有一堆 .md 没有 hugo.exe\n下的是 Source code，不是 Assets 里的二进制 zip。\nPowerShell 执行策略报错\nhugo.exe 是独立程序，一般不触发。若 git 脚本被拦：\nPowerShell\nSet-ExecutionPolicy -Scope CurrentUser RemoteSigned 杀毒软件拦截 hugo.exe\n放行即可，这是官方发布的单文件程序。\n旧终端里仍然找不到 hugo\n改 PATH 后必须新开 PowerShell，已经打开的窗口不会自动刷新环境变量。\n","date":"2026-09-09","externalUrl":null,"permalink":"/posts/%E7%94%A8-pages-cms-+-hugo-+-github-pages-%E6%90%AD%E4%B8%80%E5%A5%97%E5%85%8D%E8%B4%B9%E5%8F%AF%E8%A7%86%E5%8C%96%E5%8D%9A%E5%AE%A2/","section":"文章","summary":"","title":"用 Pages CMS + Hugo + GitHub Pages 搭一套免费可视化博客","type":"posts"},{"content":"","date":"2022-03-02","externalUrl":null,"permalink":"/tags/java/","section":"Tags","summary":"","title":"Java","type":"tags"},{"content":"先来看一段简单的同步锁代码\n@Controller public class DemoController { private final Logger logger = LoggerFactory.getLogger(DemoController.class); @RequestMapping(\u0026#34;/process/{orderId}\u0026#34;) @ResponseBody public Map\u0026lt;String, Object\u0026gt; process(@PathVariable(\u0026#34;orderId\u0026#34;) String orderId) throws Exception { synchronized (this) { logger.debug(\u0026#34;[{}] 开始\u0026#34;, orderId); Thread.sleep(1500); logger.debug(\u0026#34;[{}] 结束\u0026#34;, orderId); } Map\u0026lt;String, Object\u0026gt; map = new HashMap(); map.put(\u0026#34;result\u0026#34;, \u0026#34;success\u0026#34;); return map; } } 这段代码使用了 synchronized 同步锁（锁对象是this），但是出现了一个问题，对于同一个订单的id请求时，在多线程环境下就不应该再进入这段处理代码中， 比如orderId=001时已经进入了 synchronized 中开始执行了，此时又进来一个 orderId=001的请求，因为orderId一致，就不应该再进来。 但实际情况是：因为同步锁对象是 this，而两次请求的对象不同，自然不属于同一个对象，导致 synchronized 并不会起作用。\n修改上面的代码，使其同一个 orderId 不能再进入 同步锁中\n@Controller public class DemoController { private final Logger logger = LoggerFactory.getLogger(DemoController.class); @RequestMapping(\u0026#34;/process/{orderId}\u0026#34;) @ResponseBody public Map\u0026lt;String, Object\u0026gt; process(@PathVariable(\u0026#34;orderId\u0026#34;) String orderId) throws Exception { synchronized (orderId.intern()) { // 将 orderId 变成一个 字符串常量池 logger.debug(\u0026#34;[{}] 开始\u0026#34;, orderId); Thread.sleep(1500); logger.debug(\u0026#34;[{}] 结束\u0026#34;, orderId); } Map\u0026lt;String, Object\u0026gt; map = new HashMap(); map.put(\u0026#34;result\u0026#34;, \u0026#34;success\u0026#34;); return map; } } 上述代码，将同一个 orderId 的请求变成了字符串常量池，这样，多个请求时，虽然每次都是一个新的String对象，但是这里锁的却是字符串值，因此是相等的，所以可以起到作用。\n那么除了上面的字符串常量池方式，我们还可以自己维护一个缓存池对象，每次来一个orderId时从缓存池中获取对象。\n@Controller public class DemoController { private final Logger logger = LoggerFactory.getLogger(DemoController.class); Map\u0026lt;String, Object\u0026gt; mutexCache = new HashMap\u0026lt;\u0026gt;(); @RequestMapping(\u0026#34;/process/{orderId}\u0026#34;) @ResponseBody public Map\u0026lt;String, Object\u0026gt; process(@PathVariable(\u0026#34;orderId\u0026#34;) String orderId) throws Exception { Object mutex4Key = mutexCache.get(orderId); if(mutex4Key == null){ mutex4Key = new Object(); // 如果缓存中没有，则新建一个放进去 mutexCache.put(orderId, mutex4Key); } synchronized (mutex4Key) { // 将 orderId 变成一个 字符串常量池 logger.debug(\u0026#34;[{}] 开始\u0026#34;, orderId); Thread.sleep(1500); logger.debug(\u0026#34;[{}] 结束\u0026#34;, orderId); // 业务执行完，删除缓存 mutexCache.remove(orderId); } Map\u0026lt;String, Object\u0026gt; map = new HashMap(); map.put(\u0026#34;result\u0026#34;, \u0026#34;success\u0026#34;); return map; } } 上面写法会带来一个问题：当有大量的请求到来时，会出现前一个线程在判断 mutex4Key==null 后，然后开始new了，但还没有push进去，但此时后一个线程进来了， 它得到的判断是 mutex4Key==null，导致又开始new了。所以会有这种错误情况出现。那怎么解决呢？可以给if判断加一个同步锁：\n@Controller public class DemoController { private final Logger logger = LoggerFactory.getLogger(DemoController.class); Map\u0026lt;String, Object\u0026gt; mutexCache = new HashMap\u0026lt;\u0026gt;(); @RequestMapping(\u0026#34;/process/{orderId}\u0026#34;) @ResponseBody public Map\u0026lt;String, Object\u0026gt; process(@PathVariable(\u0026#34;orderId\u0026#34;) String orderId) throws Exception { Object mute4Key = null; synchronized (this){ mute4Key = mutexCache.get(orderId); if (mute4Key == null){ mute4Key = new Object(); mutexCache.put(orderId, mute4Key); } } synchronized (mute4Key) { // 锁对象是 缓存中对应的 value logger.debug(\u0026#34;[{}] 开始\u0026#34;, orderId); Thread.sleep(1500); logger.debug(\u0026#34;[{}] 结束\u0026#34;, orderId); // 业务执行完，删除缓存 mutexCache.remove(orderId); } Map\u0026lt;String, Object\u0026gt; map = new HashMap(); map.put(\u0026#34;result\u0026#34;, \u0026#34;success\u0026#34;); return map; } } 上面代码写的有点繁琐了，其实我们在构建缓存时可以使用 ConcurrentHashMap，ConcurrentHashMap本身就是线程安全的map的实现\n// 缓存锁 Map\u0026lt;String, Object\u0026gt; mutexCache = new ConcurrentHashMap\u0026lt;\u0026gt;(); // ConcurrentHashMap 线程安全的 @RequestMapping(\u0026#34;/process/{orderId}\u0026#34;) @ResponseBody public Map\u0026lt;String, Object\u0026gt; process(@PathVariable(\u0026#34;orderId\u0026#34;) String orderId) throws Exception { Object mute4Key = mutexCache.computeIfAbsent(orderId, k -\u0026gt; new Object()); synchronized (mute4Key) { // 锁对象是 缓存中对应的 value logger.debug(\u0026#34;[{}] 开始\u0026#34;, orderId); Thread.sleep(1500); logger.debug(\u0026#34;[{}] 结束\u0026#34;, orderId); // 业务执行完，删除缓存 mutexCache.remove(orderId); } Map\u0026lt;String, Object\u0026gt; map = new HashMap(); map.put(\u0026#34;result\u0026#34;, \u0026#34;success\u0026#34;); return map; } 相关代码参考: https://github.com/hello-github-ui/java_base/blob/master/lock/src/main/java/com/example/lock/LockApplication.java\n","date":"2022-03-02","externalUrl":null,"permalink":"/posts/java%E5%B0%81%E8%A3%85%E5%90%8C%E6%AD%A5%E9%94%81/","section":"文章","summary":"","title":"Java封装同步锁","type":"posts"},{"content":"","date":"2022-01-27","externalUrl":null,"permalink":"/tags/git/","section":"Tags","summary":"","title":"Git","type":"tags"},{"content":"在 Git 专题的开篇，我就提醒大家一定要记住这几个专用名词，对掌握 Git 有很大的帮助： Workspace：工作区 Index / Stage：暂存区 Repository：仓库区（或本地仓库） Remote：远程仓库 当然了，没记住的话，也不要紧了，今天就趁机再温故一遍。\n下面是阮一峰老师整理的常用 Git 命令清单，有必要的话，可以打印一份出来，放在工作台~\nhttp://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html\n一、新建代码库\n在当前目录新建一个Git代码库 # $ git init\n新建一个目录，将其初始化为Git代码库 # $ git init [project-name]\n下载一个项目和它的整个代码历史 # $ git clone [url] 二、配置 Git的配置文件为.gitconfig，它可以在用户主目录下（全局配置），也可以在项目目录下（项目配置）。\n显示当前的Git配置 # $ git config \u0026ndash;list\n编辑Git配置文件 # $ git config -e [\u0026ndash;global]\n设置提交代码时的用户信息 # $ git config [\u0026ndash;global] user.name \u0026ldquo;[name]\u0026rdquo; $ git config [\u0026ndash;global] user.email \u0026ldquo;[email address]\u0026rdquo; 三、增加/删除文件\n添加指定文件到暂存区 # $ git add [file1] [file2] \u0026hellip;\n添加指定目录到暂存区，包括子目录 # $ git add [dir]\n添加当前目录的所有文件到暂存区 # $ git add .\n添加每个变化前，都会要求确认 # 对于同一个文件的多处变化，可以实现分次提交 # $ git add -p\n删除工作区文件，并且将这次删除放入暂存区 # $ git rm [file1] [file2] \u0026hellip;\n停止追踪指定文件，但该文件会保留在工作区 # $ git rm \u0026ndash;cached [file]\n改名文件，并且将这个改名放入暂存区 # $ git mv [file-original] [file-renamed] 四、代码提交\n提交暂存区到仓库区 # $ git commit -m [message]\n提交暂存区的指定文件到仓库区 # $ git commit [file1] [file2] \u0026hellip; -m [message]\n提交工作区自上次commit之后的变化，直接到仓库区 # $ git commit -a\n提交时显示所有diff信息 # $ git commit -v\n使用一次新的commit，替代上一次提交 # 如果代码没有任何新变化，则用来改写上一次commit的提交信息 # $ git commit \u0026ndash;amend -m [message]\n重做上一次commit，并包括指定文件的新变化 # $ git commit \u0026ndash;amend [file1] [file2] \u0026hellip; 五、分支\n列出所有本地分支 # $ git branch\n列出所有远程分支 # $ git branch -r\n列出所有本地分支和远程分支 # $ git branch -a\n新建一个分支，但依然停留在当前分支 # $ git branch [branch-name]\n新建一个分支，并切换到该分支 # $ git checkout -b [branch]\n新建一个分支，指向指定commit # $ git branch [branch] [commit]\n新建一个分支，与指定的远程分支建立追踪关系 # $ git branch \u0026ndash;track [branch] [remote-branch]\n切换到指定分支，并更新工作区 # $ git checkout [branch-name]\n切换到上一个分支 # $ git checkout -\n建立追踪关系，在现有分支与指定的远程分支之间 # $ git branch \u0026ndash;set-upstream [branch] [remote-branch]\n合并指定分支到当前分支 # $ git merge [branch]\n选择一个commit，合并进当前分支 # $ git cherry-pick [commit]\n删除分支 # $ git branch -d [branch-name]\n删除远程分支 # $ git push origin \u0026ndash;delete [branch-name] $ git branch -dr [remote/branch] 六、标签\n列出所有tag # $ git tag\n新建一个tag在当前commit # $ git tag [tag]\n新建一个tag在指定commit # $ git tag [tag] [commit]\n删除本地tag # $ git tag -d [tag]\n删除远程tag # $ git push origin :refs/tags/[tagName]\n查看tag信息 # $ git show [tag]\n提交指定tag # $ git push [remote] [tag]\n提交所有tag # $ git push [remote] \u0026ndash;tags\n新建一个分支，指向某个tag # $ git checkout -b [branch] [tag] 七、查看信息\n显示有变更的文件 # $ git status\n显示当前分支的版本历史 # $ git log\n显示commit历史，以及每次commit发生变更的文件 # $ git log \u0026ndash;stat\n搜索提交历史，根据关键词 # $ git log -S [keyword]\n显示某个commit之后的所有变动，每个commit占据一行 # $ git log [tag] HEAD \u0026ndash;pretty=format:%s\n显示某个commit之后的所有变动，其\u0026quot;提交说明\u0026quot;必须符合搜索条件 # $ git log [tag] HEAD \u0026ndash;grep feature\n显示某个文件的版本历史，包括文件改名 # $ git log \u0026ndash;follow [file] $ git whatchanged [file]\n显示指定文件相关的每一次diff # $ git log -p [file]\n显示过去5次提交 # $ git log -5 \u0026ndash;pretty \u0026ndash;oneline\n显示所有提交过的用户，按提交次数排序 # $ git shortlog -sn\n显示指定文件是什么人在什么时间修改过 # $ git blame [file]\n显示暂存区和工作区的差异 # $ git diff\n显示暂存区和上一个commit的差异 # $ git diff \u0026ndash;cached [file]\n显示工作区与当前分支最新commit之间的差异 # $ git diff HEAD\n显示两次提交之间的差异 # $ git diff [first-branch]\u0026hellip;[second-branch]\n显示今天你写了多少行代码 # $ git diff \u0026ndash;shortstat \u0026ldquo;@{0 day ago}\u0026rdquo;\n显示某次提交的元数据和内容变化 # $ git show [commit]\n显示某次提交发生变化的文件 # $ git show \u0026ndash;name-only [commit]\n显示某次提交时，某个文件的内容 # $ git show [commit]:[filename]\n显示当前分支的最近几次提交 # $ git reflog 八、远程同步\n下载远程仓库的所有变动 # $ git fetch [remote]\n显示所有远程仓库 # $ git remote -v\n显示某个远程仓库的信息 # $ git remote show [remote]\n增加一个新的远程仓库，并命名 # $ git remote add [shortname] [url]\n取回远程仓库的变化，并与本地分支合并 # $ git pull [remote] [branch]\n上传本地指定分支到远程仓库 # $ git push [remote] [branch]\n强行推送当前分支到远程仓库，即使有冲突 # $ git push [remote] \u0026ndash;force\n推送所有分支到远程仓库 # $ git push [remote] \u0026ndash;all 九、撤销\n恢复暂存区的指定文件到工作区 # $ git checkout [file]\n恢复某个commit的指定文件到暂存区和工作区 # $ git checkout [commit] [file]\n恢复暂存区的所有文件到工作区 # $ git checkout .\n重置暂存区的指定文件，与上一次commit保持一致，但工作区不变 # $ git reset [file]\n重置暂存区与工作区，与上一次commit保持一致 # $ git reset \u0026ndash;hard\n重置当前分支的指针为指定commit，同时重置暂存区，但工作区不变 # $ git reset [commit]\n重置当前分支的HEAD为指定commit，同时重置暂存区和工作区，与指定commit一致 # $ git reset \u0026ndash;hard [commit]\n重置当前HEAD为指定commit，但保持暂存区和工作区不变 # $ git reset \u0026ndash;keep [commit]\n新建一个commit，用来撤销指定commit # 后者的所有变化都将被前者抵消，并且应用到当前分支 # $ git revert [commit]\n暂时将未提交的变化移除，稍后再移入 # $ git stash $ git stash pop 十、其他\n生成一个可供发布的压缩包 # $ git archive\n","date":"2022-01-27","externalUrl":null,"permalink":"/posts/git%E8%BF%9B%E9%98%B6%E5%AE%9D%E5%85%B8/","section":"文章","summary":"","title":"Git进阶宝典","type":"posts"},{"content":"","date":"2022-01-27","externalUrl":null,"permalink":"/categories/%E5%B7%A5%E5%85%B7/","section":"Categories","summary":"","title":"工具","type":"categories"},{"content":"","date":"2022-01-10","externalUrl":null,"permalink":"/tags/centos/","section":"Tags","summary":"","title":"Centos","type":"tags"},{"content":" 1. 下载 # 从官网下载redis压缩包到本地\n2. 解压 # tar -zxvf redis-6.0.6.tar.gz\n3. 升级 gcc # 自 redis 6.0.0 之后，编译 redis 需要支持 C11 特性，C11 特性在 4.9 中被引入。 Centos7 默认 gcc 版本为 4.8.5，所以需要升级gcc版本。\n解决方式：\nyum -y install gcc gcc-c++ make tcl yum -y install centos-release-scl yum -y install devtoolset-9-gcc devtoolset-9-gcc-c++ devtoolset-9-binutils scl enable devtoolset-9 bash 4. 编译 # 通过make来编译，make是自动编译，会根据Makefile中描述的内容来进行编译。\ncd redis-6.0.6 make 可以看到在src目录下生成了几个新的文件。\n5. 安装 # make install 实际上，就是将这个几个文件加到/usr/local/bin目录下去。这个目录在Path下面的话，就可以直接执行这几个命令了。\n可以看到，这几个文件就已经被加载到bin目录下了\n6. 测试 # redis-server redis-cli 7. 设置redis服务器后台启动 # 前面在启动redis服务器后，都是在前台启动的，需要重新启动一个客户端来进行登陆操作。这样非常不方便， 所以，我们需要设置后台启动，修改 redis.conf文件。 daemonize no 修改为： daemonize yes\n8. 卸载redis # 卸载redis服务，只需把/usr/local/bin/目录下的redis删除即可\nrm -rf /usr/local/bin/redis* 甚至可以把解压包也删除掉\nrm -rf /root/redis-stable 同时可以参考我的另一篇redis 主从配置文章。\n","date":"2022-01-10","externalUrl":null,"permalink":"/posts/centos7%E5%AE%89%E8%A3%85redis/","section":"文章","summary":"","title":"Centos7安装Redis","type":"posts"},{"content":"","date":"2022-01-10","externalUrl":null,"permalink":"/tags/linux/","section":"Tags","summary":"","title":"Linux","type":"tags"},{"content":"","date":"2022-01-10","externalUrl":null,"permalink":"/tags/redis/","section":"Tags","summary":"","title":"Redis","type":"tags"},{"content":"https://pic.imgdb.cn/item/61ab5b682ab3f51d9166eeb3.jpg\nMySQL8 的安装 # 我们在下载一个软件之前首先要做的一件事是什么呢？对喽，先看一下电脑上有没有已安装该软件了，若有则彻底卸载它。来，就让我们来体验一下这个流程吧。\n检测是否已安装MySQL # dpkg --list | grep mysql 通过上面的命令查看，有什么就使用命令卸载掉什么\n卸载MySQL # 这里以上一步查看出来的 mysql-client-core-8.0 为例来卸载掉它：\n# 卸载命令下面两条都可以 sudo apt-get autoremove --purge mysql-client-core-8.0 sudo apt-get remove mysql-common 最后清除残留数据 # dpkg -l |grep ^rc|awk \u0026#39;{print $2}\u0026#39; |sudo xargs dpkg -P 更新软件库 # sudo apt update 安装MySQL服务端 # sudo apt install mysql-server 注意，该命令会默认下载当前软件源里面的最新版。\n安装依赖 # 依赖里面就包含了MySQL客户端了。\nsudo apt install libmysqlclient-dev 检查安装是否成功 # 查看mysql是否安装成功，及mysql服务\nsudo netstat -tap | grep mysql 如果出现“无此命令”，输入命令 sudo apt install netstat\n设置root密码 # 切换root用户 # sudo su\n进入mysql # 在上一步切换为 root 用户之后，直接输入命令：\nmysql # 直接输入mysql即可进入连接上mysql服务端了，当然你也可以通过 mysql -u root -p 进入，注意：不需要输入密码，直接 回车 即可。 修改root密码并配置数据库root权限 # use mysql; ALTER USER \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED WITH mysql_native_password BY \u0026#39;123456\u0026#39;; flush privileges; # 设置生效 之后退出 .\nmysql服务管理 # sudo service mysql status # 查看服务状态 sudo service mysql start # 启动服务 sudo service mysql stop # 停止服务 sudo service mysql restart # 重启服务 sudo cat /etc/mysql/debian.cnf # 查看密码 # mysql 的安装目录，在这个目录下你便可以看到my.cnf配置文件 /ect/mysql/ ","date":"2021-12-04","externalUrl":null,"permalink":"/posts/linux-mint20-%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C/","section":"文章","summary":"","title":"Linux Mint20 使用体验","type":"posts"},{"content":"","date":"2021-11-16","externalUrl":null,"permalink":"/tags/bigdata/","section":"Tags","summary":"","title":"BigData","type":"tags"},{"content":" windows # 下载 # 要想运行flink，前提必须安装 JDK1.8x 官网下载地址：https://flink.apache.org/zh/downloads.html。或者百度云下载：链接 提取码: jw3e\n解压 # 直接解压下载下来的文件（以网盘下载的为例），然后重命名为 flink 即可。\n启动 # 直接进入 ${flink-home}/bin 目录，双击 start-cluster.bat 即启动了。\n访问 # 在浏览器中输入：http://localhost:8081/ 即可访问。\n命令查看运行状态 # 因为Flink依赖于Java环境，所以可以通过查看 JVM 的进程，来查看所有使用 Java 环境的进程： 输入 jps 即可。\nlinux # 参考文章：https://www.cnblogs.com/aibabel/p/10937110.html\n部署任务 # 方式一，dashboard 上传jar包 # 8081界面，上传jar包后，点击该任务后，输入相关的运行参数配置，如果看到任务直接失败了，那八成原因是当前任务所需的可用 task Slots 不够，那怎么办呢？很简单，修改配置文件。进入 flink_home 目录，编辑文件 vim conf/flink-conf.yaml，将 taskmanager.numberOfTaskSlots 的值设置大一点，比如4，然后再重新上传jar包，启动任务即可。\n问题：那么 taskmanager.numberOfTaskSlots 设置该遵循什么原则呢？或者说怎么设置比较好呢？\n方式二，通过手动输入命令启动任务 # ./bin/flink run -c com.example.wc.WordCountDataStream -p 3 /opt/apps/project/flink/flink-quickstart-1.0-SNAPSHOT.jar --host 192.168.80.100 --port 7777 -c：表示运行哪一个类；-p：表示并行度（parallelism）；一定要手动指明jar包的位置。\n查看所有提交的Job # ./bin/flink list -a\n取消某个Job # ./bin/flink cancel 7c0c4254b1e25f0473ce4a9199287744\nFlink部署 # Standalone模式 # Yarn模式 # 以yarn模式部署Flink任务时，要求Flink是有Hadoop支持的版本，Hadoop环境需要保证版本在2.2以上，并且集群中安装有HDFS服务。\nKubernetes部署 # 运行demo # flink提供两种任务运行入口：\nflink.bat 脚本启动任务程序 页面上传任务程序包运行 通过脚本启动任务 # flink.bat run ../example/batch/WordCount.jar 通过页面上传任务包运行 # 上传任务程序包\n运行任务程序包\n任务管理监控\nJobManager # ​\t①JobManager控制一个应用程序执行的主进程，每个应用程序都会被一个不同的JobManager所控制执行， ​\t②JobManager会先接收到要执行的应用程序，这个应用程序会包括：作业图（JobGraphy），逻辑数据流图，和打包了所有的类库和其它资源的JAR包。 ​\t③JobManager会把JobGraphy转换成一个物理层面的数据流图，这个图被叫做 执行图，包含了所有可以并发执行的任务。 ​\t④JobManager会向 resourceManager 申请执行任务所必要的资源，即 taskManager 上的 slot（插槽）。一旦它获取到了足够的资源，就会将执行图分发到真正运行他们的 TaskManager上。（也就是说真正执行任务的是谁？是taskManager）。而在运行过程中，JobManager会负责所有需要中央协调资源的操作，比如说检查点（checkPoint）的协调。\nTaskManager # Flink中的工作进程。通常在Flink中会有多个TaskManager运行，每一个TaskManager都包含了一定数量的插槽（slots）。插槽的数量限制了TaskManager能够执行的任务数量。 启动之后，TaskManager会向资源管理器注册它的插槽，收到资源管理器的指令后，TaskManager就会将一个或者多个插槽提供给JobManager调用。JobManager就可以向插槽分配任务（tasks）来执行了。 在执行过程中，一个TaskManager可以跟其它运行同一应用程序的TaskManager交换数据。 任务提交流程 # 思考 # 怎样实现并行计算？设置并行任务，分配到slot上执行，不同的任务，不同的slot执行，多线程执行。 并行的任务，需要占用多少slot？跟当前所有任务中最大任务的并行度相关。 一个流处理程序，到底包含多少个任务？ 并行度（Parallelism） # 一个特定算子的子任务（subtask）的个数被称之为其并行度（parallelism）。 一般情况下，一个Stream的并行度，可以认为就是其所有算子中最大的并行度。 FLink 读取、写入 MySQL 数据 # 下面这个示例实现的功能：\n生成随机的用户数据（姓名，昵称，密码，邮箱等字段），并保存到 user.txt 文本中 采用Flink，读取该txt文本文件作为数据输入流，处理映射，将数据保存到 MySQL 数据表中 通过Flink，从 MySQL 中再读取该表，将数据打印输出在控制台。 其中，会用到几个工具类，我都放到下面了。\n主任务 FLink2Mysql # package com.example.tool; import org.apache.flink.api.common.functions.MapFunction; import org.apache.flink.api.common.typeinfo.BasicTypeInfo; import org.apache.flink.api.common.typeinfo.TypeInformation; import org.apache.flink.api.java.DataSet; import org.apache.flink.api.java.ExecutionEnvironment; import org.apache.flink.api.java.io.jdbc.JDBCInputFormat; import org.apache.flink.api.java.io.jdbc.JDBCOutputFormat; import org.apache.flink.api.java.tuple.Tuple7; import org.apache.flink.api.java.tuple.Tuple8; import org.apache.flink.api.java.typeutils.RowTypeInfo; import org.apache.flink.types.Row; import org.junit.Test; import java.io.File; import java.io.FileOutputStream; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; /** * @author 030 * @date 10:22 2021/11/20 * @description */ public class Flink2Mysql { /*基本属性*/ private final static String username = \u0026#34;root\u0026#34;; private final static String password = \u0026#34;123456\u0026#34;; private final static String driverName = \u0026#34;com.mysql.cj.jdbc.Driver\u0026#34;; private final static String dbURL = \u0026#34;jdbc:mysql://192.168.80.100:3306/flink-test\u0026#34;; // 文件 private final static String filePath = \u0026#34;E:\\\\github-project\\\\flink-quickstart\\\\src\\\\main\\\\resources\\\\user.txt\u0026#34;; @Test public void test() throws Exception { // 1. 写入随机数据到 txt 中 saveToTxt(); // 2. 将 txt 数据写入到 MySQL 中 writeToDB(); // 从 MySQL 中读取 user 数据 readDBToFlink(); } /** * 从 MySQL 中读取 user 数据到 Flink 中 */ private static void readDBToFlink() throws Exception { // 创建执行环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); // 预定义数据库字段 TypeInformation[] fieldTypes = new TypeInformation[]{ BasicTypeInfo.LONG_TYPE_INFO, // 主键id是bigint，对应的Java数据类型是Long BasicTypeInfo.STRING_TYPE_INFO, // username BasicTypeInfo.STRING_TYPE_INFO, // nickname BasicTypeInfo.STRING_TYPE_INFO, // password BasicTypeInfo.INT_TYPE_INFO, // status BasicTypeInfo.STRING_TYPE_INFO, // email BasicTypeInfo.STRING_TYPE_INFO, // userface BasicTypeInfo.STRING_TYPE_INFO // regTime }; // 构造 RowTypeInfo RowTypeInfo rowTypeInfo = new RowTypeInfo(fieldTypes); // 从table创建一个输入数据流 DataSet\u0026lt;Row\u0026gt; readTable = env.createInput( JDBCInputFormat .buildJDBCInputFormat() .setDrivername(driverName) .setDBUrl(dbURL) .setUsername(username) .setPassword(password) .setQuery(\u0026#34;select * from user\u0026#34;) .setRowTypeInfo(rowTypeInfo) .finish() ); // 读取时提供的自定义实现MapFunction DataSet\u0026lt;Tuple8\u0026lt;Long, String, String, String, Integer, String, String, String\u0026gt;\u0026gt; dataSet = readTable.map(new MyMapFunctionReadImpl()); // 输出 System.out.println(\u0026#34;\\033[32;4m\u0026#34; + \u0026#34;===================================从MySQL中读取数据 start=======================================\u0026#34; + \u0026#34;\\033[0m\u0026#34;); dataSet.print(); System.out.println(\u0026#34;\\033[32;4m\u0026#34; + \u0026#34;=====================================从MySQL中读取数据 end==========================================\u0026#34; + \u0026#34;\\033[0m\u0026#34;); } /** * 从文件中读取数据并写入数据到 MySQL 中 */ private static void writeToDB() throws Exception { // 创建执行环境 ExecutionEnvironment env = ExecutionEnvironment.getExecutionEnvironment(); /* * 这里有一个巨坑：当使用 readCsvFile()读取文件时，csv文件中的数据默认使用逗号作为分隔符，并且分隔符之后不可以有空格 * 由上可知，不管你的 1.txt 文件中使用什么作为分隔符都无所谓，但在分隔符之后必须不能有空格 * */ DataSet\u0026lt;Row\u0026gt; write = env .readCsvFile(filePath) .fieldDelimiter(\u0026#34;,\u0026#34;) .types(String.class, String.class, String.class, Integer.class, String.class, String.class, String.class) // 打散txt数据流之后有7个属性 .map(new MyMapFunctionWriteImpl()); // 写入时提供的自定义实现MapFunction // 写入 db write.output( JDBCOutputFormat .buildJDBCOutputFormat() .setDrivername(driverName) .setDBUrl(dbURL) .setUsername(username) .setPassword(password) .setQuery(\u0026#34;insert into user(username, nickname, password, status, email, userface, regTime) values (?, ?, ?, ?, ?, ?, ?)\u0026#34;) .finish() ); System.out.println(\u0026#34;\\033[32;4m\u0026#34; + \u0026#34;------------------------------------------从txt文本写入数据到MySQL中 start---------------------------\u0026#34; + \u0026#34;\\033[0m\u0026#34;); // 执行 env.execute(); System.out.println(\u0026#34;\\033[32;4m\u0026#34; + \u0026#34;---------------------------------------------从txt文本写入数据到MySQL中 end------------------------------\u0026#34; + \u0026#34;\\033[0m\u0026#34;); } /** * 随机生成汉字，输出到文件 1.txt 中 */ private static void saveToTxt() throws Exception { // 默认生成 3 位吧 String username, nickname, password, email, userface, regTime, status; FileOutputStream fis = new FileOutputStream(new File(filePath)); // 就写 50 行吧 for (int i = 0; i \u0026lt; 50; i++) { // username 3位名字 username = RandomUserDataUtil.getChineseName() + \u0026#34;,\u0026#34;; // nickname 5位汉字 nickname = ChineseTool.getRandomChinese(5) + \u0026#34;,\u0026#34;; // password 密码长度设置 12 位 password = PWDTool.getRandomPwd(12) + \u0026#34;,\u0026#34;; // status status = \u0026#34;1\u0026#34; + \u0026#34;,\u0026#34;; // email email = RandomUserDataUtil.getEmail(9, 12) + \u0026#34;,\u0026#34;; // userface 以随机图片为例 userface = RandomUserDataUtil.getImg() + \u0026#34;,\u0026#34;; // regTime SimpleDateFormat sdf = new SimpleDateFormat(\u0026#34;yyyy年MM月dd日\u0026#34;); regTime = sdf.format(new Date()); // 写入数据到 txt文件，注意写入顺序必须和SQL中的字段顺序一致，id 是自增长的，不需要生成 // id username nickname password status email userface regTime fis.write(username.getBytes()); fis.write(nickname.getBytes()); fis.write(password.getBytes()); fis.write(status.getBytes()); fis.write(email.getBytes()); fis.write(userface.getBytes()); fis.write(regTime.getBytes()); // 写完一行后，写入换行符 参考: https://blog.51cto.com/u_11585002/2713634 // String newLine = System.getProperty(\u0026#34;line.separator\u0026#34;); // fis.write(newLine.getBytes()); fis.write(\u0026#34;\\r\\n\u0026#34;.getBytes()); } fis.close(); } /** * 自定义实现 MapFunction 的业务逻辑 * 注意，函数式接口的用法，第一个参数是输入类型，第二个参数是输出类型，即返回类型值 */ private static class MyMapFunctionWriteImpl implements MapFunction\u0026lt;Tuple7\u0026lt;String, String, String, Integer, String, String, String\u0026gt;, Row\u0026gt; { // 输入 Tuple2\u0026lt;String, Integer\u0026gt;， 输出 Row // 由于我们这里的 UserData 总共有8个字段，但是id字段是自增长的，因此在写入MySQL时只需要7元组 // int id, String username, nickname, password, email, userface, regTime, int status; // 对应的7元组分别是：必须和sql创建时的字段顺序一致 // String, String, String, String, Integer, String, String @Override public Row map(Tuple7\u0026lt;String, String, String, Integer, String, String, String\u0026gt; value) { Row row = new Row(7); row.setField(0, value.f0.getBytes(StandardCharsets.UTF_8)); row.setField(1, value.f1.getBytes(StandardCharsets.UTF_8)); row.setField(2, value.f2.getBytes(StandardCharsets.UTF_8)); row.setField(3, value.f3.byteValue()); row.setField(4, value.f4.getBytes(StandardCharsets.UTF_8)); row.setField(5, value.f5.getBytes(StandardCharsets.UTF_8)); row.setField(6, value.f6.getBytes(StandardCharsets.UTF_8)); return row; } } /** * 自定义实现 MapFunction 的业务逻辑 */ private static class MyMapFunctionReadImpl implements MapFunction\u0026lt;Row, Tuple8\u0026lt;Long, String, String, String, Integer, String, String, String\u0026gt;\u0026gt; { // 在从MySQL中读取数据时，User 表里面总共是8个字段，这时就是一个8元组，需要将主键id字段加上 // 对应的8元组分别是：注意这个对应顺序关系必须和数据库一样（即第一个什么数据类型，第二个什么类型等） // Long, String, String, String, Integer, String, String db和java数据对应类型参看 Alibaba Java开发手册 @Override public Tuple8\u0026lt;Long, String, String, String, Integer, String, String, String\u0026gt; map(Row row) { Long id = Long.valueOf(row.getField(0).toString()); // id String username = row.getField(1).toString(); // username String nickname = row.getField(2).toString(); // nickname String password = row.getField(3).toString(); // password Integer status = Integer.valueOf(row.getField(4).toString()); // status String email = row.getField(5).toString(); // email String userface = row.getField(6).toString(); // userface String regTime = row.getField(7).toString(); // regTime // 封装读取的返回结果 return new Tuple8\u0026lt;\u0026gt;(id, username, nickname, password, status, email, userface, regTime); } } } 需要注意的点，都在代码中有标注。\n随机密码工具类 # package com.example.tool; import org.junit.Test; import java.security.SecureRandom; import java.util.ArrayList; import java.util.Collections; import java.util.List; /** * @author 030 * @date 10:56 2021/11/20 * @description */ public class PWDTool { // 不允许创建实例对象 private PWDTool() { } /** * 生成随机密码工具类 * 密码要求： * 必须要包含大写字符、小写字符、数字、特殊符号，密码长度在 8-20 位。 */ private static final String lowStr = \u0026#34;abcdefghijklmnopqrstuvwxyz\u0026#34;; private static final String specialStr = \u0026#34;~!@#$%^\u0026amp;*()_+/-=[]{};:\u0026#39;\u0026lt;\u0026gt;?.\u0026#34;; private static final String numStr = \u0026#34;0123456789\u0026#34;; // 指定长度，随机生成复杂密码 /** * 提供对外的接口：生成指定长度的复杂密码 * * @param pwdLength * @return */ public static String getRandomPwd(int pwdLength) { if (pwdLength \u0026gt; 20 || pwdLength \u0026lt; 8) { System.out.println(\u0026#34;密码长度不满足要求\u0026#34;); return \u0026#34;\u0026#34;; } // 先满足必须条件：大写字符，小写字符，数字，特殊符号各一个 List\u0026lt;Character\u0026gt; list = new ArrayList\u0026lt;\u0026gt;(pwdLength); list.add(getLowChar()); list.add(getUpperChar()); list.add(getNumChar()); list.add(getSpecialChar()); // 从4-密码位数，随机生成 for (int i = 4; i \u0026lt; pwdLength; i++) { SecureRandom random = new SecureRandom(); // 产生0-4之间的随机int值（包含0，不包含4） int funNum = random.nextInt(4); list.add(getRandomChar(funNum)); } // 打乱字符排列顺序 Collections.shuffle(list); // 将 List 转为 String 字符串输出 StringBuilder stringBuilder = new StringBuilder(list.size()); for (Character c : list) { stringBuilder.append(c); } return stringBuilder.toString(); } // 随机获取字符串字符 private static char getRandomChar(String str) { SecureRandom random = new SecureRandom(); return str.charAt(random.nextInt(str.length())); } // 随机获取小写字符 private static char getLowChar() { return getRandomChar(lowStr); } // 随机获取大写字符 private static char getUpperChar() { return Character.toUpperCase(getLowChar()); } // 随机获取数字字符 private static char getNumChar() { return getRandomChar(numStr); } // 随机获取特殊字符 private static char getSpecialChar() { return getRandomChar(specialStr); } //指定调用字符函数 private static char getRandomChar(int funNum) { switch (funNum) { case 0: return getLowChar(); case 1: return getUpperChar(); case 2: return getNumChar(); default: return getSpecialChar(); } } // 测试 @Test public void pwdTest() { for (int i = 0; i \u0026lt; 10; i++) { System.out.println(getRandomPwd(10)); } } } 生成随机用户数据工具类 # package com.example.tool; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; import org.junit.Test; import java.text.SimpleDateFormat; import java.util.*; /** * 参考：代码先锋网: https://www.codeleading.com/article/38615255660/ * @author 030 * @date 11:14 2021/11/20 * @description 随机中文姓, 名 */ public class RandomUserDataUtil { //百家姓 private final static String[] firstNames = { \u0026#34;赵\u0026#34;, \u0026#34;钱\u0026#34;, \u0026#34;孙\u0026#34;, \u0026#34;李\u0026#34;, \u0026#34;周\u0026#34;, \u0026#34;吴\u0026#34;, \u0026#34;郑\u0026#34;, \u0026#34;王\u0026#34;, \u0026#34;冯\u0026#34;, \u0026#34;陈\u0026#34;, \u0026#34;褚\u0026#34;, \u0026#34;卫\u0026#34;, \u0026#34;蒋\u0026#34;, \u0026#34;沈\u0026#34;, \u0026#34;韩\u0026#34;, \u0026#34;杨\u0026#34;, \u0026#34;朱\u0026#34;, \u0026#34;秦\u0026#34;, \u0026#34;尤\u0026#34;, \u0026#34;许\u0026#34;, \u0026#34;何\u0026#34;, \u0026#34;吕\u0026#34;, \u0026#34;施\u0026#34;, \u0026#34;张\u0026#34;, \u0026#34;孔\u0026#34;, \u0026#34;曹\u0026#34;, \u0026#34;严\u0026#34;, \u0026#34;华\u0026#34;, \u0026#34;金\u0026#34;, \u0026#34;魏\u0026#34;, \u0026#34;陶\u0026#34;, \u0026#34;姜\u0026#34;, \u0026#34;戚\u0026#34;, \u0026#34;谢\u0026#34;, \u0026#34;邹\u0026#34;, \u0026#34;喻\u0026#34;, \u0026#34;柏\u0026#34;, \u0026#34;水\u0026#34;, \u0026#34;窦\u0026#34;, \u0026#34;章\u0026#34;, \u0026#34;云\u0026#34;, \u0026#34;苏\u0026#34;, \u0026#34;潘\u0026#34;, \u0026#34;葛\u0026#34;, \u0026#34;奚\u0026#34;, \u0026#34;范\u0026#34;, \u0026#34;彭\u0026#34;, \u0026#34;郎\u0026#34;, \u0026#34;鲁\u0026#34;, \u0026#34;韦\u0026#34;, \u0026#34;昌\u0026#34;, \u0026#34;马\u0026#34;, \u0026#34;苗\u0026#34;, \u0026#34;凤\u0026#34;, \u0026#34;花\u0026#34;, \u0026#34;方\u0026#34;, \u0026#34;俞\u0026#34;, \u0026#34;任\u0026#34;, \u0026#34;袁\u0026#34;, \u0026#34;柳\u0026#34;, \u0026#34;酆\u0026#34;, \u0026#34;鲍\u0026#34;, \u0026#34;史\u0026#34;, \u0026#34;唐\u0026#34;, \u0026#34;费\u0026#34;, \u0026#34;廉\u0026#34;, \u0026#34;岑\u0026#34;, \u0026#34;薛\u0026#34;, \u0026#34;雷\u0026#34;, \u0026#34;贺\u0026#34;, \u0026#34;倪\u0026#34;, \u0026#34;汤\u0026#34;, \u0026#34;滕\u0026#34;, \u0026#34;殷\u0026#34;, \u0026#34;罗\u0026#34;, \u0026#34;毕\u0026#34;, \u0026#34;郝\u0026#34;, \u0026#34;邬\u0026#34;, \u0026#34;安\u0026#34;, \u0026#34;常\u0026#34;, \u0026#34;乐\u0026#34;, \u0026#34;于\u0026#34;, \u0026#34;时\u0026#34;, \u0026#34;傅\u0026#34;, \u0026#34;皮\u0026#34;, \u0026#34;卞\u0026#34;, \u0026#34;齐\u0026#34;, \u0026#34;康\u0026#34;, \u0026#34;伍\u0026#34;, \u0026#34;余\u0026#34;, \u0026#34;元\u0026#34;, \u0026#34;卜\u0026#34;, \u0026#34;顾\u0026#34;, \u0026#34;孟\u0026#34;, \u0026#34;平\u0026#34;, \u0026#34;黄\u0026#34;, \u0026#34;和\u0026#34;, \u0026#34;穆\u0026#34;, \u0026#34;萧\u0026#34;, \u0026#34;尹\u0026#34;, \u0026#34;姚\u0026#34;, \u0026#34;邵\u0026#34;, \u0026#34;湛\u0026#34;, \u0026#34;汪\u0026#34;, \u0026#34;祁\u0026#34;, \u0026#34;毛\u0026#34;, \u0026#34;禹\u0026#34;, \u0026#34;狄\u0026#34;, \u0026#34;米\u0026#34;, \u0026#34;贝\u0026#34;, \u0026#34;明\u0026#34;, \u0026#34;臧\u0026#34;, \u0026#34;计\u0026#34;, \u0026#34;伏\u0026#34;, \u0026#34;成\u0026#34;, \u0026#34;戴\u0026#34;, \u0026#34;谈\u0026#34;, \u0026#34;宋\u0026#34;, \u0026#34;茅\u0026#34;, \u0026#34;庞\u0026#34;, \u0026#34;熊\u0026#34;, \u0026#34;纪\u0026#34;, \u0026#34;舒\u0026#34;, \u0026#34;屈\u0026#34;, \u0026#34;项\u0026#34;, \u0026#34;祝\u0026#34;, \u0026#34;董\u0026#34;, \u0026#34;梁\u0026#34;, \u0026#34;杜\u0026#34;, \u0026#34;阮\u0026#34;, \u0026#34;蓝\u0026#34;, \u0026#34;闵\u0026#34;, \u0026#34;席\u0026#34;, \u0026#34;季\u0026#34;, \u0026#34;麻\u0026#34;, \u0026#34;强\u0026#34;, \u0026#34;贾\u0026#34;, \u0026#34;路\u0026#34;, \u0026#34;娄\u0026#34;, \u0026#34;危\u0026#34;, \u0026#34;江\u0026#34;, \u0026#34;童\u0026#34;, \u0026#34;颜\u0026#34;, \u0026#34;郭\u0026#34;, \u0026#34;梅\u0026#34;, \u0026#34;盛\u0026#34;, \u0026#34;林\u0026#34;, \u0026#34;刁\u0026#34;, \u0026#34;钟\u0026#34;, \u0026#34;徐\u0026#34;, \u0026#34;邱\u0026#34;, \u0026#34;骆\u0026#34;, \u0026#34;高\u0026#34;, \u0026#34;夏\u0026#34;, \u0026#34;蔡\u0026#34;, \u0026#34;田\u0026#34;, \u0026#34;樊\u0026#34;, \u0026#34;胡\u0026#34;, \u0026#34;凌\u0026#34;, \u0026#34;霍\u0026#34;, \u0026#34;虞\u0026#34;, \u0026#34;万\u0026#34;, \u0026#34;支\u0026#34;, \u0026#34;柯\u0026#34;, \u0026#34;昝\u0026#34;, \u0026#34;管\u0026#34;, \u0026#34;卢\u0026#34;, \u0026#34;莫\u0026#34;, \u0026#34;经\u0026#34;, \u0026#34;房\u0026#34;, \u0026#34;裘\u0026#34;, \u0026#34;缪\u0026#34;, \u0026#34;干\u0026#34;, \u0026#34;解\u0026#34;, \u0026#34;应\u0026#34;, \u0026#34;宗\u0026#34;, \u0026#34;丁\u0026#34;, \u0026#34;宣\u0026#34;, \u0026#34;贲\u0026#34;, \u0026#34;邓\u0026#34;, \u0026#34;郁\u0026#34;, \u0026#34;单\u0026#34;, \u0026#34;杭\u0026#34;, \u0026#34;洪\u0026#34;, \u0026#34;包\u0026#34;, \u0026#34;诸\u0026#34;, \u0026#34;左\u0026#34;, \u0026#34;石\u0026#34;, \u0026#34;崔\u0026#34;, \u0026#34;吉\u0026#34;, \u0026#34;钮\u0026#34;, \u0026#34;龚\u0026#34;, \u0026#34;程\u0026#34;, \u0026#34;嵇\u0026#34;, \u0026#34;邢\u0026#34;, \u0026#34;滑\u0026#34;, \u0026#34;裴\u0026#34;, \u0026#34;陆\u0026#34;, \u0026#34;荣\u0026#34;, \u0026#34;翁\u0026#34;, \u0026#34;荀\u0026#34;, \u0026#34;羊\u0026#34;, \u0026#34;于\u0026#34;, \u0026#34;惠\u0026#34;, \u0026#34;甄\u0026#34;, \u0026#34;曲\u0026#34;, \u0026#34;家\u0026#34;, \u0026#34;封\u0026#34;, \u0026#34;芮\u0026#34;, \u0026#34;羿\u0026#34;, \u0026#34;储\u0026#34;, \u0026#34;靳\u0026#34;, \u0026#34;汲\u0026#34;, \u0026#34;邴\u0026#34;, \u0026#34;糜\u0026#34;, \u0026#34;松\u0026#34;, \u0026#34;井\u0026#34;, \u0026#34;段\u0026#34;, \u0026#34;富\u0026#34;, \u0026#34;巫\u0026#34;, \u0026#34;乌\u0026#34;, \u0026#34;焦\u0026#34;, \u0026#34;巴\u0026#34;, \u0026#34;弓\u0026#34;, \u0026#34;牧\u0026#34;, \u0026#34;隗\u0026#34;, \u0026#34;山\u0026#34;, \u0026#34;谷\u0026#34;, \u0026#34;车\u0026#34;, \u0026#34;侯\u0026#34;, \u0026#34;宓\u0026#34;, \u0026#34;蓬\u0026#34;, \u0026#34;全\u0026#34;, \u0026#34;郗\u0026#34;, \u0026#34;班\u0026#34;, \u0026#34;仰\u0026#34;, \u0026#34;秋\u0026#34;, \u0026#34;仲\u0026#34;, \u0026#34;伊\u0026#34;, \u0026#34;宫\u0026#34;, \u0026#34;宁\u0026#34;, \u0026#34;仇\u0026#34;, \u0026#34;栾\u0026#34;, \u0026#34;暴\u0026#34;, \u0026#34;甘\u0026#34;, \u0026#34;钭\u0026#34;, \u0026#34;厉\u0026#34;, \u0026#34;戎\u0026#34;, \u0026#34;祖\u0026#34;, \u0026#34;武\u0026#34;, \u0026#34;符\u0026#34;, \u0026#34;刘\u0026#34;, \u0026#34;景\u0026#34;, \u0026#34;詹\u0026#34;, \u0026#34;束\u0026#34;, \u0026#34;龙\u0026#34;, \u0026#34;叶\u0026#34;, \u0026#34;幸\u0026#34;, \u0026#34;司\u0026#34;, \u0026#34;韶\u0026#34;, \u0026#34;郜\u0026#34;, \u0026#34;黎\u0026#34;, \u0026#34;蓟\u0026#34;, \u0026#34;溥\u0026#34;, \u0026#34;印\u0026#34;, \u0026#34;宿\u0026#34;, \u0026#34;白\u0026#34;, \u0026#34;怀\u0026#34;, \u0026#34;蒲\u0026#34;, \u0026#34;邰\u0026#34;, \u0026#34;从\u0026#34;, \u0026#34;鄂\u0026#34;, \u0026#34;索\u0026#34;, \u0026#34;咸\u0026#34;, \u0026#34;籍\u0026#34;, \u0026#34;赖\u0026#34;, \u0026#34;卓\u0026#34;, \u0026#34;蔺\u0026#34;, \u0026#34;屠\u0026#34;, \u0026#34;蒙\u0026#34;, \u0026#34;池\u0026#34;, \u0026#34;乔\u0026#34;, \u0026#34;阴\u0026#34;, \u0026#34;郁\u0026#34;, \u0026#34;胥\u0026#34;, \u0026#34;能\u0026#34;, \u0026#34;苍\u0026#34;, \u0026#34;双\u0026#34;, \u0026#34;闻\u0026#34;, \u0026#34;莘\u0026#34;, \u0026#34;党\u0026#34;, \u0026#34;翟\u0026#34;, \u0026#34;谭\u0026#34;, \u0026#34;贡\u0026#34;, \u0026#34;劳\u0026#34;, \u0026#34;逄\u0026#34;, \u0026#34;姬\u0026#34;, \u0026#34;申\u0026#34;, \u0026#34;扶\u0026#34;, \u0026#34;堵\u0026#34;, \u0026#34;冉\u0026#34;, \u0026#34;宰\u0026#34;, \u0026#34;郦\u0026#34;, \u0026#34;雍\u0026#34;, \u0026#34;却\u0026#34;, \u0026#34;璩\u0026#34;, \u0026#34;桑\u0026#34;, \u0026#34;桂\u0026#34;, \u0026#34;濮\u0026#34;, \u0026#34;牛\u0026#34;, \u0026#34;寿\u0026#34;, \u0026#34;通\u0026#34;, \u0026#34;边\u0026#34;, \u0026#34;扈\u0026#34;, \u0026#34;燕\u0026#34;, \u0026#34;冀\u0026#34;, \u0026#34;浦\u0026#34;, \u0026#34;尚\u0026#34;, \u0026#34;农\u0026#34;, \u0026#34;温\u0026#34;, \u0026#34;别\u0026#34;, \u0026#34;庄\u0026#34;, \u0026#34;晏\u0026#34;, \u0026#34;柴\u0026#34;, \u0026#34;瞿\u0026#34;, \u0026#34;阎\u0026#34;, \u0026#34;充\u0026#34;, \u0026#34;慕\u0026#34;, \u0026#34;连\u0026#34;, \u0026#34;茹\u0026#34;, \u0026#34;习\u0026#34;, \u0026#34;宦\u0026#34;, \u0026#34;艾\u0026#34;, \u0026#34;鱼\u0026#34;, \u0026#34;容\u0026#34;, \u0026#34;向\u0026#34;, \u0026#34;古\u0026#34;, \u0026#34;易\u0026#34;, \u0026#34;慎\u0026#34;, \u0026#34;戈\u0026#34;, \u0026#34;廖\u0026#34;, \u0026#34;庾\u0026#34;, \u0026#34;终\u0026#34;, \u0026#34;暨\u0026#34;, \u0026#34;居\u0026#34;, \u0026#34;衡\u0026#34;, \u0026#34;步\u0026#34;, \u0026#34;都\u0026#34;, \u0026#34;耿\u0026#34;, \u0026#34;满\u0026#34;, \u0026#34;弘\u0026#34;, \u0026#34;匡\u0026#34;, \u0026#34;国\u0026#34;, \u0026#34;文\u0026#34;, \u0026#34;寇\u0026#34;, \u0026#34;广\u0026#34;, \u0026#34;禄\u0026#34;, \u0026#34;阙\u0026#34;, \u0026#34;东\u0026#34;, \u0026#34;欧\u0026#34;, \u0026#34;殳\u0026#34;, \u0026#34;沃\u0026#34;, \u0026#34;利\u0026#34;, \u0026#34;蔚\u0026#34;, \u0026#34;越\u0026#34;, \u0026#34;夔\u0026#34;, \u0026#34;隆\u0026#34;, \u0026#34;师\u0026#34;, \u0026#34;巩\u0026#34;, \u0026#34;厍\u0026#34;, \u0026#34;聂\u0026#34;, \u0026#34;晁\u0026#34;, \u0026#34;勾\u0026#34;, \u0026#34;敖\u0026#34;, \u0026#34;融\u0026#34;, \u0026#34;冷\u0026#34;, \u0026#34;訾\u0026#34;, \u0026#34;辛\u0026#34;, \u0026#34;阚\u0026#34;, \u0026#34;那\u0026#34;, \u0026#34;简\u0026#34;, \u0026#34;饶\u0026#34;, \u0026#34;空\u0026#34;, \u0026#34;曾\u0026#34;, \u0026#34;毋\u0026#34;, \u0026#34;沙\u0026#34;, \u0026#34;乜\u0026#34;, \u0026#34;养\u0026#34;, \u0026#34;鞠\u0026#34;, \u0026#34;须\u0026#34;, \u0026#34;丰\u0026#34;, \u0026#34;巢\u0026#34;, \u0026#34;关\u0026#34;, \u0026#34;蒯\u0026#34;, \u0026#34;相\u0026#34;, \u0026#34;查\u0026#34;, \u0026#34;后\u0026#34;, \u0026#34;荆\u0026#34;, \u0026#34;红\u0026#34;, \u0026#34;游\u0026#34;, \u0026#34;郏\u0026#34;, \u0026#34;竺\u0026#34;, \u0026#34;权\u0026#34;, \u0026#34;逯\u0026#34;, \u0026#34;盖\u0026#34;, \u0026#34;益\u0026#34;, \u0026#34;桓\u0026#34;, \u0026#34;公\u0026#34;, \u0026#34;仉\u0026#34;, \u0026#34;督\u0026#34;, \u0026#34;岳\u0026#34;, \u0026#34;帅\u0026#34;, \u0026#34;缑\u0026#34;, \u0026#34;亢\u0026#34;, \u0026#34;况\u0026#34;, \u0026#34;郈\u0026#34;, \u0026#34;有\u0026#34;, \u0026#34;琴\u0026#34;, \u0026#34;归\u0026#34;, \u0026#34;海\u0026#34;, \u0026#34;晋\u0026#34;, \u0026#34;楚\u0026#34;, \u0026#34;闫\u0026#34;, \u0026#34;法\u0026#34;, \u0026#34;汝\u0026#34;, \u0026#34;鄢\u0026#34;, \u0026#34;涂\u0026#34;, \u0026#34;钦\u0026#34;, \u0026#34;商\u0026#34;, \u0026#34;牟\u0026#34;, \u0026#34;佘\u0026#34;, \u0026#34;佴\u0026#34;, \u0026#34;伯\u0026#34;, \u0026#34;赏\u0026#34;, \u0026#34;墨\u0026#34;, \u0026#34;哈\u0026#34;, \u0026#34;谯\u0026#34;, \u0026#34;篁\u0026#34;, \u0026#34;年\u0026#34;, \u0026#34;爱\u0026#34;, \u0026#34;阳\u0026#34;, \u0026#34;佟\u0026#34;, \u0026#34;言\u0026#34;, \u0026#34;福\u0026#34;, \u0026#34;南\u0026#34;, \u0026#34;火\u0026#34;, \u0026#34;铁\u0026#34;, \u0026#34;迟\u0026#34;, \u0026#34;漆\u0026#34;, \u0026#34;官\u0026#34;, \u0026#34;冼\u0026#34;, \u0026#34;真\u0026#34;, \u0026#34;展\u0026#34;, \u0026#34;繁\u0026#34;, \u0026#34;檀\u0026#34;, \u0026#34;祭\u0026#34;, \u0026#34;密\u0026#34;, \u0026#34;敬\u0026#34;, \u0026#34;揭\u0026#34;, \u0026#34;舜\u0026#34;, \u0026#34;楼\u0026#34;, \u0026#34;疏\u0026#34;, \u0026#34;冒\u0026#34;, \u0026#34;浑\u0026#34;, \u0026#34;挚\u0026#34;, \u0026#34;胶\u0026#34;, \u0026#34;随\u0026#34;, \u0026#34;高\u0026#34;, \u0026#34;皋\u0026#34;, \u0026#34;原\u0026#34;, \u0026#34;种\u0026#34;, \u0026#34;练\u0026#34;, \u0026#34;弥\u0026#34;, \u0026#34;仓\u0026#34;, \u0026#34;眭\u0026#34;, \u0026#34;蹇\u0026#34;, \u0026#34;覃\u0026#34;, \u0026#34;阿\u0026#34;, \u0026#34;门\u0026#34;, \u0026#34;恽\u0026#34;, \u0026#34;来\u0026#34;, \u0026#34;綦\u0026#34;, \u0026#34;召\u0026#34;, \u0026#34;仪\u0026#34;, \u0026#34;风\u0026#34;, \u0026#34;介\u0026#34;, \u0026#34;巨\u0026#34;, \u0026#34;木\u0026#34;, \u0026#34;京\u0026#34;, \u0026#34;狐\u0026#34;, \u0026#34;郇\u0026#34;, \u0026#34;虎\u0026#34;, \u0026#34;枚\u0026#34;, \u0026#34;抗\u0026#34;, \u0026#34;达\u0026#34;, \u0026#34;杞\u0026#34;, \u0026#34;苌\u0026#34;, \u0026#34;折\u0026#34;, \u0026#34;麦\u0026#34;, \u0026#34;庆\u0026#34;, \u0026#34;过\u0026#34;, \u0026#34;竹\u0026#34;, \u0026#34;端\u0026#34;, \u0026#34;鲜\u0026#34;, \u0026#34;皇\u0026#34;, \u0026#34;亓\u0026#34;, \u0026#34;老\u0026#34;, \u0026#34;是\u0026#34;, \u0026#34;秘\u0026#34;, \u0026#34;畅\u0026#34;, \u0026#34;邝\u0026#34;, \u0026#34;还\u0026#34;, \u0026#34;宾\u0026#34;, \u0026#34;闾\u0026#34;, \u0026#34;辜\u0026#34;, \u0026#34;纵\u0026#34;, \u0026#34;侴\u0026#34;, \u0026#34;万俟\u0026#34;, \u0026#34;司马\u0026#34;, \u0026#34;上官\u0026#34;, \u0026#34;欧阳\u0026#34;, \u0026#34;夏侯\u0026#34;, \u0026#34;诸葛\u0026#34;, \u0026#34;闻人\u0026#34;, \u0026#34;东方\u0026#34;, \u0026#34;赫连\u0026#34;, \u0026#34;皇甫\u0026#34;, \u0026#34;羊舌\u0026#34;, \u0026#34;尉迟\u0026#34;, \u0026#34;公羊\u0026#34;, \u0026#34;澹台\u0026#34;, \u0026#34;公冶\u0026#34;, \u0026#34;宗正\u0026#34;, \u0026#34;濮阳\u0026#34;, \u0026#34;淳于\u0026#34;, \u0026#34;单于\u0026#34;, \u0026#34;太叔\u0026#34;, \u0026#34;申屠\u0026#34;, \u0026#34;公孙\u0026#34;, \u0026#34;仲孙\u0026#34;, \u0026#34;轩辕\u0026#34;, \u0026#34;令狐\u0026#34;, \u0026#34;钟离\u0026#34;, \u0026#34;宇文\u0026#34;, \u0026#34;长孙\u0026#34;, \u0026#34;慕容\u0026#34;, \u0026#34;鲜于\u0026#34;, \u0026#34;闾丘\u0026#34;, \u0026#34;司徒\u0026#34;, \u0026#34;司空\u0026#34;, \u0026#34;兀官\u0026#34;, \u0026#34;司寇\u0026#34;, \u0026#34;南门\u0026#34;, \u0026#34;呼延\u0026#34;, \u0026#34;子车\u0026#34;, \u0026#34;颛孙\u0026#34;, \u0026#34;端木\u0026#34;, \u0026#34;巫马\u0026#34;, \u0026#34;公西\u0026#34;, \u0026#34;漆雕\u0026#34;, \u0026#34;车正\u0026#34;, \u0026#34;壤驷\u0026#34;, \u0026#34;公良\u0026#34;, \u0026#34;拓跋\u0026#34;, \u0026#34;夹谷\u0026#34;, \u0026#34;宰父\u0026#34;, \u0026#34;谷梁\u0026#34;, \u0026#34;段干\u0026#34;, \u0026#34;百里\u0026#34;, \u0026#34;东郭\u0026#34;, \u0026#34;微生\u0026#34;, \u0026#34;梁丘\u0026#34;, \u0026#34;左丘\u0026#34;, \u0026#34;东门\u0026#34;, \u0026#34;西门\u0026#34;, \u0026#34;南宫\u0026#34;, \u0026#34;第五\u0026#34;, \u0026#34;公仪\u0026#34;, \u0026#34;公乘\u0026#34;, \u0026#34;太史\u0026#34;, \u0026#34;仲长\u0026#34;, \u0026#34;叔孙\u0026#34;, \u0026#34;屈突\u0026#34;, \u0026#34;尔朱\u0026#34;, \u0026#34;东乡\u0026#34;, \u0026#34;相里\u0026#34;, \u0026#34;胡母\u0026#34;, \u0026#34;司城\u0026#34;, \u0026#34;张廖\u0026#34;, \u0026#34;雍门\u0026#34;, \u0026#34;毋丘\u0026#34;, \u0026#34;贺兰\u0026#34;, \u0026#34;綦毋\u0026#34;, \u0026#34;屋庐\u0026#34;, \u0026#34;独孤\u0026#34;, \u0026#34;南郭\u0026#34;, \u0026#34;北宫\u0026#34;, \u0026#34;王孙\u0026#34; }; //女 名 private static final String[] girl = { \u0026#34;秀\u0026#34;, \u0026#34;娟\u0026#34;, \u0026#34;英\u0026#34;, \u0026#34;华\u0026#34;, \u0026#34;慧\u0026#34;, \u0026#34;巧\u0026#34;, \u0026#34;美\u0026#34;, \u0026#34;娜\u0026#34;, \u0026#34;静\u0026#34;, \u0026#34;淑\u0026#34;, \u0026#34;惠\u0026#34;, \u0026#34;珠\u0026#34;, \u0026#34;翠\u0026#34;, \u0026#34;雅\u0026#34;, \u0026#34;芝\u0026#34;, \u0026#34;玉\u0026#34;, \u0026#34;萍\u0026#34;, \u0026#34;红\u0026#34;, \u0026#34;娥\u0026#34;, \u0026#34;玲\u0026#34;, \u0026#34;芬\u0026#34;, \u0026#34;芳\u0026#34;, \u0026#34;燕\u0026#34;, \u0026#34;彩\u0026#34;, \u0026#34;春\u0026#34;, \u0026#34;菊\u0026#34;, \u0026#34;兰\u0026#34;, \u0026#34;凤\u0026#34;, \u0026#34;洁\u0026#34;, \u0026#34;梅\u0026#34;, \u0026#34;琳\u0026#34;, \u0026#34;素\u0026#34;, \u0026#34;云\u0026#34;, \u0026#34;莲\u0026#34;, \u0026#34;真\u0026#34;, \u0026#34;环\u0026#34;, \u0026#34;雪\u0026#34;, \u0026#34;荣\u0026#34;, \u0026#34;爱\u0026#34;, \u0026#34;妹\u0026#34;, \u0026#34;霞\u0026#34;, \u0026#34;香\u0026#34;, \u0026#34;月\u0026#34;, \u0026#34;莺\u0026#34;, \u0026#34;媛\u0026#34;, \u0026#34;艳\u0026#34;, \u0026#34;瑞\u0026#34;, \u0026#34;凡\u0026#34;, \u0026#34;佳\u0026#34;, \u0026#34;嘉\u0026#34;, \u0026#34;琼\u0026#34;, \u0026#34;勤\u0026#34;, \u0026#34;珍\u0026#34;, \u0026#34;贞\u0026#34;, \u0026#34;莉\u0026#34;, \u0026#34;桂\u0026#34;, \u0026#34;娣\u0026#34;, \u0026#34;叶\u0026#34;, \u0026#34;璧\u0026#34;, \u0026#34;璐\u0026#34;, \u0026#34;娅\u0026#34;, \u0026#34;琦\u0026#34;, \u0026#34;晶\u0026#34;, \u0026#34;妍\u0026#34;, \u0026#34;茜\u0026#34;, \u0026#34;秋\u0026#34;, \u0026#34;珊\u0026#34;, \u0026#34;莎\u0026#34;, \u0026#34;锦\u0026#34;, \u0026#34;黛\u0026#34;, \u0026#34;青\u0026#34;, \u0026#34;倩\u0026#34;, \u0026#34;婷\u0026#34;, \u0026#34;姣\u0026#34;, \u0026#34;婉\u0026#34;, \u0026#34;娴\u0026#34;, \u0026#34;瑾\u0026#34;, \u0026#34;颖\u0026#34;, \u0026#34;露\u0026#34;, \u0026#34;瑶\u0026#34;, \u0026#34;怡\u0026#34;, \u0026#34;婵\u0026#34;, \u0026#34;雁\u0026#34;, \u0026#34;蓓\u0026#34;, \u0026#34;纨\u0026#34;, \u0026#34;仪\u0026#34;, \u0026#34;荷\u0026#34;, \u0026#34;丹\u0026#34;, \u0026#34;蓉\u0026#34;, \u0026#34;眉\u0026#34;, \u0026#34;君\u0026#34;, \u0026#34;琴\u0026#34;, \u0026#34;蕊\u0026#34;, \u0026#34;薇\u0026#34;, \u0026#34;菁\u0026#34;, \u0026#34;梦\u0026#34;, \u0026#34;岚\u0026#34;, \u0026#34;苑\u0026#34;, \u0026#34;婕\u0026#34;, \u0026#34;馨\u0026#34;, \u0026#34;瑗\u0026#34;, \u0026#34;琰\u0026#34;, \u0026#34;韵\u0026#34;, \u0026#34;融\u0026#34;, \u0026#34;园\u0026#34;, \u0026#34;艺\u0026#34;, \u0026#34;咏\u0026#34;, \u0026#34;卿\u0026#34;, \u0026#34;聪\u0026#34;, \u0026#34;澜\u0026#34;, \u0026#34;纯\u0026#34;, \u0026#34;毓\u0026#34;, \u0026#34;悦\u0026#34;, \u0026#34;昭\u0026#34;, \u0026#34;冰\u0026#34;, \u0026#34;爽\u0026#34;, \u0026#34;琬\u0026#34;, \u0026#34;茗\u0026#34;, \u0026#34;羽\u0026#34;, \u0026#34;希\u0026#34;, \u0026#34;宁\u0026#34;, \u0026#34;欣\u0026#34;, \u0026#34;飘\u0026#34;, \u0026#34;育\u0026#34;, \u0026#34;滢\u0026#34;, \u0026#34;馥\u0026#34;, \u0026#34;筠\u0026#34;, \u0026#34;柔\u0026#34;, \u0026#34;竹\u0026#34;, \u0026#34;霭\u0026#34;, \u0026#34;凝\u0026#34;, \u0026#34;晓\u0026#34;, \u0026#34;欢\u0026#34;, \u0026#34;霄\u0026#34;, \u0026#34;枫\u0026#34;, \u0026#34;芸\u0026#34;, \u0026#34;菲\u0026#34;, \u0026#34;寒\u0026#34;, \u0026#34;伊\u0026#34;, \u0026#34;亚\u0026#34;, \u0026#34;宜\u0026#34;, \u0026#34;可\u0026#34;, \u0026#34;姬\u0026#34;, \u0026#34;舒\u0026#34;, \u0026#34;影\u0026#34;, \u0026#34;荔\u0026#34;, \u0026#34;枝\u0026#34;, \u0026#34;思\u0026#34;, \u0026#34;丽\u0026#34; }; //女 名2 private static final String[] girl2 = { \u0026#34;寄梅\u0026#34;, \u0026#34;代薇\u0026#34;, \u0026#34;南青\u0026#34;, \u0026#34;映冬\u0026#34;, \u0026#34;巧安\u0026#34;, \u0026#34;醉琴\u0026#34;, \u0026#34;幼儿\u0026#34;, \u0026#34;夏曼\u0026#34;, \u0026#34;幼彤\u0026#34;, \u0026#34;诗莲\u0026#34;, \u0026#34;青丹\u0026#34;, \u0026#34;若巧\u0026#34;, \u0026#34;山荷\u0026#34;, \u0026#34;惜旋\u0026#34;, \u0026#34;含芹\u0026#34;, \u0026#34;初云\u0026#34;, \u0026#34;笑丹\u0026#34;, \u0026#34;含蓝\u0026#34;, \u0026#34;诗寒\u0026#34;, \u0026#34;芷容\u0026#34;, \u0026#34;亦旋\u0026#34;, \u0026#34;怀玉\u0026#34;, \u0026#34;惜蓉\u0026#34;, \u0026#34;春梅\u0026#34;, \u0026#34;冷巧\u0026#34;, \u0026#34;凌香\u0026#34;, \u0026#34;恨巧\u0026#34;, \u0026#34;访双\u0026#34;, \u0026#34;沛露\u0026#34;, \u0026#34;念云\u0026#34;, \u0026#34;梦蓉\u0026#34;, \u0026#34;醉蕊\u0026#34;, \u0026#34;友安\u0026#34;, \u0026#34;念露\u0026#34;, \u0026#34;如萍\u0026#34;, \u0026#34;白蕾\u0026#34;, \u0026#34;映薇\u0026#34;, \u0026#34;春荷\u0026#34;, \u0026#34;绿秋\u0026#34;, \u0026#34;惜阳\u0026#34;, \u0026#34;寻翠\u0026#34;, \u0026#34;尔蕾\u0026#34;, \u0026#34;半真\u0026#34;, \u0026#34;寒香\u0026#34;, \u0026#34;寄桃\u0026#34;, \u0026#34;乐莲\u0026#34;, \u0026#34;之枫\u0026#34;, \u0026#34;晓玉\u0026#34;, \u0026#34;宛容\u0026#34;, \u0026#34;惜卉\u0026#34;, \u0026#34;元秋\u0026#34;, \u0026#34;初彤\u0026#34;, \u0026#34;以风\u0026#34;, \u0026#34;醉云\u0026#34;, \u0026#34;惜荷\u0026#34;, \u0026#34;映蕾\u0026#34;, \u0026#34;雅菡\u0026#34;, \u0026#34;千凡\u0026#34;, \u0026#34;含双\u0026#34;, \u0026#34;乐丝\u0026#34;, \u0026#34;千儿\u0026#34;, \u0026#34;凝晴\u0026#34;, \u0026#34;天霜\u0026#34;, \u0026#34;谷梦\u0026#34;, \u0026#34;亦霜\u0026#34;, \u0026#34;诗白\u0026#34;, \u0026#34;问珍\u0026#34;, \u0026#34;水菡\u0026#34;, \u0026#34;青文\u0026#34;, \u0026#34;语双\u0026#34;, \u0026#34;醉桃\u0026#34;, \u0026#34;访薇\u0026#34;, \u0026#34;秋菱\u0026#34;, \u0026#34;半旋\u0026#34;, \u0026#34;问香\u0026#34;, \u0026#34;冷菡\u0026#34;, \u0026#34;夜岚\u0026#34;, \u0026#34;春露\u0026#34;, \u0026#34;曼南\u0026#34;, \u0026#34;晓儿\u0026#34;, \u0026#34;白珍\u0026#34;, \u0026#34;安凡\u0026#34;, \u0026#34;灵菡\u0026#34;, \u0026#34;宛阳\u0026#34;, \u0026#34;涵蓉\u0026#34;, \u0026#34;雨安\u0026#34;, \u0026#34;痴秋\u0026#34;, \u0026#34;雁槐\u0026#34;, \u0026#34;元芙\u0026#34;, \u0026#34;问彤\u0026#34;, \u0026#34;谷岚\u0026#34;, \u0026#34;代槐\u0026#34;, \u0026#34;迎芙\u0026#34;, \u0026#34;雅云\u0026#34;, \u0026#34;半凡\u0026#34;, \u0026#34;又文\u0026#34;, \u0026#34;春蕾\u0026#34;, \u0026#34;青风\u0026#34;, \u0026#34;芷柏\u0026#34;, \u0026#34;采海\u0026#34;, \u0026#34;雁萍\u0026#34;, \u0026#34;水枫\u0026#34;, \u0026#34;雪珊\u0026#34;, \u0026#34;雅蕾\u0026#34;, \u0026#34;念兰\u0026#34;, \u0026#34;丹文\u0026#34;, \u0026#34;梦天\u0026#34;, \u0026#34;听容\u0026#34;, \u0026#34;绮旋\u0026#34;, \u0026#34;春安\u0026#34;, \u0026#34;秋槐\u0026#34;, \u0026#34;觅丝\u0026#34;, \u0026#34;恨柏\u0026#34;, \u0026#34;春易\u0026#34;, \u0026#34;雪阳\u0026#34;, \u0026#34;代青\u0026#34;, \u0026#34;夜萍\u0026#34;, \u0026#34;幼波\u0026#34;, \u0026#34;问阳\u0026#34;, \u0026#34;涵丝\u0026#34;, \u0026#34;友筠\u0026#34;, \u0026#34;尔荷\u0026#34;, \u0026#34;凡柔\u0026#34;, \u0026#34;醉南\u0026#34;, \u0026#34;海晴\u0026#34;, \u0026#34;雪萍\u0026#34;, \u0026#34;涵香\u0026#34;, \u0026#34;宛霜\u0026#34;, \u0026#34;痴荷\u0026#34;, \u0026#34;盼灵\u0026#34;, \u0026#34;如凝\u0026#34;, \u0026#34;问雪\u0026#34;, \u0026#34;凌玉\u0026#34;, \u0026#34;映香\u0026#34;, \u0026#34;忆蝶\u0026#34;, \u0026#34;夜风\u0026#34;, \u0026#34;代梅\u0026#34;, \u0026#34;凝蕾\u0026#34;, \u0026#34;迎菱\u0026#34;, \u0026#34;雁容\u0026#34;, \u0026#34;寄海\u0026#34;, \u0026#34;元南\u0026#34;, \u0026#34;曼槐\u0026#34;, \u0026#34;夏春\u0026#34;, \u0026#34;又旋\u0026#34;, \u0026#34;香旋\u0026#34;, \u0026#34;初灵\u0026#34;, \u0026#34;惜山\u0026#34;, \u0026#34;以卉\u0026#34;, \u0026#34;紫荷\u0026#34;, \u0026#34;凝荷\u0026#34;, \u0026#34;盼筠\u0026#34;, \u0026#34;妙蕊\u0026#34;, \u0026#34;映兰\u0026#34;, \u0026#34;访枫\u0026#34;, \u0026#34;易夏\u0026#34;, \u0026#34;觅筠\u0026#34;, \u0026#34;惜雁\u0026#34;, \u0026#34;惜雪\u0026#34;, \u0026#34;芷白\u0026#34;, \u0026#34;迎芹\u0026#34;, \u0026#34;从晴\u0026#34;, \u0026#34;天亦\u0026#34;, \u0026#34;巧兰\u0026#34;, \u0026#34;醉海\u0026#34;, \u0026#34;书巧\u0026#34;, \u0026#34;绿青\u0026#34;, \u0026#34;水梅\u0026#34;, \u0026#34;水丹\u0026#34;, \u0026#34;恨兰\u0026#34;, \u0026#34;梦丝\u0026#34;, \u0026#34;惜菱\u0026#34;, \u0026#34;新双\u0026#34;, \u0026#34;访烟\u0026#34;, \u0026#34;盼槐\u0026#34;, \u0026#34;冰枫\u0026#34;, \u0026#34;青槐\u0026#34;, \u0026#34;寻芹\u0026#34;, \u0026#34;雁蕊\u0026#34;, \u0026#34;冷蓝\u0026#34;, \u0026#34;飞香\u0026#34;, \u0026#34;凌蝶\u0026#34;, \u0026#34;雁凝\u0026#34;, \u0026#34;丹易\u0026#34;, \u0026#34;秋夏\u0026#34;, \u0026#34;绮寒\u0026#34;, \u0026#34;醉珊\u0026#34;, \u0026#34;天蓝\u0026#34;, \u0026#34;寻翠\u0026#34;, \u0026#34;青晴\u0026#34;, \u0026#34;依夏\u0026#34;, \u0026#34;之文\u0026#34;, \u0026#34;傲云\u0026#34;, \u0026#34;雅柔\u0026#34;, \u0026#34;香儿\u0026#34;, \u0026#34;丹晴\u0026#34;, \u0026#34;幼曼\u0026#34;, \u0026#34;宛香\u0026#34;, \u0026#34;海槐\u0026#34;, \u0026#34;慕雪\u0026#34;, \u0026#34;碧容\u0026#34;, \u0026#34;凡阳\u0026#34;, \u0026#34;新之\u0026#34;, \u0026#34;思雪\u0026#34;, \u0026#34;凌之\u0026#34;, \u0026#34;友凝\u0026#34;, \u0026#34;恨梦\u0026#34;, \u0026#34;绮丹\u0026#34;, \u0026#34;小雪\u0026#34;, \u0026#34;涵梦\u0026#34;, \u0026#34;问蕊\u0026#34;, \u0026#34;宛菱\u0026#34;, \u0026#34;之曼\u0026#34;, \u0026#34;沛阳\u0026#34;, \u0026#34;新丝\u0026#34;, \u0026#34;怜波\u0026#34;, \u0026#34;夜芹\u0026#34;, \u0026#34;易筠\u0026#34;, \u0026#34;碧白\u0026#34;, \u0026#34;白曼\u0026#34;, \u0026#34;千之\u0026#34;, \u0026#34;之青\u0026#34;, \u0026#34;冰枫\u0026#34;, \u0026#34;寻天\u0026#34;, \u0026#34;代翠\u0026#34;, \u0026#34;曼天\u0026#34;, \u0026#34;水玉\u0026#34;, \u0026#34;向绿\u0026#34;, \u0026#34;盼瑶\u0026#34;, \u0026#34;凝烟\u0026#34;, \u0026#34;紫彤\u0026#34;, \u0026#34;曼霜\u0026#34;, \u0026#34;听夏\u0026#34;, \u0026#34;碧柔\u0026#34;, \u0026#34;怀夏\u0026#34;, \u0026#34;翠兰\u0026#34;, \u0026#34;山冬\u0026#34;, \u0026#34;雨珍\u0026#34;, \u0026#34;靖灵\u0026#34;, \u0026#34;翠露\u0026#34;, \u0026#34;尔蕾\u0026#34;, \u0026#34;千灵\u0026#34;, \u0026#34;绿珊\u0026#34;, \u0026#34;思山\u0026#34;, \u0026#34;凝露\u0026#34;, \u0026#34;如波\u0026#34;, \u0026#34;晓白\u0026#34;, \u0026#34;梦薇\u0026#34;, \u0026#34;采丹\u0026#34;, \u0026#34;孤曼\u0026#34;, \u0026#34;慕白\u0026#34;, \u0026#34;静云\u0026#34;, \u0026#34;春巧\u0026#34;, \u0026#34;访海\u0026#34;, \u0026#34;问易\u0026#34;, \u0026#34;孤彤\u0026#34;, \u0026#34;山芹\u0026#34;, \u0026#34;静容\u0026#34;, \u0026#34;依儿\u0026#34;, \u0026#34;思蕾\u0026#34;, \u0026#34;妙蓉\u0026#34;, \u0026#34;寻丹\u0026#34;, \u0026#34;诗阳\u0026#34;, \u0026#34;友烟\u0026#34;, \u0026#34;盼翠\u0026#34;, \u0026#34;之荷\u0026#34;, \u0026#34;觅凡\u0026#34;, \u0026#34;灵文\u0026#34;, \u0026#34;涵枫\u0026#34;, \u0026#34;千儿\u0026#34;, \u0026#34;丹柏\u0026#34;, \u0026#34;觅梦\u0026#34;, \u0026#34;念海\u0026#34;, \u0026#34;新竹\u0026#34;, \u0026#34;又凝\u0026#34;, \u0026#34;怀珊\u0026#34;, \u0026#34;梦巧\u0026#34;, \u0026#34;凡海\u0026#34;, \u0026#34;从雪\u0026#34;, \u0026#34;惜蕾\u0026#34;, \u0026#34;凝之\u0026#34;, \u0026#34;夜卉\u0026#34;, \u0026#34;绿晴\u0026#34;, \u0026#34;宛彤\u0026#34;, \u0026#34;山容\u0026#34;, \u0026#34;春风\u0026#34;, \u0026#34;映阳\u0026#34;, \u0026#34;夏柳\u0026#34;, \u0026#34;紫蓝\u0026#34;, \u0026#34;笑彤\u0026#34;, \u0026#34;元蕾\u0026#34;, \u0026#34;翠柏\u0026#34;, \u0026#34;书桃\u0026#34;, \u0026#34;醉烟\u0026#34;, \u0026#34;友蕾\u0026#34;, \u0026#34;幼卉\u0026#34;, \u0026#34;念霜\u0026#34;, \u0026#34;新卉\u0026#34;, \u0026#34;惜儿\u0026#34;, \u0026#34;恨玉\u0026#34;, \u0026#34;安天\u0026#34;, \u0026#34;晓安\u0026#34;, \u0026#34;青兰\u0026#34;, \u0026#34;从波\u0026#34;, \u0026#34;孤寒\u0026#34;, \u0026#34;秋文\u0026#34;, \u0026#34;晓夏\u0026#34;, \u0026#34;南薇\u0026#34;, \u0026#34;凝青\u0026#34;, \u0026#34;采蝶\u0026#34;, \u0026#34;之雪\u0026#34;, \u0026#34;谷风\u0026#34;, \u0026#34;碧薇\u0026#34;, \u0026#34;依彤\u0026#34;, \u0026#34;水琴\u0026#34;, \u0026#34;亦秋\u0026#34;, \u0026#34;绮萱\u0026#34;, \u0026#34;飞梦\u0026#34;, \u0026#34;傲珍\u0026#34;, \u0026#34;诗荷\u0026#34;, \u0026#34;靖芙\u0026#34;, \u0026#34;冰槐\u0026#34;, \u0026#34;雨蕾\u0026#34;, \u0026#34;山梅\u0026#34;, \u0026#34;雪翠\u0026#34;, \u0026#34;孤云\u0026#34;, \u0026#34;凌卉\u0026#34;, \u0026#34;半巧\u0026#34;, \u0026#34;寒风\u0026#34;, \u0026#34;笑柔\u0026#34;, \u0026#34;飞梦\u0026#34;, \u0026#34;静蝶\u0026#34;, \u0026#34;紫凝\u0026#34;, \u0026#34;冬卉\u0026#34;, \u0026#34;绿烟\u0026#34;, \u0026#34;凝彤\u0026#34;, \u0026#34;元易\u0026#34;, \u0026#34;寻亦\u0026#34;, \u0026#34;恨晴\u0026#34;, \u0026#34;千凝\u0026#34;, \u0026#34;觅珊\u0026#34;, \u0026#34;曼珍\u0026#34;, \u0026#34;映柔\u0026#34;, \u0026#34;初白\u0026#34;, \u0026#34;夜云\u0026#34;, \u0026#34;海天\u0026#34;, \u0026#34;巧春\u0026#34;, \u0026#34;冷亦\u0026#34;, \u0026#34;冰筠\u0026#34;, \u0026#34;涵天\u0026#34;, \u0026#34;寒竹\u0026#34;, \u0026#34;亦蝶\u0026#34;, \u0026#34;之芙\u0026#34;, \u0026#34;丹雪\u0026#34;, \u0026#34;香枫\u0026#34;, \u0026#34;紫蓝\u0026#34;, \u0026#34;念槐\u0026#34;, \u0026#34;迎香\u0026#34;, \u0026#34;水柔\u0026#34;, \u0026#34;念波\u0026#34;, \u0026#34;青枫\u0026#34;, \u0026#34;巧灵\u0026#34;, \u0026#34;孤凡\u0026#34;, \u0026#34;笑露\u0026#34;, \u0026#34;傲蓉\u0026#34;, \u0026#34;映蕊\u0026#34;, \u0026#34;白蕊\u0026#34;, \u0026#34;灵曼\u0026#34;, \u0026#34;友云\u0026#34;, \u0026#34;孤香\u0026#34;, \u0026#34;忆芹\u0026#34;, \u0026#34;天菡\u0026#34;, \u0026#34;曼丝\u0026#34;, \u0026#34;慕菱\u0026#34;, \u0026#34;思凝\u0026#34;, \u0026#34;绿青\u0026#34;, \u0026#34;晓荷\u0026#34;, \u0026#34;紫易\u0026#34;, \u0026#34;采珍\u0026#34;, \u0026#34;采丝\u0026#34;, \u0026#34;芷香\u0026#34;, \u0026#34;白天\u0026#34;, \u0026#34;觅安\u0026#34;, \u0026#34;盼梅\u0026#34;, \u0026#34;灵松\u0026#34;, \u0026#34;冰松\u0026#34;, \u0026#34;南露\u0026#34;, \u0026#34;问香\u0026#34;, \u0026#34;碧萍\u0026#34;, \u0026#34;紫筠\u0026#34;, \u0026#34;安凡\u0026#34;, \u0026#34;友晴\u0026#34;, \u0026#34;亦春\u0026#34;, \u0026#34;凌荷\u0026#34;, \u0026#34;青之\u0026#34;, \u0026#34;笑梦\u0026#34;, \u0026#34;半雪\u0026#34;, \u0026#34;绮绿\u0026#34;, \u0026#34;青烟\u0026#34;, \u0026#34;迎珍\u0026#34;, \u0026#34;之凡\u0026#34;, \u0026#34;晓萱\u0026#34;, \u0026#34;寒梅\u0026#34;, \u0026#34;如云\u0026#34;, \u0026#34;翠南\u0026#34;, \u0026#34;怜蕾\u0026#34;, \u0026#34;惜霜\u0026#34;, \u0026#34;迎真\u0026#34;, \u0026#34;思薇\u0026#34;, \u0026#34;之柏\u0026#34;, \u0026#34;冷云\u0026#34;, \u0026#34;恨芹\u0026#34;, \u0026#34;碧白\u0026#34;, \u0026#34;听寒\u0026#34;, \u0026#34;幻天\u0026#34;, \u0026#34;谷柔\u0026#34;, \u0026#34;初卉\u0026#34;, \u0026#34;水青\u0026#34;, \u0026#34;问蕊\u0026#34;, \u0026#34;灵双\u0026#34;, \u0026#34;寒萱\u0026#34;, \u0026#34;乐露\u0026#34;, \u0026#34;芷菱\u0026#34;, \u0026#34;又露\u0026#34;, \u0026#34;灵芹\u0026#34;, \u0026#34;易柔\u0026#34;, \u0026#34;千寒\u0026#34;, \u0026#34;元芹\u0026#34;, \u0026#34;巧南\u0026#34;, \u0026#34;寄云\u0026#34;, \u0026#34;妙海\u0026#34;, \u0026#34;向菱\u0026#34;, \u0026#34;幻霜\u0026#34;, \u0026#34;觅凝\u0026#34;, \u0026#34;笑蕊\u0026#34;, \u0026#34;翠波\u0026#34;, \u0026#34;念寒\u0026#34;, \u0026#34;迎寒\u0026#34;, \u0026#34;元薇\u0026#34;, \u0026#34;雅南\u0026#34;, \u0026#34;涵海\u0026#34;, \u0026#34;冷玉\u0026#34;, \u0026#34;谷蓉\u0026#34;, \u0026#34;以晴\u0026#34;, \u0026#34;怜丝\u0026#34;, \u0026#34;从丹\u0026#34;, \u0026#34;如巧\u0026#34;, \u0026#34;忆风\u0026#34;, \u0026#34;醉蝶\u0026#34;, \u0026#34;秋儿\u0026#34;, \u0026#34;亦秋\u0026#34;, \u0026#34;春萍\u0026#34;, \u0026#34;芷琴\u0026#34;, \u0026#34;问旋\u0026#34;, \u0026#34;青露\u0026#34;, \u0026#34;傲云\u0026#34;, \u0026#34;幼蝶\u0026#34;, \u0026#34;水荷\u0026#34;, \u0026#34;乐蓉\u0026#34;, \u0026#34;语珍\u0026#34;, \u0026#34;恨安\u0026#34;, \u0026#34;冷柔\u0026#34;, \u0026#34;映之\u0026#34;, \u0026#34;妙冬\u0026#34;, \u0026#34;梦柔\u0026#34;, \u0026#34;怀丝\u0026#34;, \u0026#34;痴柳\u0026#34;, \u0026#34;乐凝\u0026#34;, \u0026#34;丹卉\u0026#34;, \u0026#34;初梅\u0026#34;, \u0026#34;凝柳\u0026#34;, \u0026#34;迎荷\u0026#34;, \u0026#34;小彤\u0026#34;, \u0026#34;尔蓉\u0026#34;, \u0026#34;梦岚\u0026#34;, \u0026#34;冬亦\u0026#34;, \u0026#34;飞亦\u0026#34;, \u0026#34;雅旋\u0026#34;, \u0026#34;代珍\u0026#34;, \u0026#34;忆亦\u0026#34;, \u0026#34;翠彤\u0026#34;, \u0026#34;千晴\u0026#34;, \u0026#34;念蕊\u0026#34;, \u0026#34;易玉\u0026#34;, \u0026#34;涵玉\u0026#34;, \u0026#34;初彤\u0026#34;, \u0026#34;之柳\u0026#34;, \u0026#34;谷曼\u0026#34;, \u0026#34;飞桃\u0026#34;, \u0026#34;平莲\u0026#34;, \u0026#34;春亦\u0026#34;, \u0026#34;映荷\u0026#34;, \u0026#34;雅玉\u0026#34;, \u0026#34;怜卉\u0026#34;, \u0026#34;晓薇\u0026#34;, \u0026#34;尔筠\u0026#34;, \u0026#34;怜雁\u0026#34;, \u0026#34;雨天\u0026#34;, \u0026#34;代冬\u0026#34;, \u0026#34;飞柏\u0026#34;, \u0026#34;安曼\u0026#34;, \u0026#34;小兰\u0026#34;, \u0026#34;谷蕊\u0026#34;, \u0026#34;紫雁\u0026#34;, \u0026#34;白筠\u0026#34;, \u0026#34;慕萱\u0026#34;, \u0026#34;恨兰\u0026#34;, \u0026#34;雪白\u0026#34;, \u0026#34;若南\u0026#34;, \u0026#34;静阳\u0026#34;, \u0026#34;南萱\u0026#34;, \u0026#34;念蕊\u0026#34;, \u0026#34;又巧\u0026#34;, \u0026#34;碧瑶\u0026#34;, \u0026#34;慕山\u0026#34;, \u0026#34;绮蕾\u0026#34;, \u0026#34;紫夏\u0026#34;, \u0026#34;盼筠\u0026#34;, \u0026#34;绮芹\u0026#34;, \u0026#34;寄云\u0026#34;, \u0026#34;半柔\u0026#34;, \u0026#34;春彤\u0026#34;, \u0026#34;靖玉\u0026#34;, \u0026#34;采山\u0026#34;, \u0026#34;寒蓉\u0026#34;, \u0026#34;觅香\u0026#34;, \u0026#34;笑枫\u0026#34;, \u0026#34;寻凡\u0026#34;, \u0026#34;傲南\u0026#34;, \u0026#34;盼柳\u0026#34;, \u0026#34;凝云\u0026#34;, \u0026#34;初晴\u0026#34;, \u0026#34;怀冬\u0026#34;, \u0026#34;水蓉\u0026#34;, \u0026#34;恨雁\u0026#34;, \u0026#34;山蕊\u0026#34;, \u0026#34;山云\u0026#34;, \u0026#34;冰梅\u0026#34;, \u0026#34;白双\u0026#34;, \u0026#34;南雪\u0026#34;, \u0026#34;亦雁\u0026#34;, \u0026#34;香云\u0026#34;, \u0026#34;忆蓉\u0026#34;, \u0026#34;代萱\u0026#34;, \u0026#34;之亦\u0026#34;, \u0026#34;雨萱\u0026#34;, \u0026#34;小之\u0026#34;, \u0026#34;思凡\u0026#34;, \u0026#34;向菱\u0026#34;, \u0026#34;夏槐\u0026#34;, \u0026#34;水卉\u0026#34;, \u0026#34;如玉\u0026#34;, \u0026#34;如双\u0026#34;, \u0026#34;寒青\u0026#34;, \u0026#34;代夏\u0026#34;, \u0026#34;思蝶\u0026#34;, \u0026#34;元丝\u0026#34;, \u0026#34;依松\u0026#34;, \u0026#34;安珍\u0026#34;, \u0026#34;南荷\u0026#34;, \u0026#34;又松\u0026#34;, \u0026#34;妙雪\u0026#34;, \u0026#34;若香\u0026#34;, \u0026#34;凡莲\u0026#34;, \u0026#34;痴珍\u0026#34;, \u0026#34;半柔\u0026#34;, \u0026#34;恨槐\u0026#34;, \u0026#34;宛寒\u0026#34;, \u0026#34;碧桃\u0026#34;, \u0026#34;翠风\u0026#34;, \u0026#34;梦蝶\u0026#34;, \u0026#34;飞南\u0026#34;, \u0026#34;怜薇\u0026#34;, \u0026#34;幻梅\u0026#34;, \u0026#34;山亦\u0026#34;, \u0026#34;寻珍\u0026#34;, \u0026#34;天南\u0026#34;, \u0026#34;初凝\u0026#34;, \u0026#34;妙南\u0026#34;, \u0026#34;南烟\u0026#34;, \u0026#34;雨阳\u0026#34;, \u0026#34;绿烟\u0026#34;, \u0026#34;灵冬\u0026#34;, \u0026#34;安蝶\u0026#34;, \u0026#34;青云\u0026#34;, \u0026#34;向双\u0026#34;, \u0026#34;幻丹\u0026#34;, \u0026#34;凡雪\u0026#34;, \u0026#34;亦安\u0026#34;, \u0026#34;半雁\u0026#34;, \u0026#34;梦蕾\u0026#34;, \u0026#34;依海\u0026#34;, \u0026#34;雪岚\u0026#34;, \u0026#34;春文\u0026#34;, \u0026#34;笑云\u0026#34;, \u0026#34;盼秋\u0026#34;, \u0026#34;含卉\u0026#34;, \u0026#34;又香\u0026#34;, \u0026#34;千之\u0026#34;, \u0026#34;忆夏\u0026#34; }; //男 名 private static final String[] boy = { \u0026#34;伟\u0026#34;, \u0026#34;刚\u0026#34;, \u0026#34;勇\u0026#34;, \u0026#34;毅\u0026#34;, \u0026#34;俊\u0026#34;, \u0026#34;峰\u0026#34;, \u0026#34;强\u0026#34;, \u0026#34;军\u0026#34;, \u0026#34;平\u0026#34;, \u0026#34;保\u0026#34;, \u0026#34;东\u0026#34;, \u0026#34;文\u0026#34;, \u0026#34;辉\u0026#34;, \u0026#34;力\u0026#34;, \u0026#34;明\u0026#34;, \u0026#34;永\u0026#34;, \u0026#34;健\u0026#34;, \u0026#34;世\u0026#34;, \u0026#34;广\u0026#34;, \u0026#34;志\u0026#34;, \u0026#34;义\u0026#34;, \u0026#34;兴\u0026#34;, \u0026#34;良\u0026#34;, \u0026#34;海\u0026#34;, \u0026#34;山\u0026#34;, \u0026#34;仁\u0026#34;, \u0026#34;波\u0026#34;, \u0026#34;宁\u0026#34;, \u0026#34;贵\u0026#34;, \u0026#34;福\u0026#34;, \u0026#34;生\u0026#34;, \u0026#34;龙\u0026#34;, \u0026#34;元\u0026#34;, \u0026#34;全\u0026#34;, \u0026#34;国\u0026#34;, \u0026#34;胜\u0026#34;, \u0026#34;学\u0026#34;, \u0026#34;祥\u0026#34;, \u0026#34;才\u0026#34;, \u0026#34;发\u0026#34;, \u0026#34;武\u0026#34;, \u0026#34;新\u0026#34;, \u0026#34;利\u0026#34;, \u0026#34;清\u0026#34;, \u0026#34;飞\u0026#34;, \u0026#34;彬\u0026#34;, \u0026#34;富\u0026#34;, \u0026#34;顺\u0026#34;, \u0026#34;信\u0026#34;, \u0026#34;子\u0026#34;, \u0026#34;杰\u0026#34;, \u0026#34;涛\u0026#34;, \u0026#34;昌\u0026#34;, \u0026#34;成\u0026#34;, \u0026#34;康\u0026#34;, \u0026#34;星\u0026#34;, \u0026#34;光\u0026#34;, \u0026#34;天\u0026#34;, \u0026#34;达\u0026#34;, \u0026#34;安\u0026#34;, \u0026#34;岩\u0026#34;, \u0026#34;中\u0026#34;, \u0026#34;茂\u0026#34;, \u0026#34;进\u0026#34;, \u0026#34;林\u0026#34;, \u0026#34;有\u0026#34;, \u0026#34;坚\u0026#34;, \u0026#34;和\u0026#34;, \u0026#34;彪\u0026#34;, \u0026#34;博\u0026#34;, \u0026#34;诚\u0026#34;, \u0026#34;先\u0026#34;, \u0026#34;敬\u0026#34;, \u0026#34;震\u0026#34;, \u0026#34;振\u0026#34;, \u0026#34;壮\u0026#34;, \u0026#34;会\u0026#34;, \u0026#34;思\u0026#34;, \u0026#34;群\u0026#34;, \u0026#34;豪\u0026#34;, \u0026#34;心\u0026#34;, \u0026#34;邦\u0026#34;, \u0026#34;承\u0026#34;, \u0026#34;乐\u0026#34;, \u0026#34;绍\u0026#34;, \u0026#34;功\u0026#34;, \u0026#34;松\u0026#34;, \u0026#34;善\u0026#34;, \u0026#34;厚\u0026#34;, \u0026#34;庆\u0026#34;, \u0026#34;磊\u0026#34;, \u0026#34;民\u0026#34;, \u0026#34;友\u0026#34;, \u0026#34;裕\u0026#34;, \u0026#34;河\u0026#34;, \u0026#34;哲\u0026#34;, \u0026#34;江\u0026#34;, \u0026#34;超\u0026#34;, \u0026#34;浩\u0026#34;, \u0026#34;亮\u0026#34;, \u0026#34;政\u0026#34;, \u0026#34;谦\u0026#34;, \u0026#34;亨\u0026#34;, \u0026#34;奇\u0026#34;, \u0026#34;固\u0026#34;, \u0026#34;之\u0026#34;, \u0026#34;轮\u0026#34;, \u0026#34;翰\u0026#34;, \u0026#34;朗\u0026#34;, \u0026#34;伯\u0026#34;, \u0026#34;宏\u0026#34;, \u0026#34;言\u0026#34;, \u0026#34;若\u0026#34;, \u0026#34;鸣\u0026#34;, \u0026#34;朋\u0026#34;, \u0026#34;斌\u0026#34;, \u0026#34;梁\u0026#34;, \u0026#34;栋\u0026#34;, \u0026#34;维\u0026#34;, \u0026#34;启\u0026#34;, \u0026#34;克\u0026#34;, \u0026#34;伦\u0026#34;, \u0026#34;翔\u0026#34;, \u0026#34;旭\u0026#34;, \u0026#34;鹏\u0026#34;, \u0026#34;泽\u0026#34;, \u0026#34;晨\u0026#34;, \u0026#34;辰\u0026#34;, \u0026#34;士\u0026#34;, \u0026#34;以\u0026#34;, \u0026#34;建\u0026#34;, \u0026#34;家\u0026#34;, \u0026#34;致\u0026#34;, \u0026#34;树\u0026#34;, \u0026#34;炎\u0026#34;, \u0026#34;德\u0026#34;, \u0026#34;行\u0026#34;, \u0026#34;时\u0026#34;, \u0026#34;泰\u0026#34;, \u0026#34;盛\u0026#34;, \u0026#34;雄\u0026#34;, \u0026#34;琛\u0026#34;, \u0026#34;钧\u0026#34;, \u0026#34;冠\u0026#34;, \u0026#34;策\u0026#34;, \u0026#34;腾\u0026#34;, \u0026#34;楠\u0026#34;, \u0026#34;榕\u0026#34;, \u0026#34;风\u0026#34;, \u0026#34;航\u0026#34;, \u0026#34;弘\u0026#34; }; private static final String[] boy2 = { \u0026#34;安邦\u0026#34;, \u0026#34;安福\u0026#34;, \u0026#34;安歌\u0026#34;, \u0026#34;安国\u0026#34;, \u0026#34;安和\u0026#34;, \u0026#34;安康\u0026#34;, \u0026#34;安澜\u0026#34;, \u0026#34;安民\u0026#34;, \u0026#34;安宁\u0026#34;, \u0026#34;安平\u0026#34;, \u0026#34;安然\u0026#34;, \u0026#34;安顺\u0026#34;, \u0026#34;蔼民\u0026#34;, \u0026#34;安吉\u0026#34;, \u0026#34;安晏\u0026#34;, \u0026#34;安良\u0026#34;, \u0026#34;安澜\u0026#34;, \u0026#34;安和\u0026#34;, \u0026#34;安平\u0026#34;, \u0026#34;安康\u0026#34;, \u0026#34;安国\u0026#34;, \u0026#34;昂熙\u0026#34;, \u0026#34;昂然\u0026#34;, \u0026#34;昂杰\u0026#34;, \u0026#34;昂雄\u0026#34;, \u0026#34;昂毅\u0026#34;, \u0026#34;昂轩\u0026#34;, \u0026#34;昂雄\u0026#34;, \u0026#34;岸驰\u0026#34;, \u0026#34;岸谷\u0026#34;, \u0026#34;岸驭\u0026#34;, \u0026#34;昂雄\u0026#34;, \u0026#34;傲驰\u0026#34;, \u0026#34;傲骁\u0026#34;, \u0026#34;澳骐\u0026#34;, \u0026#34;澳骏\u0026#34;, \u0026#34;安翔\u0026#34;, \u0026#34;安晏\u0026#34;, \u0026#34;安宜\u0026#34;, \u0026#34;安怡\u0026#34;, \u0026#34;安易\u0026#34;, \u0026#34;安志\u0026#34;, \u0026#34;昂然\u0026#34;, \u0026#34;昂雄\u0026#34;, \u0026#34;宾白\u0026#34;, \u0026#34;宾鸿\u0026#34;, \u0026#34;宾实\u0026#34;, \u0026#34;彬彬\u0026#34;, \u0026#34;彬炳\u0026#34;, \u0026#34;彬郁\u0026#34;, \u0026#34;斌斌\u0026#34;, \u0026#34;斌蔚\u0026#34;, \u0026#34;滨海\u0026#34;, \u0026#34;波光\u0026#34;, \u0026#34;波鸿\u0026#34;, \u0026#34;波峻\u0026#34;, \u0026#34;波涛\u0026#34;, \u0026#34;博瀚\u0026#34;, \u0026#34;博超\u0026#34;, \u0026#34;博达\u0026#34;, \u0026#34;博厚\u0026#34;, \u0026#34;博简\u0026#34;, \u0026#34;博明\u0026#34;, \u0026#34;博容\u0026#34;, \u0026#34;博赡\u0026#34;, \u0026#34;博涉\u0026#34;, \u0026#34;博实\u0026#34;, \u0026#34;博涛\u0026#34;, \u0026#34;秉林\u0026#34;, \u0026#34;秉蘅\u0026#34;, \u0026#34;秉荃\u0026#34;, \u0026#34;秉绶\u0026#34;, \u0026#34;秉东\u0026#34;, \u0026#34;秉中\u0026#34;, \u0026#34;秉坤\u0026#34;, \u0026#34;秉衡\u0026#34;, \u0026#34;秉义\u0026#34;, \u0026#34;秉治\u0026#34;, \u0026#34;秉恩\u0026#34;, \u0026#34;秉政\u0026#34;, \u0026#34;秉钺\u0026#34;, \u0026#34;博超\u0026#34;, \u0026#34;博明\u0026#34;, \u0026#34;博容\u0026#34;, \u0026#34;博雅\u0026#34;, \u0026#34;博延\u0026#34;, \u0026#34;博军\u0026#34;, \u0026#34;博乙\u0026#34;, \u0026#34;博平\u0026#34;, \u0026#34;博宜\u0026#34;, \u0026#34;博勉\u0026#34;, \u0026#34;博裕\u0026#34;, \u0026#34;博跃\u0026#34;, \u0026#34;博耘\u0026#34;, \u0026#34;保华\u0026#34;, \u0026#34;保民\u0026#34;, \u0026#34;保暨\u0026#34;, \u0026#34;保鸿\u0026#34;, \u0026#34;保宁\u0026#34;, \u0026#34;保平\u0026#34;, \u0026#34;弼烁\u0026#34;, \u0026#34;弼实\u0026#34;, \u0026#34;弼烨\u0026#34;, \u0026#34;弼儒\u0026#34;, \u0026#34;炳旺\u0026#34;, \u0026#34;炳潮\u0026#34;, \u0026#34;炳玮\u0026#34;, \u0026#34;帮磊\u0026#34;, \u0026#34;帮钊\u0026#34;, \u0026#34;本然\u0026#34;, \u0026#34;本藤\u0026#34;, \u0026#34;彬彬\u0026#34;, \u0026#34;柏朗\u0026#34;, \u0026#34;柏谷\u0026#34;, \u0026#34;柏莨\u0026#34;, \u0026#34;栢毅\u0026#34;, \u0026#34;博文\u0026#34;, \u0026#34;博学\u0026#34;, \u0026#34;博雅\u0026#34;, \u0026#34;博延\u0026#34;, \u0026#34;博艺\u0026#34;, \u0026#34;博易\u0026#34;, \u0026#34;博裕\u0026#34;, \u0026#34;博远\u0026#34;, \u0026#34;才捷\u0026#34;, \u0026#34;才良\u0026#34;, \u0026#34;才艺\u0026#34;, \u0026#34;才英\u0026#34;, \u0026#34;才哲\u0026#34;, \u0026#34;才俊\u0026#34;, \u0026#34;成和\u0026#34;, \u0026#34;成弘\u0026#34;, \u0026#34;成化\u0026#34;, \u0026#34;成济\u0026#34;, \u0026#34;成礼\u0026#34;, \u0026#34;成龙\u0026#34;, \u0026#34;成仁\u0026#34;, \u0026#34;成双\u0026#34;, \u0026#34;成天\u0026#34;, \u0026#34;成业\u0026#34;, \u0026#34;成益\u0026#34;, \u0026#34;成荫\u0026#34;, \u0026#34;成周\u0026#34;, \u0026#34;承安\u0026#34;, \u0026#34;承弼\u0026#34;, \u0026#34;承德\u0026#34;, \u0026#34;承恩\u0026#34;, \u0026#34;承福\u0026#34;, \u0026#34;承基\u0026#34;, \u0026#34;承教\u0026#34;, \u0026#34;承平\u0026#34;, \u0026#34;承嗣\u0026#34;, \u0026#34;承天\u0026#34;, \u0026#34;承望\u0026#34;, \u0026#34;承宣\u0026#34;, \u0026#34;承颜\u0026#34;, \u0026#34;承业\u0026#34;, \u0026#34;承悦\u0026#34;, \u0026#34;承允\u0026#34;, \u0026#34;承运\u0026#34;, \u0026#34;承载\u0026#34;, \u0026#34;承泽\u0026#34;, \u0026#34;承志\u0026#34;, \u0026#34;德本\u0026#34;, \u0026#34;德海\u0026#34;, \u0026#34;德厚\u0026#34;, \u0026#34;德华\u0026#34;, \u0026#34;德辉\u0026#34;, \u0026#34;德惠\u0026#34;, \u0026#34;德容\u0026#34;, \u0026#34;德润\u0026#34;, \u0026#34;德寿\u0026#34;, \u0026#34;德水\u0026#34;, \u0026#34;德馨\u0026#34;, \u0026#34;德曜\u0026#34;, \u0026#34;德业\u0026#34;, \u0026#34;德义\u0026#34;, \u0026#34;德庸\u0026#34;, \u0026#34;德佑\u0026#34;, \u0026#34;德宇\u0026#34;, \u0026#34;德元\u0026#34;, \u0026#34;德运\u0026#34;, \u0026#34;德泽\u0026#34;, \u0026#34;德明\u0026#34;, \u0026#34;飞昂\u0026#34;, \u0026#34;飞白\u0026#34;, \u0026#34;飞飙\u0026#34;, \u0026#34;飞掣\u0026#34;, \u0026#34;飞尘\u0026#34;, \u0026#34;飞沉\u0026#34;, \u0026#34;飞驰\u0026#34;, \u0026#34;飞光\u0026#34;, \u0026#34;飞翰\u0026#34;, \u0026#34;飞航\u0026#34;, \u0026#34;飞翮\u0026#34;, \u0026#34;飞鸿\u0026#34;, \u0026#34;飞虎\u0026#34;, \u0026#34;飞捷\u0026#34;, \u0026#34;飞龙\u0026#34;, \u0026#34;飞鸾\u0026#34;, \u0026#34;飞鸣\u0026#34;, \u0026#34;飞鹏\u0026#34;, \u0026#34;飞扬\u0026#34;, \u0026#34;飞文\u0026#34;, \u0026#34;飞翔\u0026#34;, \u0026#34;飞星\u0026#34;, \u0026#34;飞翼\u0026#34;, \u0026#34;飞英\u0026#34;, \u0026#34;飞宇\u0026#34;, \u0026#34;飞羽\u0026#34;, \u0026#34;飞雨\u0026#34;, \u0026#34;飞语\u0026#34;, \u0026#34;飞跃\u0026#34;, \u0026#34;飞章\u0026#34;, \u0026#34;飞舟\u0026#34;, \u0026#34;风华\u0026#34;, \u0026#34;丰茂\u0026#34;, \u0026#34;丰羽\u0026#34;, \u0026#34;刚豪\u0026#34;, \u0026#34;刚洁\u0026#34;, \u0026#34;刚捷\u0026#34;, \u0026#34;刚毅\u0026#34;, \u0026#34;高昂\u0026#34;, \u0026#34;高岑\u0026#34;, \u0026#34;高畅\u0026#34;, \u0026#34;高超\u0026#34;, \u0026#34;高驰\u0026#34;, \u0026#34;高达\u0026#34;, \u0026#34;高澹\u0026#34;, \u0026#34;高飞\u0026#34;, \u0026#34;高芬\u0026#34;, \u0026#34;高峯\u0026#34;, \u0026#34;高歌\u0026#34;, \u0026#34;高格\u0026#34;, \u0026#34;高寒\u0026#34;, \u0026#34;高翰\u0026#34;, \u0026#34;高杰\u0026#34;, \u0026#34;高洁\u0026#34;, \u0026#34;高峻\u0026#34;, \u0026#34;高朗\u0026#34;, \u0026#34;高丽\u0026#34;, \u0026#34;高邈\u0026#34;, \u0026#34;高旻\u0026#34;, \u0026#34;高明\u0026#34;, \u0026#34;高爽\u0026#34;, \u0026#34;高兴\u0026#34;, \u0026#34;高轩\u0026#34;, \u0026#34;高雅\u0026#34;, \u0026#34;高扬\u0026#34;, \u0026#34;高阳\u0026#34;, \u0026#34;高义\u0026#34;, \u0026#34;高谊\u0026#34;, \u0026#34;高逸\u0026#34;, \u0026#34;高懿\u0026#34;, \u0026#34;高原\u0026#34;, \u0026#34;高远\u0026#34;, \u0026#34;高韵\u0026#34;, \u0026#34;高卓\u0026#34;, \u0026#34;光赫\u0026#34;, \u0026#34;光华\u0026#34;, \u0026#34;光辉\u0026#34;, \u0026#34;光济\u0026#34;, \u0026#34;光霁\u0026#34;, \u0026#34;光亮\u0026#34;, \u0026#34;光临\u0026#34;, \u0026#34;光明\u0026#34;, \u0026#34;光启\u0026#34;, \u0026#34;光熙\u0026#34;, \u0026#34;光耀\u0026#34;, \u0026#34;光誉\u0026#34;, \u0026#34;光远\u0026#34;, \u0026#34;国安\u0026#34;, \u0026#34;国兴\u0026#34;, \u0026#34;国源\u0026#34;, \u0026#34;冠宇\u0026#34;, \u0026#34;冠玉\u0026#34;, \u0026#34;晗昱\u0026#34;, \u0026#34;晗日\u0026#34;, \u0026#34;涵畅\u0026#34;, \u0026#34;涵涤\u0026#34;, \u0026#34;涵亮\u0026#34;, \u0026#34;涵忍\u0026#34;, \u0026#34;涵容\u0026#34;, \u0026#34;涵润\u0026#34;, \u0026#34;涵涵\u0026#34;, \u0026#34;涵煦\u0026#34;, \u0026#34;涵蓄\u0026#34;, \u0026#34;涵衍\u0026#34;, \u0026#34;涵意\u0026#34;, \u0026#34;涵映\u0026#34;, \u0026#34;涵育\u0026#34;, \u0026#34;翰采\u0026#34;, \u0026#34;翰池\u0026#34;, \u0026#34;翰飞\u0026#34;, \u0026#34;翰海\u0026#34;, \u0026#34;翰翮\u0026#34;, \u0026#34;翰林\u0026#34;, \u0026#34;翰墨\u0026#34;, \u0026#34;翰学\u0026#34;, \u0026#34;翰音\u0026#34;, \u0026#34;瀚玥\u0026#34;, \u0026#34;翰藻\u0026#34;, \u0026#34;瀚海\u0026#34;, \u0026#34;瀚漠\u0026#34;, \u0026#34;昊苍\u0026#34;, \u0026#34;昊昊\u0026#34;, \u0026#34;昊空\u0026#34;, \u0026#34;昊乾\u0026#34;, \u0026#34;昊穹\u0026#34;, \u0026#34;昊然\u0026#34;, \u0026#34;昊然\u0026#34;, \u0026#34;昊天\u0026#34;, \u0026#34;昊焱\u0026#34;, \u0026#34;昊英\u0026#34;, \u0026#34;浩波\u0026#34;, \u0026#34;浩博\u0026#34;, \u0026#34;浩初\u0026#34;, \u0026#34;浩大\u0026#34;, \u0026#34;浩宕\u0026#34;, \u0026#34;浩荡\u0026#34;, \u0026#34;浩歌\u0026#34;, \u0026#34;浩广\u0026#34;, \u0026#34;浩涆\u0026#34;, \u0026#34;浩瀚\u0026#34;, \u0026#34;浩浩\u0026#34;, \u0026#34;浩慨\u0026#34;, \u0026#34;浩旷\u0026#34;, \u0026#34;浩阔\u0026#34;, \u0026#34;浩漫\u0026#34;, \u0026#34;浩淼\u0026#34;, \u0026#34;浩渺\u0026#34;, \u0026#34;浩邈\u0026#34;, \u0026#34;浩气\u0026#34;, \u0026#34;浩然\u0026#34;, \u0026#34;浩穰\u0026#34;, \u0026#34;浩壤\u0026#34;, \u0026#34;浩思\u0026#34;, \u0026#34;浩言\u0026#34;, \u0026#34;皓轩\u0026#34;, \u0026#34;和蔼\u0026#34;, \u0026#34;和安\u0026#34;, \u0026#34;和璧\u0026#34;, \u0026#34;和昶\u0026#34;, \u0026#34;和畅\u0026#34;, \u0026#34;和风\u0026#34;, \u0026#34;和歌\u0026#34;, \u0026#34;和光\u0026#34;, \u0026#34;和平\u0026#34;, \u0026#34;和洽\u0026#34;, \u0026#34;和惬\u0026#34;, \u0026#34;和顺\u0026#34;, \u0026#34;和硕\u0026#34;, \u0026#34;和颂\u0026#34;, \u0026#34;和泰\u0026#34;, \u0026#34;和悌\u0026#34;, \u0026#34;和通\u0026#34;, \u0026#34;和同\u0026#34;, \u0026#34;和煦\u0026#34;, \u0026#34;和雅\u0026#34;, \u0026#34;和宜\u0026#34;, \u0026#34;和怡\u0026#34;, \u0026#34;和玉\u0026#34;, \u0026#34;和裕\u0026#34;, \u0026#34;和豫\u0026#34;, \u0026#34;和悦\u0026#34;, \u0026#34;和韵\u0026#34;, \u0026#34;和泽\u0026#34;, \u0026#34;和正\u0026#34;, \u0026#34;和志\u0026#34;, \u0026#34;鹤轩\u0026#34;, \u0026#34;弘博\u0026#34;, \u0026#34;弘大\u0026#34;, \u0026#34;弘方\u0026#34;, \u0026#34;弘光\u0026#34;, \u0026#34;弘和\u0026#34;, \u0026#34;弘厚\u0026#34;, \u0026#34;弘化\u0026#34;, \u0026#34;弘济\u0026#34;, \u0026#34;弘阔\u0026#34;, \u0026#34;弘亮\u0026#34;, \u0026#34;弘量\u0026#34;, \u0026#34;弘深\u0026#34;, \u0026#34;弘盛\u0026#34;, \u0026#34;弘图\u0026#34;, \u0026#34;弘伟\u0026#34;, \u0026#34;弘文\u0026#34;, \u0026#34;弘新\u0026#34;, \u0026#34;弘雅\u0026#34;, \u0026#34;弘扬\u0026#34;, \u0026#34;弘业\u0026#34;, \u0026#34;弘义\u0026#34;, \u0026#34;弘益\u0026#34;, \u0026#34;弘毅\u0026#34;, \u0026#34;弘懿\u0026#34;, \u0026#34;弘致\u0026#34;, \u0026#34;弘壮\u0026#34;, \u0026#34;宏伯\u0026#34;, \u0026#34;宏博\u0026#34;, \u0026#34;宏才\u0026#34;, \u0026#34;宏畅\u0026#34;, \u0026#34;宏达\u0026#34;, \u0026#34;宏大\u0026#34;, \u0026#34;宏放\u0026#34;, \u0026#34;宏富\u0026#34;, \u0026#34;宏峻\u0026#34;, \u0026#34;宏浚\u0026#34;, \u0026#34;宏恺\u0026#34;, \u0026#34;宏旷\u0026#34;, \u0026#34;宏阔\u0026#34;, \u0026#34;宏朗\u0026#34;, \u0026#34;宏茂\u0026#34;, \u0026#34;宏邈\u0026#34;, \u0026#34;宏儒\u0026#34;, \u0026#34;宏深\u0026#34;, \u0026#34;宏胜\u0026#34;, \u0026#34;宏盛\u0026#34;, \u0026#34;宏爽\u0026#34;, \u0026#34;宏硕\u0026#34;, \u0026#34;宏伟\u0026#34;, \u0026#34;宏扬\u0026#34;, \u0026#34;宏义\u0026#34;, \u0026#34;宏逸\u0026#34;, \u0026#34;宏毅\u0026#34;, \u0026#34;宏远\u0026#34;, \u0026#34;宏壮\u0026#34;, \u0026#34;鸿宝\u0026#34;, \u0026#34;鸿波\u0026#34;, \u0026#34;鸿博\u0026#34;, \u0026#34;鸿才\u0026#34;, \u0026#34;鸿彩\u0026#34;, \u0026#34;鸿畅\u0026#34;, \u0026#34;鸿畴\u0026#34;, \u0026#34;鸿达\u0026#34;, \u0026#34;鸿德\u0026#34;, \u0026#34;鸿飞\u0026#34;, \u0026#34;鸿风\u0026#34;, \u0026#34;鸿福\u0026#34;, \u0026#34;鸿光\u0026#34;, \u0026#34;鸿晖\u0026#34;, \u0026#34;鸿朗\u0026#34;, \u0026#34;鸿文\u0026#34;, \u0026#34;鸿熙\u0026#34;, \u0026#34;鸿羲\u0026#34;, \u0026#34;鸿禧\u0026#34;, \u0026#34;鸿信\u0026#34;, \u0026#34;鸿轩\u0026#34;, \u0026#34;鸿煊\u0026#34;, \u0026#34;鸿煊\u0026#34;, \u0026#34;鸿雪\u0026#34;, \u0026#34;鸿羽\u0026#34;, \u0026#34;鸿远\u0026#34;, \u0026#34;鸿云\u0026#34;, \u0026#34;鸿运\u0026#34;, \u0026#34;鸿哲\u0026#34;, \u0026#34;鸿祯\u0026#34;, \u0026#34;鸿振\u0026#34;, \u0026#34;鸿志\u0026#34;, \u0026#34;鸿卓\u0026#34;, \u0026#34;华奥\u0026#34;, \u0026#34;华采\u0026#34;, \u0026#34;华彩\u0026#34;, \u0026#34;华灿\u0026#34;, \u0026#34;华藏\u0026#34;, \u0026#34;华池\u0026#34;, \u0026#34;华翰\u0026#34;, \u0026#34;华皓\u0026#34;, \u0026#34;华晖\u0026#34;, \u0026#34;华辉\u0026#34;, \u0026#34;华茂\u0026#34;, \u0026#34;华美\u0026#34;, \u0026#34;华清\u0026#34;, \u0026#34;华荣\u0026#34;, \u0026#34;华容\u0026#34;, \u0026#34;嘉赐\u0026#34;, \u0026#34;嘉德\u0026#34;, \u0026#34;嘉福\u0026#34;, \u0026#34;嘉良\u0026#34;, \u0026#34;嘉茂\u0026#34;, \u0026#34;嘉木\u0026#34;, \u0026#34;嘉慕\u0026#34;, \u0026#34;嘉纳\u0026#34;, \u0026#34;嘉年\u0026#34;, \u0026#34;嘉平\u0026#34;, \u0026#34;嘉庆\u0026#34;, \u0026#34;嘉荣\u0026#34;, \u0026#34;嘉容\u0026#34;, \u0026#34;嘉瑞\u0026#34;, \u0026#34;嘉胜\u0026#34;, \u0026#34;嘉石\u0026#34;, \u0026#34;嘉实\u0026#34;, \u0026#34;嘉树\u0026#34;, \u0026#34;嘉澍\u0026#34;, \u0026#34;嘉熙\u0026#34;, \u0026#34;嘉禧\u0026#34;, \u0026#34;嘉祥\u0026#34;, \u0026#34;嘉歆\u0026#34;, \u0026#34;嘉许\u0026#34;, \u0026#34;嘉勋\u0026#34;, \u0026#34;嘉言\u0026#34;, \u0026#34;嘉谊\u0026#34;, \u0026#34;嘉懿\u0026#34;, \u0026#34;嘉颖\u0026#34;, \u0026#34;嘉佑\u0026#34;, \u0026#34;嘉玉\u0026#34;, \u0026#34;嘉誉\u0026#34;, \u0026#34;嘉悦\u0026#34;, \u0026#34;嘉运\u0026#34;, \u0026#34;嘉泽\u0026#34;, \u0026#34;嘉珍\u0026#34;, \u0026#34;嘉祯\u0026#34;, \u0026#34;嘉志\u0026#34;, \u0026#34;嘉致\u0026#34;, \u0026#34;坚白\u0026#34;, \u0026#34;坚壁\u0026#34;, \u0026#34;坚秉\u0026#34;, \u0026#34;坚成\u0026#34;, \u0026#34;坚诚\u0026#34;, \u0026#34;建安\u0026#34;, \u0026#34;建白\u0026#34;, \u0026#34;建柏\u0026#34;, \u0026#34;建本\u0026#34;, \u0026#34;建弼\u0026#34;, \u0026#34;建德\u0026#34;, \u0026#34;建华\u0026#34;, \u0026#34;建明\u0026#34;, \u0026#34;建茗\u0026#34;, \u0026#34;建木\u0026#34;, \u0026#34;建树\u0026#34;, \u0026#34;建同\u0026#34;, \u0026#34;建修\u0026#34;, \u0026#34;建业\u0026#34;, \u0026#34;建义\u0026#34;, \u0026#34;建元\u0026#34;, \u0026#34;建章\u0026#34;, \u0026#34;建中\u0026#34;, \u0026#34;健柏\u0026#34;, \u0026#34;金鑫\u0026#34;, \u0026#34;锦程\u0026#34;, \u0026#34;瑾瑜\u0026#34;, \u0026#34;晋鹏\u0026#34;, \u0026#34;经赋\u0026#34;, \u0026#34;经亘\u0026#34;, \u0026#34;经国\u0026#34;, \u0026#34;经略\u0026#34;, \u0026#34;经纶\u0026#34;, \u0026#34;经纬\u0026#34;, \u0026#34;经武\u0026#34;, \u0026#34;经业\u0026#34;, \u0026#34;经义\u0026#34;, \u0026#34;经艺\u0026#34;, \u0026#34;景澄\u0026#34;, \u0026#34;景福\u0026#34;, \u0026#34;景焕\u0026#34;, \u0026#34;景辉\u0026#34;, \u0026#34;景辉\u0026#34;, \u0026#34;景龙\u0026#34;, \u0026#34;景明\u0026#34;, \u0026#34;景山\u0026#34;, \u0026#34;景胜\u0026#34;, \u0026#34;景铄\u0026#34;, \u0026#34;景天\u0026#34;, \u0026#34;景同\u0026#34;, \u0026#34;景曜\u0026#34;, \u0026#34;靖琪\u0026#34;, \u0026#34;君昊\u0026#34;, \u0026#34;君浩\u0026#34;, \u0026#34;俊艾\u0026#34;, \u0026#34;俊拔\u0026#34;, \u0026#34;俊弼\u0026#34;, \u0026#34;俊才\u0026#34;, \u0026#34;俊材\u0026#34;, \u0026#34;俊驰\u0026#34;, \u0026#34;俊楚\u0026#34;, \u0026#34;俊达\u0026#34;, \u0026#34;俊德\u0026#34;, \u0026#34;俊发\u0026#34;, \u0026#34;俊风\u0026#34;, \u0026#34;俊豪\u0026#34;, \u0026#34;俊健\u0026#34;, \u0026#34;俊杰\u0026#34;, \u0026#34;俊捷\u0026#34;, \u0026#34;俊郎\u0026#34;, \u0026#34;俊力\u0026#34;, \u0026#34;俊良\u0026#34;, \u0026#34;俊迈\u0026#34;, \u0026#34;俊茂\u0026#34;, \u0026#34;俊美\u0026#34;, \u0026#34;俊民\u0026#34;, \u0026#34;俊名\u0026#34;, \u0026#34;俊明\u0026#34;, \u0026#34;俊楠\u0026#34;, \u0026#34;俊能\u0026#34;, \u0026#34;俊人\u0026#34;, \u0026#34;俊爽\u0026#34;, \u0026#34;俊悟\u0026#34;, \u0026#34;俊晤\u0026#34;, \u0026#34;俊侠\u0026#34;, \u0026#34;俊贤\u0026#34;, \u0026#34;俊雄\u0026#34;, \u0026#34;俊雅\u0026#34;, \u0026#34;俊彦\u0026#34;, \u0026#34;俊逸\u0026#34;, \u0026#34;俊英\u0026#34;, \u0026#34;俊友\u0026#34;, \u0026#34;俊语\u0026#34;, \u0026#34;俊誉\u0026#34;, \u0026#34;俊远\u0026#34;, \u0026#34;俊哲\u0026#34;, \u0026#34;俊喆\u0026#34;, \u0026#34;俊智\u0026#34;, \u0026#34;峻熙\u0026#34;, \u0026#34;季萌\u0026#34;, \u0026#34;季同\u0026#34;, \u0026#34;开畅\u0026#34;, \u0026#34;开诚\u0026#34;, \u0026#34;开宇\u0026#34;, \u0026#34;开济\u0026#34;, \u0026#34;开霁\u0026#34;, \u0026#34;开朗\u0026#34;, \u0026#34;凯安\u0026#34;, \u0026#34;凯唱\u0026#34;, \u0026#34;凯定\u0026#34;, \u0026#34;凯风\u0026#34;, \u0026#34;凯复\u0026#34;, \u0026#34;凯歌\u0026#34;, \u0026#34;凯捷\u0026#34;, \u0026#34;凯凯\u0026#34;, \u0026#34;凯康\u0026#34;, \u0026#34;凯乐\u0026#34;, \u0026#34;凯旋\u0026#34;, \u0026#34;凯泽\u0026#34;, \u0026#34;恺歌\u0026#34;, \u0026#34;恺乐\u0026#34;, \u0026#34;康安\u0026#34;, \u0026#34;康伯\u0026#34;, \u0026#34;康成\u0026#34;, \u0026#34;康德\u0026#34;, \u0026#34;康复\u0026#34;, \u0026#34;康健\u0026#34;, \u0026#34;康乐\u0026#34;, \u0026#34;康宁\u0026#34;, \u0026#34;康平\u0026#34;, \u0026#34;康胜\u0026#34;, \u0026#34;康盛\u0026#34;, \u0026#34;康时\u0026#34;, \u0026#34;康适\u0026#34;, \u0026#34;康顺\u0026#34;, \u0026#34;康泰\u0026#34;, \u0026#34;康裕\u0026#34;, \u0026#34;乐安\u0026#34;, \u0026#34;乐邦\u0026#34;, \u0026#34;乐成\u0026#34;, \u0026#34;乐池\u0026#34;, \u0026#34;乐和\u0026#34;, \u0026#34;乐家\u0026#34;, \u0026#34;乐康\u0026#34;, \u0026#34;乐人\u0026#34;, \u0026#34;乐容\u0026#34;, \u0026#34;乐山\u0026#34;, \u0026#34;乐生\u0026#34;, \u0026#34;乐圣\u0026#34;, \u0026#34;乐水\u0026#34;, \u0026#34;乐天\u0026#34;, \u0026#34;乐童\u0026#34;, \u0026#34;乐贤\u0026#34;, \u0026#34;乐心\u0026#34;, \u0026#34;乐欣\u0026#34;, \u0026#34;乐逸\u0026#34;, \u0026#34;乐意\u0026#34;, \u0026#34;乐音\u0026#34;, \u0026#34;乐咏\u0026#34;, \u0026#34;乐游\u0026#34;, \u0026#34;乐语\u0026#34;, \u0026#34;乐悦\u0026#34;, \u0026#34;乐湛\u0026#34;, \u0026#34;乐章\u0026#34;, \u0026#34;乐正\u0026#34;, \u0026#34;乐志\u0026#34;, \u0026#34;黎昕\u0026#34;, \u0026#34;黎明\u0026#34;, \u0026#34;力夫\u0026#34;, \u0026#34;力强\u0026#34;, \u0026#34;力勤\u0026#34;, \u0026#34;力行\u0026#34;, \u0026#34;力学\u0026#34;, \u0026#34;力言\u0026#34;, \u0026#34;立诚\u0026#34;, \u0026#34;立果\u0026#34;, \u0026#34;立人\u0026#34;, \u0026#34;立辉\u0026#34;, \u0026#34;立轩\u0026#34;, \u0026#34;立群\u0026#34;, \u0026#34;良奥\u0026#34;, \u0026#34;良弼\u0026#34;, \u0026#34;良才\u0026#34;, \u0026#34;良材\u0026#34;, \u0026#34;良策\u0026#34;, \u0026#34;良畴\u0026#34;, \u0026#34;良工\u0026#34;, \u0026#34;良翰\u0026#34;, \u0026#34;良吉\u0026#34;, \u0026#34;良骥\u0026#34;, \u0026#34;良俊\u0026#34;, \u0026#34;良骏\u0026#34;, \u0026#34;良朋\u0026#34;, \u0026#34;良平\u0026#34;, \u0026#34;良哲\u0026#34;, \u0026#34;理群\u0026#34;, \u0026#34;理全\u0026#34;, \u0026#34;茂才\u0026#34;, \u0026#34;茂材\u0026#34;, \u0026#34;茂德\u0026#34;, \u0026#34;茂典\u0026#34;, \u0026#34;茂实\u0026#34;, \u0026#34;茂学\u0026#34;, \u0026#34;茂勋\u0026#34;, \u0026#34;茂彦\u0026#34;, \u0026#34;敏博\u0026#34;, \u0026#34;敏才\u0026#34;, \u0026#34;敏达\u0026#34;, \u0026#34;敏叡\u0026#34;, \u0026#34;敏学\u0026#34;, \u0026#34;敏智\u0026#34;, \u0026#34;明诚\u0026#34;, \u0026#34;明达\u0026#34;, \u0026#34;明德\u0026#34;, \u0026#34;明辉\u0026#34;, \u0026#34;明杰\u0026#34;, \u0026#34;明俊\u0026#34;, \u0026#34;明朗\u0026#34;, \u0026#34;明亮\u0026#34;, \u0026#34;明旭\u0026#34;, \u0026#34;明煦\u0026#34;, \u0026#34;明轩\u0026#34;, \u0026#34;明远\u0026#34;, \u0026#34;明哲\u0026#34;, \u0026#34;明喆\u0026#34;, \u0026#34;明知\u0026#34;, \u0026#34;明志\u0026#34;, \u0026#34;明智\u0026#34;, \u0026#34;明珠\u0026#34;, \u0026#34;朋兴\u0026#34;, \u0026#34;朋义\u0026#34;, \u0026#34;彭勃\u0026#34;, \u0026#34;彭薄\u0026#34;, \u0026#34;彭彭\u0026#34;, \u0026#34;彭魄\u0026#34;, \u0026#34;彭越\u0026#34;, \u0026#34;彭泽\u0026#34;, \u0026#34;彭祖\u0026#34;, \u0026#34;鹏程\u0026#34;, \u0026#34;鹏池\u0026#34;, \u0026#34;鹏飞\u0026#34;, \u0026#34;鹏赋\u0026#34;, \u0026#34;鹏海\u0026#34;, \u0026#34;鹏鲸\u0026#34;, \u0026#34;鹏举\u0026#34;, \u0026#34;鹏鹍\u0026#34;, \u0026#34;鹏鲲\u0026#34;, \u0026#34;鹏涛\u0026#34;, \u0026#34;鹏天\u0026#34;, \u0026#34;鹏翼\u0026#34;, \u0026#34;鹏云\u0026#34;, \u0026#34;鹏运\u0026#34;, \u0026#34;濮存\u0026#34;, \u0026#34;溥心\u0026#34;, \u0026#34;璞玉\u0026#34;, \u0026#34;璞瑜\u0026#34;, \u0026#34;浦和\u0026#34;, \u0026#34;浦泽\u0026#34;, \u0026#34;奇略\u0026#34;, \u0026#34;奇迈\u0026#34;, \u0026#34;奇胜\u0026#34;, \u0026#34;奇水\u0026#34;, \u0026#34;奇思\u0026#34;, \u0026#34;奇邃\u0026#34;, \u0026#34;奇伟\u0026#34;, \u0026#34;奇玮\u0026#34;, \u0026#34;奇文\u0026#34;, \u0026#34;奇希\u0026#34;, \u0026#34;奇逸\u0026#34;, \u0026#34;奇正\u0026#34;, \u0026#34;奇志\u0026#34;, \u0026#34;奇致\u0026#34;, \u0026#34;祺福\u0026#34;, \u0026#34;祺然\u0026#34;, \u0026#34;祺祥\u0026#34;, \u0026#34;祺瑞\u0026#34;, \u0026#34;琪睿\u0026#34;, \u0026#34;庆生\u0026#34;, \u0026#34;荣轩\u0026#34;, \u0026#34;锐达\u0026#34;, \u0026#34;锐锋\u0026#34;, \u0026#34;锐翰\u0026#34;, \u0026#34;锐进\u0026#34;, \u0026#34;锐精\u0026#34;, \u0026#34;锐立\u0026#34;, \u0026#34;锐利\u0026#34;, \u0026#34;锐思\u0026#34;, \u0026#34;锐逸\u0026#34;, \u0026#34;锐意\u0026#34;, \u0026#34;锐藻\u0026#34;, \u0026#34;锐泽\u0026#34;, \u0026#34;锐阵\u0026#34;, \u0026#34;锐志\u0026#34;, \u0026#34;锐智\u0026#34;, \u0026#34;睿博\u0026#34;, \u0026#34;睿才\u0026#34;, \u0026#34;睿诚\u0026#34;, \u0026#34;睿慈\u0026#34;, \u0026#34;睿聪\u0026#34;, \u0026#34;睿达\u0026#34;, \u0026#34;睿德\u0026#34;, \u0026#34;睿范\u0026#34;, \u0026#34;睿广\u0026#34;, \u0026#34;睿好\u0026#34;, \u0026#34;睿明\u0026#34;, \u0026#34;睿识\u0026#34;, \u0026#34;睿思\u0026#34;, \u0026#34;绍辉\u0026#34;, \u0026#34;绍钧\u0026#34;, \u0026#34;绍祺\u0026#34;, \u0026#34;绍元\u0026#34;, \u0026#34;升荣\u0026#34;, \u0026#34;圣杰\u0026#34;, \u0026#34;晟睿\u0026#34;, \u0026#34;思聪\u0026#34;, \u0026#34;思淼\u0026#34;, \u0026#34;思源\u0026#34;, \u0026#34;思远\u0026#34;, \u0026#34;思博\u0026#34;, \u0026#34;斯年\u0026#34;, \u0026#34;斯伯\u0026#34;, \u0026#34;泰初\u0026#34;, \u0026#34;泰和\u0026#34;, \u0026#34;泰河\u0026#34;, \u0026#34;泰鸿\u0026#34;, \u0026#34;泰华\u0026#34;, \u0026#34;泰宁\u0026#34;, \u0026#34;泰平\u0026#34;, \u0026#34;泰清\u0026#34;, \u0026#34;泰然\u0026#34;, \u0026#34;天材\u0026#34;, \u0026#34;天成\u0026#34;, \u0026#34;天赋\u0026#34;, \u0026#34;天干\u0026#34;, \u0026#34;天罡\u0026#34;, \u0026#34;天工\u0026#34;, \u0026#34;天翰\u0026#34;, \u0026#34;天和\u0026#34;, \u0026#34;天华\u0026#34;, \u0026#34;天骄\u0026#34;, \u0026#34;天空\u0026#34;, \u0026#34;天禄\u0026#34;, \u0026#34;天路\u0026#34;, \u0026#34;天瑞\u0026#34;, \u0026#34;天睿\u0026#34;, \u0026#34;天逸\u0026#34;, \u0026#34;天佑\u0026#34;, \u0026#34;天宇\u0026#34;, \u0026#34;天元\u0026#34;, \u0026#34;天韵\u0026#34;, \u0026#34;天泽\u0026#34;, \u0026#34;天纵\u0026#34;, \u0026#34;同方\u0026#34;, \u0026#34;同甫\u0026#34;, \u0026#34;同光\u0026#34;, \u0026#34;同和\u0026#34;, \u0026#34;同化\u0026#34;, \u0026#34;同济\u0026#34;, \u0026#34;巍昂\u0026#34;, \u0026#34;巍然\u0026#34;, \u0026#34;巍奕\u0026#34;, \u0026#34;伟博\u0026#34;, \u0026#34;伟毅\u0026#34;, \u0026#34;伟才\u0026#34;, \u0026#34;伟诚\u0026#34;, \u0026#34;伟茂\u0026#34;, \u0026#34;伟懋\u0026#34;, \u0026#34;伟祺\u0026#34;, \u0026#34;伟彦\u0026#34;, \u0026#34;伟晔\u0026#34;, \u0026#34;伟泽\u0026#34;, \u0026#34;伟兆\u0026#34;, \u0026#34;伟志\u0026#34;, \u0026#34;温纶\u0026#34;, \u0026#34;温茂\u0026#34;, \u0026#34;温书\u0026#34;, \u0026#34;温韦\u0026#34;, \u0026#34;温文\u0026#34;, \u0026#34;温瑜\u0026#34;, \u0026#34;文柏\u0026#34;, \u0026#34;文昌\u0026#34;, \u0026#34;文成\u0026#34;, \u0026#34;文德\u0026#34;, \u0026#34;文栋\u0026#34;, \u0026#34;文赋\u0026#34;, \u0026#34;文光\u0026#34;, \u0026#34;文翰\u0026#34;, \u0026#34;文虹\u0026#34;, \u0026#34;文华\u0026#34;, \u0026#34;文康\u0026#34;, \u0026#34;文乐\u0026#34;, \u0026#34;文林\u0026#34;, \u0026#34;文敏\u0026#34;, \u0026#34;文瑞\u0026#34;, \u0026#34;文山\u0026#34;, \u0026#34;文石\u0026#34;, \u0026#34;文星\u0026#34;, \u0026#34;文轩\u0026#34;, \u0026#34;文宣\u0026#34;, \u0026#34;文彦\u0026#34;, \u0026#34;文曜\u0026#34;, \u0026#34;文耀\u0026#34;, \u0026#34;文斌\u0026#34;, \u0026#34;文彬\u0026#34;, \u0026#34;文滨\u0026#34;, \u0026#34;向晨\u0026#34;, \u0026#34;向笛\u0026#34;, \u0026#34;向文\u0026#34;, \u0026#34;向明\u0026#34;, \u0026#34;向荣\u0026#34;, \u0026#34;向阳\u0026#34;, \u0026#34;翔宇\u0026#34;, \u0026#34;翔飞\u0026#34;, \u0026#34;项禹\u0026#34;, \u0026#34;项明\u0026#34;, \u0026#34;晓博\u0026#34;, \u0026#34;心水\u0026#34;, \u0026#34;心思\u0026#34;, \u0026#34;心远\u0026#34;, \u0026#34;欣德\u0026#34;, \u0026#34;欣嘉\u0026#34;, \u0026#34;欣可\u0026#34;, \u0026#34;欣然\u0026#34;, \u0026#34;欣荣\u0026#34;, \u0026#34;欣怡\u0026#34;, \u0026#34;欣怿\u0026#34;, \u0026#34;欣悦\u0026#34;, \u0026#34;新翰\u0026#34;, \u0026#34;新霁\u0026#34;, \u0026#34;新觉\u0026#34;, \u0026#34;新立\u0026#34;, \u0026#34;新荣\u0026#34;, \u0026#34;新知\u0026#34;, \u0026#34;信鸿\u0026#34;, \u0026#34;信厚\u0026#34;, \u0026#34;信鸥\u0026#34;, \u0026#34;信然\u0026#34;, \u0026#34;信瑞\u0026#34;, \u0026#34;兴安\u0026#34;, \u0026#34;兴邦\u0026#34;, \u0026#34;兴昌\u0026#34;, \u0026#34;兴朝\u0026#34;, \u0026#34;兴德\u0026#34;, \u0026#34;兴发\u0026#34;, \u0026#34;兴国\u0026#34;, \u0026#34;兴怀\u0026#34;, \u0026#34;兴平\u0026#34;, \u0026#34;兴庆\u0026#34;, \u0026#34;兴生\u0026#34;, \u0026#34;兴思\u0026#34;, \u0026#34;兴腾\u0026#34;, \u0026#34;兴旺\u0026#34;, \u0026#34;兴为\u0026#34;, \u0026#34;兴文\u0026#34;, \u0026#34;兴贤\u0026#34;, \u0026#34;兴修\u0026#34;, \u0026#34;兴学\u0026#34;, \u0026#34;兴言\u0026#34;, \u0026#34;兴业\u0026#34;, \u0026#34;兴运\u0026#34;, \u0026#34;星波\u0026#34;, \u0026#34;星辰\u0026#34;, \u0026#34;星驰\u0026#34;, \u0026#34;星光\u0026#34;, \u0026#34;星海\u0026#34;, \u0026#34;星汉\u0026#34;, \u0026#34;星河\u0026#34;, \u0026#34;星华\u0026#34;, \u0026#34;星晖\u0026#34;, \u0026#34;星火\u0026#34;, \u0026#34;星剑\u0026#34;, \u0026#34;星津\u0026#34;, \u0026#34;星阑\u0026#34;, \u0026#34;星纬\u0026#34;, \u0026#34;星文\u0026#34;, \u0026#34;星宇\u0026#34;, \u0026#34;星雨\u0026#34;, \u0026#34;星渊\u0026#34;, \u0026#34;星洲\u0026#34;, \u0026#34;修诚\u0026#34;, \u0026#34;修德\u0026#34;, \u0026#34;修杰\u0026#34;, \u0026#34;修洁\u0026#34;, \u0026#34;修谨\u0026#34;, \u0026#34;修筠\u0026#34;, \u0026#34;修明\u0026#34;, \u0026#34;修能\u0026#34;, \u0026#34;修平\u0026#34;, \u0026#34;修齐\u0026#34;, \u0026#34;修然\u0026#34;, \u0026#34;修为\u0026#34;, \u0026#34;修伟\u0026#34;, \u0026#34;修文\u0026#34;, \u0026#34;修雅\u0026#34;, \u0026#34;修永\u0026#34;, \u0026#34;修远\u0026#34;, \u0026#34;修真\u0026#34;, \u0026#34;修竹\u0026#34;, \u0026#34;修贤\u0026#34;, \u0026#34;旭尧\u0026#34;, \u0026#34;炫明\u0026#34;, \u0026#34;学博\u0026#34;, \u0026#34;学海\u0026#34;, \u0026#34;学林\u0026#34;, \u0026#34;学民\u0026#34;, \u0026#34;学名\u0026#34;, \u0026#34;学文\u0026#34;, \u0026#34;学义\u0026#34;, \u0026#34;学真\u0026#34;, \u0026#34;雪松\u0026#34;, \u0026#34;雪峰\u0026#34;, \u0026#34;雪风\u0026#34;, \u0026#34;雅昶\u0026#34;, \u0026#34;雅畅\u0026#34;, \u0026#34;雅达\u0026#34;, \u0026#34;雅惠\u0026#34;, \u0026#34;雅健\u0026#34;, \u0026#34;雅珺\u0026#34;, \u0026#34;雅逸\u0026#34;, \u0026#34;雅懿\u0026#34;, \u0026#34;雅志\u0026#34;, \u0026#34;炎彬\u0026#34;, \u0026#34;阳飙\u0026#34;, \u0026#34;阳飇\u0026#34;, \u0026#34;阳冰\u0026#34;, \u0026#34;阳波\u0026#34;, \u0026#34;阳伯\u0026#34;, \u0026#34;阳成\u0026#34;, \u0026#34;阳德\u0026#34;, \u0026#34;阳华\u0026#34;, \u0026#34;阳晖\u0026#34;, \u0026#34;阳辉\u0026#34;, \u0026#34;阳嘉\u0026#34;, \u0026#34;阳平\u0026#34;, \u0026#34;阳秋\u0026#34;, \u0026#34;阳荣\u0026#34;, \u0026#34;阳舒\u0026#34;, \u0026#34;阳朔\u0026#34;, \u0026#34;阳文\u0026#34;, \u0026#34;阳曦\u0026#34;, \u0026#34;阳夏\u0026#34;, \u0026#34;阳旭\u0026#34;, \u0026#34;阳煦\u0026#34;, \u0026#34;阳炎\u0026#34;, \u0026#34;阳焱\u0026#34;, \u0026#34;阳曜\u0026#34;, \u0026#34;阳羽\u0026#34;, \u0026#34;阳云\u0026#34;, \u0026#34;阳泽\u0026#34;, \u0026#34;阳州\u0026#34;, \u0026#34;烨赫\u0026#34;, \u0026#34;烨华\u0026#34;, \u0026#34;烨磊\u0026#34;, \u0026#34;烨霖\u0026#34;, \u0026#34;烨然\u0026#34;, \u0026#34;烨烁\u0026#34;, \u0026#34;烨伟\u0026#34;, \u0026#34;烨烨\u0026#34;, \u0026#34;烨熠\u0026#34;, \u0026#34;烨煜\u0026#34;, \u0026#34;毅然\u0026#34;, \u0026#34;逸仙\u0026#34;, \u0026#34;逸明\u0026#34;, \u0026#34;逸春\u0026#34;, \u0026#34;宜春\u0026#34;, \u0026#34;宜民\u0026#34;, \u0026#34;宜年\u0026#34;, \u0026#34;宜然\u0026#34;, \u0026#34;宜人\u0026#34;, \u0026#34;宜修\u0026#34;, \u0026#34;意远\u0026#34;, \u0026#34;意蕴\u0026#34;, \u0026#34;意致\u0026#34;, \u0026#34;意智\u0026#34;, \u0026#34;熠彤\u0026#34;, \u0026#34;懿轩\u0026#34;, \u0026#34;英飙\u0026#34;, \u0026#34;英博\u0026#34;, \u0026#34;英才\u0026#34;, \u0026#34;英达\u0026#34;, \u0026#34;英发\u0026#34;, \u0026#34;英范\u0026#34;, \u0026#34;英光\u0026#34;, \u0026#34;英豪\u0026#34;, \u0026#34;英华\u0026#34;, \u0026#34;英杰\u0026#34;, \u0026#34;英朗\u0026#34;, \u0026#34;英锐\u0026#34;, \u0026#34;英睿\u0026#34;, \u0026#34;英叡\u0026#34;, \u0026#34;英韶\u0026#34;, \u0026#34;英卫\u0026#34;, \u0026#34;英武\u0026#34;, \u0026#34;英悟\u0026#34;, \u0026#34;英勋\u0026#34;, \u0026#34;英彦\u0026#34;, \u0026#34;英耀\u0026#34;, \u0026#34;英奕\u0026#34;, \u0026#34;英逸\u0026#34;, \u0026#34;英毅\u0026#34;, \u0026#34;英哲\u0026#34;, \u0026#34;英喆\u0026#34;, \u0026#34;英卓\u0026#34;, \u0026#34;英资\u0026#34;, \u0026#34;英纵\u0026#34;, \u0026#34;永怡\u0026#34;, \u0026#34;永春\u0026#34;, \u0026#34;永安\u0026#34;, \u0026#34;永昌\u0026#34;, \u0026#34;永长\u0026#34;, \u0026#34;永丰\u0026#34;, \u0026#34;永福\u0026#34;, \u0026#34;永嘉\u0026#34;, \u0026#34;永康\u0026#34;, \u0026#34;永年\u0026#34;, \u0026#34;永宁\u0026#34;, \u0026#34;永寿\u0026#34;, \u0026#34;永思\u0026#34;, \u0026#34;永望\u0026#34;, \u0026#34;永新\u0026#34;, \u0026#34;永言\u0026#34;, \u0026#34;永逸\u0026#34;, \u0026#34;永元\u0026#34;, \u0026#34;永贞\u0026#34;, \u0026#34;咏德\u0026#34;, \u0026#34;咏歌\u0026#34;, \u0026#34;咏思\u0026#34;, \u0026#34;咏志\u0026#34;, \u0026#34;勇男\u0026#34;, \u0026#34;勇军\u0026#34;, \u0026#34;勇捷\u0026#34;, \u0026#34;勇锐\u0026#34;, \u0026#34;勇毅\u0026#34;, \u0026#34;宇达\u0026#34;, \u0026#34;宇航\u0026#34;, \u0026#34;宇寰\u0026#34;, \u0026#34;宇文\u0026#34;, \u0026#34;宇荫\u0026#34;, \u0026#34;雨伯\u0026#34;, \u0026#34;雨华\u0026#34;, \u0026#34;雨石\u0026#34;, \u0026#34;雨信\u0026#34;, \u0026#34;雨星\u0026#34;, \u0026#34;雨泽\u0026#34;, \u0026#34;玉宸\u0026#34;, \u0026#34;玉成\u0026#34;, \u0026#34;玉龙\u0026#34;, \u0026#34;玉泉\u0026#34;, \u0026#34;玉山\u0026#34;, \u0026#34;玉石\u0026#34;, \u0026#34;玉书\u0026#34;, \u0026#34;玉树\u0026#34;, \u0026#34;玉堂\u0026#34;, \u0026#34;玉轩\u0026#34;, \u0026#34;玉宇\u0026#34;, \u0026#34;玉韵\u0026#34;, \u0026#34;玉泽\u0026#34;, \u0026#34;煜祺\u0026#34;, \u0026#34;元白\u0026#34;, \u0026#34;元德\u0026#34;, \u0026#34;元化\u0026#34;, \u0026#34;元基\u0026#34;, \u0026#34;元嘉\u0026#34;, \u0026#34;元甲\u0026#34;, \u0026#34;元驹\u0026#34;, \u0026#34;元凯\u0026#34;, \u0026#34;元恺\u0026#34;, \u0026#34;元魁\u0026#34;, \u0026#34;元良\u0026#34;, \u0026#34;元亮\u0026#34;, \u0026#34;元龙\u0026#34;, \u0026#34;元明\u0026#34;, \u0026#34;元青\u0026#34;, \u0026#34;元思\u0026#34;, \u0026#34;元纬\u0026#34;, \u0026#34;元武\u0026#34;, \u0026#34;元勋\u0026#34;, \u0026#34;元正\u0026#34;, \u0026#34;元忠\u0026#34;, \u0026#34;元洲\u0026#34;, \u0026#34;远航\u0026#34;, \u0026#34;苑博\u0026#34;, \u0026#34;苑杰\u0026#34;, \u0026#34;越彬\u0026#34;, \u0026#34;蕴涵\u0026#34;, \u0026#34;蕴和\u0026#34;, \u0026#34;蕴藉\u0026#34;, \u0026#34;展鹏\u0026#34;, \u0026#34;哲瀚\u0026#34;, \u0026#34;哲茂\u0026#34;, \u0026#34;哲圣\u0026#34;, \u0026#34;哲彦\u0026#34;, \u0026#34;振海\u0026#34;, \u0026#34;振国\u0026#34;, \u0026#34;正诚\u0026#34;, \u0026#34;正初\u0026#34;, \u0026#34;正德\u0026#34;, \u0026#34;正浩\u0026#34;, \u0026#34;正豪\u0026#34;, \u0026#34;正平\u0026#34;, \u0026#34;正奇\u0026#34;, \u0026#34;正青\u0026#34;, \u0026#34;正卿\u0026#34;, \u0026#34;正文\u0026#34;, \u0026#34;正祥\u0026#34;, \u0026#34;正信\u0026#34;, \u0026#34;正雅\u0026#34;, \u0026#34;正阳\u0026#34;, \u0026#34;正业\u0026#34;, \u0026#34;正谊\u0026#34;, \u0026#34;正真\u0026#34;, \u0026#34;正志\u0026#34;, \u0026#34;志诚\u0026#34;, \u0026#34;志新\u0026#34;, \u0026#34;志勇\u0026#34;, \u0026#34;志明\u0026#34;, \u0026#34;志国\u0026#34;, \u0026#34;志强\u0026#34;, \u0026#34;志尚\u0026#34;, \u0026#34;志专\u0026#34;, \u0026#34;志文\u0026#34;, \u0026#34;志行\u0026#34;, \u0026#34;志学\u0026#34;, \u0026#34;志业\u0026#34;, \u0026#34;志义\u0026#34;, \u0026#34;志用\u0026#34;, \u0026#34;志泽\u0026#34;, \u0026#34;致远\u0026#34;, \u0026#34;智明\u0026#34;, \u0026#34;智鑫\u0026#34;, \u0026#34;智勇\u0026#34;, \u0026#34;智敏\u0026#34;, \u0026#34;智志\u0026#34;, \u0026#34;智渊\u0026#34;, \u0026#34;子安\u0026#34;, \u0026#34;子晋\u0026#34;, \u0026#34;子民\u0026#34;, \u0026#34;子明\u0026#34;, \u0026#34;子默\u0026#34;, \u0026#34;子墨\u0026#34;, \u0026#34;子平\u0026#34;, \u0026#34;子琪\u0026#34;, \u0026#34;子石\u0026#34;, \u0026#34;子实\u0026#34;, \u0026#34;子真\u0026#34;, \u0026#34;子濯\u0026#34;, \u0026#34;子昂\u0026#34;, \u0026#34;子轩\u0026#34;, \u0026#34;子瑜\u0026#34;, \u0026#34;自明\u0026#34;, \u0026#34;自强\u0026#34;, \u0026#34;作人\u0026#34;, \u0026#34;自怡\u0026#34;, \u0026#34;自珍\u0026#34;, \u0026#34;曾琪\u0026#34;, \u0026#34;泽宇\u0026#34;, \u0026#34;泽语\u0026#34; }; //省市地址 private static final String[] road = { \u0026#34;广东省广州市\u0026#34;, \u0026#34;广东省深圳市\u0026#34;, \u0026#34;广东省汕头市\u0026#34;, \u0026#34;广东省湛江市\u0026#34;, \u0026#34;广东省韶关市\u0026#34;, \u0026#34;广东省珠海市\u0026#34;, \u0026#34;广东省佛山市\u0026#34;, \u0026#34;广东省江门市\u0026#34;, \u0026#34;广东省茂名市\u0026#34;, \u0026#34;广东省肇庆市\u0026#34;, \u0026#34;广东省惠州市\u0026#34;, \u0026#34;广东省梅州市\u0026#34;, \u0026#34;广东省阳江市\u0026#34;, \u0026#34;广东省东莞市\u0026#34;, \u0026#34;广东省中山市\u0026#34;, \u0026#34;广东省潮州市\u0026#34;, \u0026#34;广东省汕尾市\u0026#34;, \u0026#34;广东省河源市\u0026#34;, \u0026#34;广东省清远市\u0026#34;, \u0026#34;广东省揭阳市\u0026#34;, \u0026#34;广东省云浮市\u0026#34;, \u0026#34;广东省番禺市\u0026#34;, \u0026#34;广东省花都市\u0026#34;, \u0026#34;广东省增城市\u0026#34;, \u0026#34;广东省从化市\u0026#34;, \u0026#34;广东省乐昌市\u0026#34;, \u0026#34;广东省南雄市\u0026#34;, \u0026#34;广东省潮阳市\u0026#34;, \u0026#34;广东省澄海市\u0026#34;, \u0026#34;广东省顺德市\u0026#34;, \u0026#34;广东省南海市\u0026#34;, \u0026#34;广东省三水市\u0026#34;, \u0026#34;广东省高明市\u0026#34;, \u0026#34;广东省台山市\u0026#34;, \u0026#34;广东省新会市\u0026#34;, \u0026#34;广东省开平市\u0026#34;, \u0026#34;广东省鹤山市\u0026#34;, \u0026#34;广东省恩平市\u0026#34;, \u0026#34;广东省廉江市\u0026#34;, \u0026#34;广东省雷州市\u0026#34;, \u0026#34;广东省吴川市\u0026#34;, \u0026#34;广东省高州市\u0026#34;, \u0026#34;广东省化州市\u0026#34;, \u0026#34;广东省信宜市\u0026#34;, \u0026#34;广东省高要市\u0026#34;, \u0026#34;广东省四会市\u0026#34;, \u0026#34;广东省惠阳市\u0026#34;, \u0026#34;广东省兴宁市\u0026#34;, \u0026#34;广东省陆丰市\u0026#34;, \u0026#34;广东省阳春市\u0026#34;, \u0026#34;广东省英德市\u0026#34;, \u0026#34;广东省连州市\u0026#34;, \u0026#34;广东省普宁市\u0026#34;, \u0026#34;广东省罗定市\u0026#34;, \u0026#34;陕西省西安市\u0026#34;, \u0026#34;陕西省铜川市\u0026#34;, \u0026#34;陕西省宝鸡市\u0026#34;, \u0026#34;陕西省咸阳市\u0026#34;, \u0026#34;陕西省汉中市\u0026#34;, \u0026#34;陕西省渭南市\u0026#34;, \u0026#34;陕西省延安市\u0026#34;, \u0026#34;陕西省榆林市\u0026#34;, \u0026#34;陕西省兴平市\u0026#34;, \u0026#34;陕西省韩城市\u0026#34;, \u0026#34;陕西省华阴市\u0026#34;, \u0026#34;陕西省安康市\u0026#34;, \u0026#34;陕西省商州市\u0026#34;, \u0026#34;河南省郑州市\u0026#34;, \u0026#34;河南省开封市\u0026#34;, \u0026#34;河南省洛阳市\u0026#34;, \u0026#34;河南省平顶山市\u0026#34;, \u0026#34;河南省安阳市\u0026#34;, \u0026#34;河南省新乡市\u0026#34;, \u0026#34;河南省焦作市\u0026#34;, \u0026#34;河南省鹤壁市\u0026#34;, \u0026#34;河南省濮阳市\u0026#34;, \u0026#34;河南省许昌市\u0026#34;, \u0026#34;河南省漯河市\u0026#34;, \u0026#34;河南省南阳市\u0026#34;, \u0026#34;河南省商丘市\u0026#34;, \u0026#34;河南省三门峡市\u0026#34;, \u0026#34;河南省信阳市\u0026#34;, \u0026#34;河南省巩义市\u0026#34;, \u0026#34;河南省荥阳市\u0026#34;, \u0026#34;河南省新密市\u0026#34;, \u0026#34;河南省新郑市\u0026#34;, \u0026#34;河南省登封市\u0026#34;, \u0026#34;河南省偃师市\u0026#34;, \u0026#34;河南省舞钢市\u0026#34;, \u0026#34;河南省汝州市\u0026#34;, \u0026#34;河南省林州市\u0026#34;, \u0026#34;河南省卫辉市\u0026#34;, \u0026#34;河南省辉县市\u0026#34;, \u0026#34;河南省济源市\u0026#34;, \u0026#34;河南省沁阳市\u0026#34;, \u0026#34;河南省孟州市\u0026#34;, \u0026#34;河南省禹州市\u0026#34;, \u0026#34;河南省长葛市\u0026#34;, \u0026#34;河南省义马市\u0026#34;, \u0026#34;河南省灵宝市\u0026#34;, \u0026#34;河南省邓州市\u0026#34;, \u0026#34;河南省永城市\u0026#34;, \u0026#34;河南省周口市\u0026#34;, \u0026#34;河南省项城市\u0026#34;, \u0026#34;河南省驻马店市\u0026#34;, \u0026#34;江西省南昌市\u0026#34;, \u0026#34;江西省景德镇市\u0026#34;, \u0026#34;江西省萍乡市\u0026#34;, \u0026#34;江西省九江市\u0026#34;, \u0026#34;江西省新余市\u0026#34;, \u0026#34;江西省鹰潭市\u0026#34;, \u0026#34;江西省赣州市\u0026#34;, \u0026#34;江西省乐平市\u0026#34;, \u0026#34;江西省瑞昌市\u0026#34;, \u0026#34;江西省贵溪市\u0026#34;, \u0026#34;江西省瑞金市\u0026#34;, \u0026#34;江西省南康市\u0026#34;, \u0026#34;江西省宜春市\u0026#34;, \u0026#34;江西省丰城市\u0026#34;, \u0026#34;江西省樟树市\u0026#34;, \u0026#34;江西省高安市\u0026#34;, \u0026#34;江西省上饶市\u0026#34;, \u0026#34;江西省德兴市\u0026#34;, \u0026#34;江西省吉安市\u0026#34;, \u0026#34;江西省井冈山市\u0026#34;, \u0026#34;江西省临川市\u0026#34;, \u0026#34;海南省海口市\u0026#34;, \u0026#34;海南省三亚市\u0026#34;, \u0026#34;海南省通什市\u0026#34;, \u0026#34;海南省琼海市\u0026#34;, \u0026#34;海南省儋州市\u0026#34;, \u0026#34;海南省琼山市\u0026#34;, \u0026#34;海南省文昌市\u0026#34;, \u0026#34;海南省万宁市\u0026#34;, \u0026#34;海南省东方市\u0026#34;, \u0026#34;广西南宁市\u0026#34;, \u0026#34;广西柳州市\u0026#34;, \u0026#34;广西桂林市\u0026#34;, \u0026#34;广西梧州市\u0026#34;, \u0026#34;广西贵港市\u0026#34;, \u0026#34;广西北海市\u0026#34;, \u0026#34;广西防城港市\u0026#34;, \u0026#34;广西钦州市\u0026#34;, \u0026#34;广西玉林市\u0026#34;, \u0026#34;广西岑溪市\u0026#34;, \u0026#34;广西东兴市\u0026#34;, \u0026#34;广西桂平市\u0026#34;, \u0026#34;广西北流市\u0026#34;, \u0026#34;广西凭祥市\u0026#34;, \u0026#34;广西合山市\u0026#34;, \u0026#34;广西贺州市\u0026#34;, \u0026#34;广西百色市\u0026#34;, \u0026#34;广西河池市\u0026#34;, \u0026#34;广西宜州市\u0026#34;, \u0026#34;吉林省长春市\u0026#34;, \u0026#34;吉林省吉林市\u0026#34;, \u0026#34;吉林省四平市\u0026#34;, \u0026#34;吉林省辽源市\u0026#34;, \u0026#34;吉林省通化市\u0026#34;, \u0026#34;吉林省白山市\u0026#34;, \u0026#34;吉林省松原市\u0026#34;, \u0026#34;吉林省白城市\u0026#34;, \u0026#34;吉林省九台市\u0026#34;, \u0026#34;吉林省榆树市\u0026#34;, \u0026#34;吉林省德惠市\u0026#34;, \u0026#34;吉林省蛟河市\u0026#34;, \u0026#34;吉林省桦甸市\u0026#34;, \u0026#34;吉林省舒兰市\u0026#34;, \u0026#34;吉林省磐石市\u0026#34;, \u0026#34;吉林省公主岭市\u0026#34;, \u0026#34;吉林省双辽市\u0026#34;, \u0026#34;吉林省梅河口市\u0026#34;, \u0026#34;吉林省集安市\u0026#34;, \u0026#34;吉林省临江市\u0026#34;, \u0026#34;吉林省洮南市\u0026#34;, \u0026#34;吉林省大安市\u0026#34;, \u0026#34;吉林省延吉市\u0026#34;, \u0026#34;吉林省图们市\u0026#34;, \u0026#34;吉林省敦化市\u0026#34;, \u0026#34;吉林省珲春市\u0026#34;, \u0026#34;吉林省龙井市\u0026#34;, \u0026#34;吉林省和龙市\u0026#34;, \u0026#34;上海市\u0026#34;, \u0026#34;北京市\u0026#34;, \u0026#34;新疆乌鲁木齐市\u0026#34;, \u0026#34;新疆克拉玛依市\u0026#34;, \u0026#34;新疆吐鲁番市\u0026#34;, \u0026#34;新疆哈密市\u0026#34;, \u0026#34;新疆昌吉市\u0026#34;, \u0026#34;新疆阜康市\u0026#34;, \u0026#34;新疆米泉市\u0026#34;, \u0026#34;新疆博乐市\u0026#34;, \u0026#34;新疆库尔勒市\u0026#34;, \u0026#34;新疆阿克苏市\u0026#34;, \u0026#34;新疆阿图什市\u0026#34;, \u0026#34;新疆喀什市\u0026#34;, \u0026#34;新疆和田市\u0026#34;, \u0026#34;新疆奎屯市\u0026#34;, \u0026#34;新疆伊宁市\u0026#34;, \u0026#34;新疆塔城市\u0026#34;, \u0026#34;新疆乌苏市\u0026#34;, \u0026#34;新疆阿勒泰市\u0026#34;, \u0026#34;吉林省长春市\u0026#34;, \u0026#34;吉林省吉林市\u0026#34;, \u0026#34;吉林省四平市\u0026#34;, \u0026#34;吉林省辽源市\u0026#34;, \u0026#34;吉林省通化市\u0026#34;, \u0026#34;吉林省白山市\u0026#34;, \u0026#34;吉林省松原市\u0026#34;, \u0026#34;吉林省白城市\u0026#34;, \u0026#34;吉林省九台市\u0026#34;, \u0026#34;吉林省榆树市\u0026#34;, \u0026#34;吉林省德惠市\u0026#34;, \u0026#34;吉林省蛟河市\u0026#34;, \u0026#34;吉林省桦甸市\u0026#34;, \u0026#34;吉林省舒兰市\u0026#34;, \u0026#34;吉林省磐石市\u0026#34;, \u0026#34;吉林省公主岭市\u0026#34;, \u0026#34;吉林省双辽市\u0026#34;, \u0026#34;吉林省梅河口市\u0026#34;, \u0026#34;吉林省集安市\u0026#34;, \u0026#34;吉林省临江市\u0026#34;, \u0026#34;吉林省洮南市\u0026#34;, \u0026#34;吉林省大安市\u0026#34;, \u0026#34;吉林省延吉市\u0026#34;, \u0026#34;吉林省图们市\u0026#34;, \u0026#34;吉林省敦化市\u0026#34;, \u0026#34;吉林省珲春市\u0026#34;, \u0026#34;吉林省龙井市\u0026#34;, \u0026#34;吉林省和龙市\u0026#34;, \u0026#34;宁夏银川市\u0026#34;, \u0026#34;宁夏石嘴山市\u0026#34;, \u0026#34;宁夏吴忠市\u0026#34;, \u0026#34;宁夏青铜峡市\u0026#34;, \u0026#34;宁夏灵武市\u0026#34;, \u0026#34;安徽省合肥市\u0026#34;, \u0026#34;安徽省淮南市\u0026#34;, \u0026#34;安徽省淮北市\u0026#34;, \u0026#34;安徽省芜湖市\u0026#34;, \u0026#34;安徽省蚌埠市\u0026#34;, \u0026#34;安徽省马鞍山市\u0026#34;, \u0026#34;安徽省铜陵市\u0026#34;, \u0026#34;安徽省安庆市\u0026#34;, \u0026#34;安徽省阜阳市\u0026#34;, \u0026#34;安徽省黄山市\u0026#34;, \u0026#34;安徽省滁州市\u0026#34;, \u0026#34;安徽省宿州市\u0026#34;, \u0026#34;安徽省巢湖市\u0026#34;, \u0026#34;安徽省六安市\u0026#34;, \u0026#34;安徽省桐城市\u0026#34;, \u0026#34;安徽省天长市\u0026#34;, \u0026#34;安徽省明光市\u0026#34;, \u0026#34;安徽省亳州市\u0026#34;, \u0026#34;安徽省界首市\u0026#34;, \u0026#34;安徽省宣州市\u0026#34;, \u0026#34;安徽省宁国市\u0026#34;, \u0026#34;安徽省贵池市\u0026#34;, \u0026#34;河北省石家庄市\u0026#34;, \u0026#34;河北省唐山市\u0026#34;, \u0026#34;河北省邯郸市\u0026#34;, \u0026#34;河北省保定市\u0026#34;, \u0026#34;河北省张家口市\u0026#34;, \u0026#34;河北省秦皇岛市\u0026#34;, \u0026#34;河北省邢台市\u0026#34;, \u0026#34;河北省承德市\u0026#34;, \u0026#34;河北省沧州市\u0026#34;, \u0026#34;河北省廊坊市\u0026#34;, \u0026#34;河北省衡水市\u0026#34;, \u0026#34;河北省辛集市\u0026#34;, \u0026#34;河北省藁城市\u0026#34;, \u0026#34;河北省晋州市\u0026#34;, \u0026#34;河北省新乐市\u0026#34;, \u0026#34;河北省鹿泉市\u0026#34;, \u0026#34;河北省遵化市\u0026#34;, \u0026#34;河北省丰南市\u0026#34;, \u0026#34;河北省迁安市\u0026#34;, \u0026#34;河北省武安市\u0026#34;, \u0026#34;河北省南宫市\u0026#34;, \u0026#34;河北省沙河市\u0026#34;, \u0026#34;河北省涿州市\u0026#34;, \u0026#34;河北省定州市\u0026#34;, \u0026#34;河北省安国市\u0026#34;, \u0026#34;河北省高碑店市\u0026#34;, \u0026#34;河北省泊头市\u0026#34;, \u0026#34;河北省任丘市\u0026#34;, \u0026#34;河北省黄骅市\u0026#34;, \u0026#34;河北省河间市\u0026#34;, \u0026#34;河北省霸州市\u0026#34;, \u0026#34;河北省三河市\u0026#34;, \u0026#34;河北省冀州市\u0026#34;, \u0026#34;河北省深州市\u0026#34;, \u0026#34;甘肃省兰州市\u0026#34;, \u0026#34;甘肃省白银市\u0026#34;, \u0026#34;甘肃省天水市\u0026#34;, \u0026#34;甘肃省嘉峪关市\u0026#34;, \u0026#34;甘肃省金昌市\u0026#34;, \u0026#34;甘肃省玉门市\u0026#34;, \u0026#34;甘肃省酒泉市\u0026#34;, \u0026#34;甘肃省敦煌市\u0026#34;, \u0026#34;甘肃省张掖市\u0026#34;, \u0026#34;甘肃省武威市\u0026#34;, \u0026#34;甘肃省平凉市\u0026#34;, \u0026#34;甘肃省西峰市\u0026#34;, \u0026#34;甘肃省临夏市\u0026#34;, \u0026#34;甘肃省合作市\u0026#34;, \u0026#34;山西省太原市\u0026#34;, \u0026#34;山西省大同市\u0026#34;, \u0026#34;山西省阳泉市\u0026#34;, \u0026#34;山西省长治市\u0026#34;, \u0026#34;山西省晋城市\u0026#34;, \u0026#34;山西省朔州市\u0026#34;, \u0026#34;山西省古交市\u0026#34;, \u0026#34;山西省潞城市\u0026#34;, \u0026#34;山西省高平市\u0026#34;, \u0026#34;山西省忻州市\u0026#34;, \u0026#34;山西省原平市\u0026#34;, \u0026#34;山西省孝义市\u0026#34;, \u0026#34;山西省离石市\u0026#34;, \u0026#34;山西省汾阳市\u0026#34;, \u0026#34;山西省榆次市\u0026#34;, \u0026#34;山西省介休市\u0026#34;, \u0026#34;山西省临汾市\u0026#34;, \u0026#34;山西省侯马市\u0026#34;, \u0026#34;山西省霍州市\u0026#34;, \u0026#34;山西省运城市\u0026#34;, \u0026#34;山西省永济市\u0026#34;, \u0026#34;山西省河津市\u0026#34;, \u0026#34;江苏省南京市\u0026#34;, \u0026#34;江苏省徐州市\u0026#34;, \u0026#34;江苏省无锡市\u0026#34;, \u0026#34;江苏省常州市\u0026#34;, \u0026#34;江苏省苏州市\u0026#34;, \u0026#34;江苏省南通市\u0026#34;, \u0026#34;江苏省连云港市\u0026#34;, \u0026#34;江苏省淮阴市\u0026#34;, \u0026#34;江苏省盐城市\u0026#34;, \u0026#34;江苏省扬州市\u0026#34;, \u0026#34;江苏省镇江市\u0026#34;, \u0026#34;江苏省泰州市\u0026#34;, \u0026#34;江苏省宿迁市\u0026#34;, \u0026#34;江苏省江阴市\u0026#34;, \u0026#34;江苏省宜兴市\u0026#34;, \u0026#34;江苏省锡山市\u0026#34;, \u0026#34;江苏省新沂市\u0026#34;, \u0026#34;江苏省邳州市\u0026#34;, \u0026#34;江苏省溧阳市\u0026#34;, \u0026#34;江苏省金坛市\u0026#34;, \u0026#34;江苏省武进市\u0026#34;, \u0026#34;江苏省常熟市\u0026#34;, \u0026#34;江苏省张家港市\u0026#34;, \u0026#34;江苏省昆山市\u0026#34;, \u0026#34;江苏省吴江市\u0026#34;, \u0026#34;江苏省太仓市\u0026#34;, \u0026#34;江苏省吴县市\u0026#34;, \u0026#34;江苏省启东市\u0026#34;, \u0026#34;江苏省如皋市\u0026#34;, \u0026#34;江苏省通州市\u0026#34;, \u0026#34;江苏省海门市\u0026#34;, \u0026#34;江苏省淮安市\u0026#34;, \u0026#34;江苏省东台市\u0026#34;, \u0026#34;江苏省大丰市\u0026#34;, \u0026#34;江苏省仪征市\u0026#34;, \u0026#34;江苏省高邮市\u0026#34;, \u0026#34;江苏省江都市\u0026#34;, \u0026#34;江苏省丹阳市\u0026#34;, \u0026#34;江苏省扬中市\u0026#34;, \u0026#34;江苏省句容市\u0026#34;, \u0026#34;江苏省兴化市\u0026#34;, \u0026#34;江苏省靖江市\u0026#34;, \u0026#34;江苏省泰兴市\u0026#34;, \u0026#34;江苏省姜堰市\u0026#34;, \u0026#34;四川省成都市\u0026#34;, \u0026#34;四川省自贡市\u0026#34;, \u0026#34;四川省攀枝花市\u0026#34;, \u0026#34;四川省泸州市\u0026#34;, \u0026#34;四川省德阳市\u0026#34;, \u0026#34;四川省绵阳市\u0026#34;, \u0026#34;四川省广元市\u0026#34;, \u0026#34;四川省遂宁市\u0026#34;, \u0026#34;四川省内江市\u0026#34;, \u0026#34;四川省乐山市\u0026#34;, \u0026#34;四川省南充市\u0026#34;, \u0026#34;四川省宜宾市\u0026#34;, \u0026#34;四川省达州市\u0026#34;, \u0026#34;四川省都江堰市\u0026#34;, \u0026#34;四川省彭州市\u0026#34;, \u0026#34;四川省邛崃市\u0026#34;, \u0026#34;四川省崇州市\u0026#34;, \u0026#34;四川省广汉市\u0026#34;, \u0026#34;四川省什邡市\u0026#34;, \u0026#34;四川省绵竹市\u0026#34;, \u0026#34;四川省江油市\u0026#34;, \u0026#34;四川省峨眉山市\u0026#34;, \u0026#34;四川省阆中市\u0026#34;, \u0026#34;四川省华蓥市\u0026#34;, \u0026#34;四川省万源市\u0026#34;, \u0026#34;四川省雅安市\u0026#34;, \u0026#34;四川省西昌市\u0026#34;, \u0026#34;四川省巴中市\u0026#34;, \u0026#34;四川省资阳市\u0026#34;, \u0026#34;四川省简阳市\u0026#34;, \u0026#34;四川省广安市\u0026#34;, \u0026#34;福建省福州市\u0026#34;, \u0026#34;福建省厦门市\u0026#34;, \u0026#34;福建省泉州市\u0026#34;, \u0026#34;福建省漳州市\u0026#34;, \u0026#34;福建省南平市\u0026#34;, \u0026#34;福建省龙岩市\u0026#34;, \u0026#34;福建省莆田市\u0026#34;, \u0026#34;福建省三明市\u0026#34;, \u0026#34;福建省福清市\u0026#34;, \u0026#34;福建省长乐市\u0026#34;, \u0026#34;福建省永安市\u0026#34;, \u0026#34;福建省石狮市\u0026#34;, \u0026#34;福建省晋江市\u0026#34;, \u0026#34;福建省南安市\u0026#34;, \u0026#34;福建省龙海市\u0026#34;, \u0026#34;福建省邵武市\u0026#34;, \u0026#34;福建省武夷山市\u0026#34;, \u0026#34;福建省建瓯市\u0026#34;, \u0026#34;福建省建阳市\u0026#34;, \u0026#34;福建省漳平市\u0026#34;, \u0026#34;福建省宁德市\u0026#34;, \u0026#34;福建省福安市\u0026#34;, \u0026#34;福建省福鼎市\u0026#34;, \u0026#34;内蒙包头市\u0026#34;, \u0026#34;内蒙呼和浩特市\u0026#34;, \u0026#34;内蒙乌海市\u0026#34;, \u0026#34;内蒙赤峰市\u0026#34;, \u0026#34;内蒙通辽市\u0026#34;, \u0026#34;内蒙霍林郭勒市\u0026#34;, \u0026#34;内蒙海拉尔市\u0026#34;, \u0026#34;内蒙满洲里市\u0026#34;, \u0026#34;内蒙扎兰屯市\u0026#34;, \u0026#34;内蒙牙克石市\u0026#34;, \u0026#34;内蒙根河市\u0026#34;, \u0026#34;内蒙额尔古纳市\u0026#34;, \u0026#34;内蒙乌兰浩特市\u0026#34;, \u0026#34;内蒙二连浩特市\u0026#34;, \u0026#34;内蒙锡林浩特市\u0026#34;, \u0026#34;内蒙集宁市\u0026#34;, \u0026#34;内蒙丰镇市\u0026#34;, \u0026#34;内蒙东胜市\u0026#34;, \u0026#34;内蒙临河市\u0026#34;, \u0026#34;湖南省长沙市\u0026#34;, \u0026#34;湖南省株洲市\u0026#34;, \u0026#34;湖南省湘潭市\u0026#34;, \u0026#34;湖南省衡阳市\u0026#34;, \u0026#34;湖南省邵阳市\u0026#34;, \u0026#34;湖南省岳阳市\u0026#34;, \u0026#34;湖南省常德市\u0026#34;, \u0026#34;湖南省益阳市\u0026#34;, \u0026#34;湖南省郴州市\u0026#34;, \u0026#34;湖南省永州市\u0026#34;, \u0026#34;湖南省怀化市\u0026#34;, \u0026#34;湖南省张家界市\u0026#34;, \u0026#34;湖南省娄底市\u0026#34;, \u0026#34;湖南省浏阳市\u0026#34;, \u0026#34;湖南省醴陵市\u0026#34;, \u0026#34;湖南省湘乡市\u0026#34;, \u0026#34;湖南省韶山市\u0026#34;, \u0026#34;湖南省耒阳市\u0026#34;, \u0026#34;湖南省常宁市\u0026#34;, \u0026#34;湖南省武冈市\u0026#34;, \u0026#34;湖南省汩罗市\u0026#34;, \u0026#34;湖南省临湘市\u0026#34;, \u0026#34;湖南省津市\u0026#34;, \u0026#34;湖南省沅江市\u0026#34;, \u0026#34;湖南省资兴市\u0026#34;, \u0026#34;湖南省洪江市\u0026#34;, \u0026#34;湖南省冷水江市\u0026#34;, \u0026#34;湖南省涟源市\u0026#34;, \u0026#34;湖南省吉首市\u0026#34;, \u0026#34;贵州省贵阳市\u0026#34;, \u0026#34;贵州省六盘水市\u0026#34;, \u0026#34;贵州省遵义市\u0026#34;, \u0026#34;贵州省清镇市\u0026#34;, \u0026#34;贵州省赤水市\u0026#34;, \u0026#34;贵州省仁怀市\u0026#34;, \u0026#34;贵州省铜仁市\u0026#34;, \u0026#34;贵州省兴义市\u0026#34;, \u0026#34;贵州省毕节市\u0026#34;, \u0026#34;贵州省安顺市\u0026#34;, \u0026#34;贵州省凯里市\u0026#34;, \u0026#34;贵州省都匀市\u0026#34;, \u0026#34;贵州省福泉市\u0026#34;, \u0026#34;辽宁省沈阳市\u0026#34;, \u0026#34;辽宁省大连市\u0026#34;, \u0026#34;辽宁省鞍山市\u0026#34;, \u0026#34;辽宁省抚顺市\u0026#34;, \u0026#34;辽宁省本溪市\u0026#34;, \u0026#34;辽宁省丹东市\u0026#34;, \u0026#34;辽宁省锦州市\u0026#34;, \u0026#34;辽宁省阜新市\u0026#34;, \u0026#34;辽宁省辽阳市\u0026#34;, \u0026#34;辽宁省营口市\u0026#34;, \u0026#34;辽宁省盘锦市\u0026#34;, \u0026#34;辽宁省铁岭市\u0026#34;, \u0026#34;辽宁省朝阳市\u0026#34;, \u0026#34;辽宁省葫芦岛市\u0026#34;, \u0026#34;辽宁省新民市\u0026#34;, \u0026#34;辽宁省瓦房店市\u0026#34;, \u0026#34;辽宁省普兰店市\u0026#34;, \u0026#34;辽宁省庄河市\u0026#34;, \u0026#34;辽宁省海城市\u0026#34;, \u0026#34;辽宁省东港市\u0026#34;, \u0026#34;辽宁省凤城市\u0026#34;, \u0026#34;辽宁省凌海市\u0026#34;, \u0026#34;辽宁省北宁市\u0026#34;, \u0026#34;辽宁省盖州市\u0026#34;, \u0026#34;辽宁省大石桥市\u0026#34;, \u0026#34;辽宁省灯塔市\u0026#34;, \u0026#34;辽宁省铁法市\u0026#34;, \u0026#34;辽宁省开原市\u0026#34;, \u0026#34;辽宁省北票市\u0026#34;, \u0026#34;辽宁省凌源市\u0026#34;, \u0026#34;辽宁省兴城市\u0026#34;, \u0026#34;山东省济南市\u0026#34;, \u0026#34;山东省青岛市\u0026#34;, \u0026#34;山东省淄博市\u0026#34;, \u0026#34;山东省枣庄市\u0026#34;, \u0026#34;山东省烟台市\u0026#34;, \u0026#34;山东省潍坊市\u0026#34;, \u0026#34;山东省泰安市\u0026#34;, \u0026#34;山东省临沂市\u0026#34;, \u0026#34;山东省东营市\u0026#34;, \u0026#34;山东省济宁市\u0026#34;, \u0026#34;山东省威海市\u0026#34;, \u0026#34;山东省日照市\u0026#34;, \u0026#34;山东省莱芜市\u0026#34;, \u0026#34;山东省德州市\u0026#34;, \u0026#34;山东省聊城市\u0026#34;, \u0026#34;山东省章丘市\u0026#34;, \u0026#34;山东省胶州市\u0026#34;, \u0026#34;山东省即墨市\u0026#34;, \u0026#34;山东省平度市\u0026#34;, \u0026#34;山东省胶南市\u0026#34;, \u0026#34;山东省莱西市\u0026#34;, \u0026#34;山东省滕州市\u0026#34;, \u0026#34;山东省龙口市\u0026#34;, \u0026#34;山东省莱阳市\u0026#34;, \u0026#34;山东省莱州市\u0026#34;, \u0026#34;山东省蓬莱市\u0026#34;, \u0026#34;山东省招远市\u0026#34;, \u0026#34;山东省栖霞市\u0026#34;, \u0026#34;山东省海阳市\u0026#34;, \u0026#34;山东省青州市\u0026#34;, \u0026#34;山东省诸城市\u0026#34;, \u0026#34;山东省寿光市\u0026#34;, \u0026#34;山东省安丘市\u0026#34;, \u0026#34;山东省高密市\u0026#34;, \u0026#34;山东省昌邑市\u0026#34;, \u0026#34;山东省曲阜市\u0026#34;, \u0026#34;山东省兖州市\u0026#34;, \u0026#34;山东省邹城市\u0026#34;, \u0026#34;山东省新泰市\u0026#34;, \u0026#34;山东省肥城市\u0026#34;, \u0026#34;山东省文登市\u0026#34;, \u0026#34;山东省荣成市\u0026#34;, \u0026#34;山东省乳山市\u0026#34;, \u0026#34;山东省乐陵市\u0026#34;, \u0026#34;山东省禹城市\u0026#34;, \u0026#34;山东省临清市\u0026#34;, \u0026#34;山东省滨州市\u0026#34;, \u0026#34;山东省菏泽市\u0026#34; }; //身份证省、自治区、直辖市代码 private static final String[] provinces = { \u0026#34;11\u0026#34;, \u0026#34;12\u0026#34;, \u0026#34;13\u0026#34;, \u0026#34;14\u0026#34;, \u0026#34;15\u0026#34;, \u0026#34;21\u0026#34;, \u0026#34;22\u0026#34;, \u0026#34;23\u0026#34;, \u0026#34;31\u0026#34;, \u0026#34;32\u0026#34;, \u0026#34;33\u0026#34;, \u0026#34;34\u0026#34;, \u0026#34;35\u0026#34;, \u0026#34;36\u0026#34;, \u0026#34;37\u0026#34;, \u0026#34;41\u0026#34;, \u0026#34;42\u0026#34;, \u0026#34;43\u0026#34;, \u0026#34;44\u0026#34;, \u0026#34;45\u0026#34;, \u0026#34;46\u0026#34;, \u0026#34;50\u0026#34;, \u0026#34;51\u0026#34;, \u0026#34;52\u0026#34;, \u0026#34;53\u0026#34;, \u0026#34;54\u0026#34;, \u0026#34;61\u0026#34;, \u0026#34;62\u0026#34;, \u0026#34;63\u0026#34;, \u0026#34;64\u0026#34;, \u0026#34;65\u0026#34;, \u0026#34;71\u0026#34;, \u0026#34;81\u0026#34;, \u0026#34;82\u0026#34; }; //身份证校验码 private static final String[] checks = { \u0026#34;0\u0026#34;, \u0026#34;1\u0026#34;, \u0026#34;2\u0026#34;, \u0026#34;3\u0026#34;, \u0026#34;4\u0026#34;, \u0026#34;5\u0026#34;, \u0026#34;6\u0026#34;, \u0026#34;7\u0026#34;, \u0026#34;8\u0026#34;, \u0026#34;9\u0026#34;, \u0026#34;X\u0026#34; }; //手机号码 private static final String[] telFirst = { \u0026#34;134\u0026#34;, \u0026#34;135\u0026#34;, \u0026#34;136\u0026#34;, \u0026#34;137\u0026#34;, \u0026#34;138\u0026#34;, \u0026#34;139\u0026#34;, \u0026#34;150\u0026#34;, \u0026#34;151\u0026#34;, \u0026#34;152\u0026#34;, \u0026#34;157\u0026#34;, \u0026#34;158\u0026#34;, \u0026#34;159\u0026#34;, \u0026#34;130\u0026#34;, \u0026#34;131\u0026#34;, \u0026#34;132\u0026#34;, \u0026#34;155\u0026#34;, \u0026#34;156\u0026#34;, \u0026#34;133\u0026#34;, \u0026#34;153\u0026#34; }; //邮箱相关 private static final String[] email_suffix = { \u0026#34;@gmail.com\u0026#34;, \u0026#34;@yahoo.com\u0026#34;, \u0026#34;@msn.com\u0026#34;, \u0026#34;@hotmail.com\u0026#34;, \u0026#34;@aol.com\u0026#34;, \u0026#34;@ask.com\u0026#34;, \u0026#34;@live.com\u0026#34;, \u0026#34;@qq.com\u0026#34;, \u0026#34;@0355.net\u0026#34;, \u0026#34;@163.com\u0026#34;, \u0026#34;@163.net\u0026#34;, \u0026#34;@263.net\u0026#34;, \u0026#34;@3721.net\u0026#34;, \u0026#34;@yeah.net\u0026#34;, \u0026#34;@gmail.com\u0026#34;, \u0026#34;@126.com\u0026#34;, \u0026#34;@sina.com\u0026#34;, \u0026#34;@sohu.com\u0026#34;, \u0026#34;@yahoo.com.cn\u0026#34; }; //邮箱相关 private static final char[] base = { \u0026#39;a\u0026#39;, \u0026#39;b\u0026#39;, \u0026#39;c\u0026#39;, \u0026#39;d\u0026#39;, \u0026#39;e\u0026#39;, \u0026#39;f\u0026#39;, \u0026#39;g\u0026#39;, \u0026#39;h\u0026#39;, \u0026#39;i\u0026#39;, \u0026#39;j\u0026#39;, \u0026#39;k\u0026#39;, \u0026#39;l\u0026#39;, \u0026#39;m\u0026#39;, \u0026#39;n\u0026#39;, \u0026#39;o\u0026#39;, \u0026#39;p\u0026#39;, \u0026#39;q\u0026#39;, \u0026#39;r\u0026#39;, \u0026#39;s\u0026#39;, \u0026#39;t\u0026#39;, \u0026#39;u\u0026#39;, \u0026#39;v\u0026#39;, \u0026#39;w\u0026#39;, \u0026#39;x\u0026#39;, \u0026#39;y\u0026#39;, \u0026#39;z\u0026#39;, \u0026#39;0\u0026#39;, \u0026#39;1\u0026#39;, \u0026#39;2\u0026#39;, \u0026#39;3\u0026#39;, \u0026#39;4\u0026#39;, \u0026#39;5\u0026#39;, \u0026#39;6\u0026#39;, \u0026#39;7\u0026#39;, \u0026#39;8\u0026#39;, \u0026#39;9\u0026#39; }; private static String birthDay = \u0026#34;\u0026#34;; private static int age = 0; private static String name_sex = \u0026#34;\u0026#34;; private static final Random random = new Random(); public static void main(String[] args) { for (int i = 0; i \u0026lt; 10; i++) { System.out.println(getUserData()); } } /** * 获取随机生成的身份证号码 * * @return */ public static String getRandomID() { // 随机生成省、自治区、直辖市代码 1-2 String province = randomOne(provinces); // 随机生成地级市、盟、自治州代码 3-4 String city = randomCityCode(18); // 随机生成县、县级市、区代码 5-6 String county = randomCityCode(28); // 随机生成出生年月 7-14 String birth = isExistBirthDay() ? birthDay : getRandomBirth(20, 50); // 随机生成顺序号 15-16 String no = Integer.toString(getNum(10, 99)); // 性别码 String sex = isExistSex() ? (name_sex.equals(\u0026#34;女\u0026#34;) ? getSexCode(1) : getSexCode(0)) : Integer.toString(getNum(10)); // 随机生成校验码 18 String check = randomOne(checks); // 拼接身份证号码 return province + city + county + birth + no + sex + check; } private static String getSexCode(int i) { Random random = new Random(); String[] boyCode = {\u0026#34;1\u0026#34;, \u0026#34;3\u0026#34;, \u0026#34;5\u0026#34;, \u0026#34;7\u0026#34;, \u0026#34;9\u0026#34;}; String[] girlCode = {\u0026#34;0\u0026#34;, \u0026#34;2\u0026#34;, \u0026#34;4\u0026#34;, \u0026#34;6\u0026#34;, \u0026#34;8\u0026#34;}; return i == 0 ? boyCode[random.nextInt(boyCode.length)] : girlCode[random.nextInt(girlCode.length)]; } /** * 随机生成minAge到maxAge年龄段的人的生日日期 * * @param minAge * @param maxAge * @return */ public static String getRandomBirth(int minAge, int maxAge) { SimpleDateFormat dft = new SimpleDateFormat(\u0026#34;yyyyMMdd\u0026#34;); Calendar date = Calendar.getInstance(); Calendar date2 = Calendar.getInstance(); // 获取当前日期 date.setTime(new Date()); date2.setTime(new Date()); // 设置日期为前maxAge年到前minAge年的任意一天 int randomDay = 365 * minAge + getNum(365 * (maxAge - minAge)); date.set(Calendar.DATE, date.get(Calendar.DATE) - randomDay); // 设置年龄 age = date2.get(Calendar.YEAR) - date.get(Calendar.YEAR); birthDay = dft.format(date.getTime()); return birthDay; } /** * 获得年龄，如果未设置则随机去9~55 * * @return */ public static int getAge() { return age == 0 ? getNum(9, 55) : age; } /** * 返回Email * * @param lMin 最小长度 * @param lMax 最大长度 * @return */ public static String getEmail(int lMin, int lMax) { int length = getNum(lMin, lMax); StringBuilder sb = new StringBuilder(); for (int i = 0; i \u0026lt; length; i++) { int number = getNum(base.length); sb.append(base[number]); } sb.append(email_suffix[getNum(email_suffix.length)]); return sb.toString(); } /** * 手机号码 * * @return */ public static String getTel() { int index = getNum(telFirst.length); String first = telFirst[index]; String second = String.valueOf(getNum(1, 888) + 10000).substring(1); String third = String.valueOf(getNum(1, 9100) + 10000).substring(1); return first + second + third; } /** * 随机获得(中文) 姓氏+名字 * * @return */ public static String getChineseName() { int sex = getNum(2); int hasThird = getNum(2); return getFirstName() + getLastName(sex, hasThird); } /** * 获得姓氏 * * @return */ private static String getFirstName() { int index = getNum(firstNames.length); return firstNames[index]; } /** * 随机获得名字，并判断性别 * * @param sex * @param hasThird * @return */ private static String getLastName(int sex, int hasThird) { int index = 0; String[] str = new String[0]; if (sex == 0 \u0026amp;\u0026amp; hasThird == 0) { name_sex = \u0026#34;男\u0026#34;; str = boy; index = getNum(str.length); } if (sex == 0 \u0026amp;\u0026amp; hasThird == 1) { name_sex = \u0026#34;男\u0026#34;; str = boy2; index = getNum(str.length); } if (sex == 1 \u0026amp;\u0026amp; hasThird == 0) { name_sex = \u0026#34;女\u0026#34;; str = girl; index = getNum(str.length); } if (sex == 1 \u0026amp;\u0026amp; hasThird == 1) { name_sex = \u0026#34;女\u0026#34;; str = girl2; index = getNum(str.length); } return str[index]; } /** * 返回性别，如果未设置则随机选择男或女 * * @return */ public static String getSex() { return name_sex.equals(\u0026#34;\u0026#34;) ? (getNum(2) == 0 ? \u0026#34;女\u0026#34; : \u0026#34;男\u0026#34;) : name_sex; } /** * 返回地址 * * @return */ public static String getAddress() { return road[getNum(road.length)] + getNum(11, 150) + \u0026#34;号\u0026#34; + \u0026#34;-\u0026#34; + getNum(1, 20) + \u0026#34;-\u0026#34; + getNum(1, 10); } /** * 从String[] 数组中随机取出其中一个String字符串 * * @param s * @return */ private static String randomOne(String[] s) { return s[getNum(s.length)]; } /** * 随机生成两位数的字符串（01-max）,不足两位的前面补0 * * @param max * @return */ private static String randomCityCode(int max) { int i = getNum(1, max); return i \u0026gt; 9 ? i + \u0026#34;\u0026#34; : \u0026#34;0\u0026#34; + i; } /** * 随机器[start, end] * * @param start * @param end * @return */ private static int getNum(int start, int end) { return random.nextInt(end - start + 1) + start; } /** * 随机器[0, end) * * @param end * @return */ private static int getNum(int end) { return random.nextInt(end); } /** * 随机图片 url，不一定可用 * * @return */ public static String getImg() { String str = \u0026#34;\u0026#34;; try { String urlStr = \u0026#34;https://www.dmoe.cc/random.php?return=json\u0026#34;; CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpGet httpGet = new HttpGet(urlStr); //获取请求响应值 CloseableHttpResponse response = httpClient.execute(httpGet); //将请求响应值转换为String类型 String responseString = EntityUtils.toString(response.getEntity(), \u0026#34;UTF-8\u0026#34;); //将String类型转换为json对象 JSONObject responseJson = JSON.parseObject(responseString); //获取对应的value值 System.out.println(responseJson); str = responseJson.get(\u0026#34;imgurl\u0026#34;).toString(); } catch (Exception e) { e.printStackTrace(); } return str; } // 随机图片测试 @Test public void testImg() { System.out.println(getImg()); } /** * 数据封装 * * @return */ public static Map\u0026lt;String, Object\u0026gt; getUserData() { Map\u0026lt;String, Object\u0026gt; map = new LinkedHashMap\u0026lt;\u0026gt;(); String name = getChineseName(); String birth = getRandomBirth(9, 45); String id = getRandomID(); int age = getAge(); String sex = getSex(); String address = getAddress(); String tel = getTel(); String email = getEmail(6, 9); map.put(\u0026#34;id\u0026#34;, id); map.put(\u0026#34;name\u0026#34;, name); map.put(\u0026#34;sex\u0026#34;, sex); map.put(\u0026#34;age\u0026#34;, age); map.put(\u0026#34;birth\u0026#34;, birth); map.put(\u0026#34;tel\u0026#34;, tel); map.put(\u0026#34;email\u0026#34;, email); map.put(\u0026#34;road\u0026#34;, address); return map; } private static boolean isExistSex() { return !name_sex.equals(\u0026#34;\u0026#34;); } private static boolean isExistBirthDay() { return !birthDay.equals(\u0026#34;\u0026#34;); } } 随机汉字工具类 # /** * 生成指定位数的随机汉字 */ public class ChineseTool { // 不允许创建实例对象 private ChineseTool() { } /** * 对外提供的接口：生成随机的汉字 * * @param len 生成几位汉字 * @return 原理是从汉字区位码找到汉字。在汉字区位码中分高位与底位， 且其中简体又有繁体。 * 原理是从汉字区位码找到汉字。在汉字区位码中分高位与底位， 且其中简体又有繁体。 * 所以在本例中高位从171取，底位从161取， 去掉大部分的繁体和生僻字。但仍然会有！！ */ public static String getRandomChinese(int len) { StringBuilder result = new StringBuilder(); for (int i = 0; i \u0026lt; len; i++) { String str; int highPos, lowPos; // 定义高低位 Random random = new Random(); highPos = (176 + Math.abs(random.nextInt(39))); // 获取高位值 lowPos = (161 + Math.abs(random.nextInt(93))); // 获取低位值 byte[] bytes = new byte[2]; bytes[0] = new Integer(highPos).byteValue(); bytes[1] = new Integer(lowPos).byteValue(); try { str = new String(bytes, \u0026#34;GBK\u0026#34;); // 转成中文 result.append(str); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } } return result.toString(); } } ","date":"2021-11-16","externalUrl":null,"permalink":"/posts/flink%E5%AE%89%E8%A3%85%E9%83%A8%E7%BD%B2/","section":"文章","summary":"","title":"Difference between FileReader vs FileInputStream in Java","type":"posts"},{"content":"","date":"2021-11-16","externalUrl":null,"permalink":"/tags/flink/","section":"Tags","summary":"","title":"Flink","type":"tags"},{"content":" 上传安装包到Linux # 下载 MySQL server 包：++链接++ 提取码: 4aqx\n也可以从++官网++下载。\n个人习惯，所有的压缩包，都上传到 linux /opt/tools/ 目录下；解压缩安装在 /opt/apps/ 目录下\n解压缩 # tar xvf mysql-8.0.27-linux-glibc2.12-x86_64.tar.xz -C /opt/apps/ 重命名 # mv mysql-8.0.27-linux-glibc2.12-x86_64/ mysql 修改配置文件 # vim /etc/my.cnf\n直接清空里面所有内容，输入下面的内容\n[client] port=3306 socket=/var/lib/mysql/mysql.sock [mysqld] port=3306 user=mysql socket=/var/lib/mysql/mysql.sock basedir=/opt/apps/mysql datadir=/opt/apps/mysql/data 创建组与用户 # groupadd mysql useradd -g mysql mysql 初始化mysql # /opt/apps/mysql/bin/mysqld --initialize --user=mysql --basedir=/opt/apps/mysql/ --datadir=/opt/apps/mysql/data/ 复制临时密码 # 找个记事本，保存一下生成的临时密码\n创建sock文件夹与命令链接 # mkdir -p /var/lib/mysql ; chown -R mysql:mysql /var/lib/mysql ln -s /opt/apps/mysql/bin/mysql /usr/bin 启动服务 # /opt/apps/mysql/support-files/mysql.server start 修改密码 # mysql -uroot -p ALTER USER \u0026#39;root\u0026#39;@\u0026#39;localhost\u0026#39; IDENTIFIED BY \u0026#39;123456\u0026#39;; 开启远程访问 # use mysql; update user set host=\u0026#39;%\u0026#39; where user=\u0026#39;root\u0026#39;; flush privileges; 关闭防火墙 # systemctl stop firewalld.service #停止firewall systemctl disable firewalld.service #禁止firewall开机启动 配置成服务并开机启动 # cp /opt/apps/mysql/support-files/mysql.server /etc/init.d/mysql chkconfig mysql on chkconfig --add mysql 这样配置之后 ，可以使用命令：service mysql start 来开启 mysql 服务，service mysql stop 停止mysql服务。\n远程客户端测试链接 # 彻底卸载 MySQL # find / -name mysql 然后一条一条执行 rm -rf，或者写一个shell命令，一次性删除。\n","date":"2021-11-16","externalUrl":null,"permalink":"/posts/centos7%E5%AE%89%E8%A3%85mysql8.x/","section":"文章","summary":"","title":"Centos7安装MySQL8.x","type":"posts"},{"content":"","date":"2021-11-16","externalUrl":null,"permalink":"/tags/mysql/","section":"Tags","summary":"","title":"MySQL","type":"tags"},{"content":"在自己的个人项目中，我们可能会需要在表中随机生成一些数据以供我们进行相应的测试。这时候就可以通过存储过程来向表中添加规定条数的数据。\n自定义函数 # 生成随机字符串 # 下面以一个自动生成由26个字母+10个数字的字符串函数为例来说明怎么写：\n-- 如果该函数 generate_rand_string 已存在，则先删除 drop function if exists `generate_rand_string`; -- 创建函数 generate_rand_string create function `generate_rand_string`(n int) returns varchar(255) comment \u0026#39;测试自定义函数\u0026#39; begin declare chars_str varchar(255) default \u0026#39;abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789\u0026#39;; # 声明定义1个变量, 初值默认为 26个字母+10个数字 declare return_str varchar(255) default \u0026#39;\u0026#39;; # 声明一个变量，用于设置返回的目标字符串 declare i int default 0; while i \u0026lt; n do set return_str = concat(return_str, substring(chars_str,FLOOR(1 + RAND()*62), 1)); set i = i + 1; end while; return (return_str); end; -- 调用 generate_rand_string 自定义函数 select `generate_rand_string`(10); 执行结果如下： 报错解决 # 如果在上面的创建自定义函数过程中，执行后报如下错误： This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)，只需要执行下面这条SQL即可：\n-- 报错设置 set global log_bin_trust_function_creators=1; 表间数据复制 # 需求：将A表中某行数据复制后再插入表中，并返回新增主键id。\n-- 需求：将A表中某行数据复制后再插入表中，并返回新增主键id。 -- 如果该函数 copy_insert 已存在，则先删除 drop function if exists `copy_insert`; -- 创建函数 copy_insert，返回新增数据行的=主键id create function `copy_insert`(arg int) returns int comment \u0026#39;将A表中某行数据复制后再插入表中的函数\u0026#39; begin declare result int; # 声明返回结果 int型的result，注意自定义函数必须有且只能有一个返回值 declare id_tmp int; # 查询到的id declare username_tmp varchar(255); # 查询结果 username declare nickname_tmp varchar(255); declare password_tmp varchar(255); declare status_tmp int; declare email_tmp varchar(64); declare userface_tmp varchar(255); declare regtime_tmp varchar(255); select id,username,nickname,`password`,`status`,email,userface,regtime into id_tmp,username_tmp,nickname_tmp,password_tmp,status_tmp,email_tmp,userface_tmp,regtime_tmp from user where id = arg; set id_tmp := id_tmp + 1; # id自增1 # 使用set语句, := 操作符赋值 set result := id_tmp; # 返回新增数据的id insert into user values(id_tmp,username_tmp,nickname_tmp,password_tmp,status_tmp,email_tmp,userface_tmp,regtime_tmp); return result; end; -- 调用 select copy_insert(20); 查看函数状态 # -- 查看 copy_insert 函数状态 show function status like \u0026#39;%copy_insert%\u0026#39;; 查看函数定义 # -- 查看 copy_insert 函数定义 show create function copy_insert; 存储过程 # 需求：向user表中插入10w条数据，完成测试数据的生成，在生成某列字段时采取调用之前自定义函数 generate_rand_string 生成的字符串来填充。\n-- 新建存储过程 insert_data -- 向表中插入10w条数据，同时调用之前自定义函数 generate_rand_string -- 如果该存储函数存在，则先删除 drop procedure if exists insert_data; create procedure insert_data(row_arg int, start_id int) # 并设置两个参数 begin declare i int; set i = start_id; # 因为我表中已经有数据了，所以这里id从50开始 while i \u0026lt;= row_arg do insert into user(id, username, nickname, `password`, `status`, email, userface, regTime) values(i, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, \u0026#39;\u0026#39;, 1, \u0026#39;\u0026#39;, generate_rand_string(10), null); # 注意这里调用了之前自定义过的函数 generate_rand_string set i = i + 1; end while; end; -- 调用 insert_data 存储过程，并传入参数，插入100条数据，id从50开始 call insert_data(100, 50); 存储过程调用 # call insert_data(100, 50); 通过这种方式，我们可以向一张表中插入百万数据用例。\n索引 # 索引类型 # 以MySQL为例，索引从是否可重复来说分为：唯一索引（unique，注意：primary只是一种特殊的unique索引）和普通索引。 从索引列来说分为：单列索引和多列组合索引；多列组合索引遵从“从左原则”，即从左开始匹配使用索引。\n索引的数据结构 # 索引是一种数据结构，例如B-Tree，这种数据结构是需要额外的写入和存储为代价来提高表上数据检索的速度。一旦建立了索引后，数据库中查询优化器使用索引来快速定位数据，然后就无需扫描表中给定查询的每一行了。 其中。当使用主键或唯一键创建表时，MySQL会自动创建名为PRIMARY的特殊索引, 该索引称为聚簇索引。PRIMARY索引是比较特殊的，这个索引本身与数据一起存储在同一个表中。另外除PRIMARY索引之外的其他索引称为二级索引或非聚簇索引。\n默认情况下，如果未指定索引类型，MySQL将创建B-Tree索引。 以下显示了基于表的存储引擎的允许索引类型：\nStorage Engine Allowed Index Types InnoDB BTREE MyISAM BTREE Memory/Heap Hash, BTREE 原始表数据\n未加索引时 # -- username 未添加索引时，查找 username = \u0026#39;renwoxing\u0026#39; 的数据 explain select id,username,nickname,password,status,email,userface,regtime from user where username=\u0026#39;renwoxing\u0026#39;; 执行计划：\n添加索引 # -- 现在使用CREATE INDEX语句为 username 列创建一个普通索引： create index idx_username on user(username); 再次执行上面的select语句，查看执行计划： 这时候看到MySQL只扫描了1行（当然这里只是巧合是1行，添加索引后只是扫描行减少了，并不是都是1行），而不是像之前那样扫描那么多行数据。\n查看某张表的所有索引 # show indexes from user; 注意看 Index_type 列，索引列使用的正是 BTREE 索引。Non_unique ：如果索引不能包括重复值则为0，如果可以则为1。也就是平时所说的唯一索引，也就是说0表示是唯一索引，1表示普通索引。\n组合索引 # -- 组合索引 create index idx_username_nickname_status on user(username, nickname, status); 再次查看user表中的索引：\nshow indexes from user; 注意：当某个字段即创建了单列索引，又在组合索引中也涉及到了该字段，那么当在 where 条件中即使对 组合索引 字段都进行了设置（并且符合从左原则，即组合索引必须有最左侧的字段的条件），但是也不会走 多列组合索引。自己可以测试一下，这里我已经删除了 username 的单列索引，就不演示了。\n多列索引查询，查看执行计划 ```sql -- 对组合索引字段执行查询操作 explain select id,username,nickname,password,status,email,userface,regtime from user where nickname = '任我行'; ``` 可以看到在上面的查询中，即使 nickname 字段是组合索引中的字段，但是查询时并没有走索引，什么原因呢？原因就是上述查询不符合“从左原则”，请看下面的正确查询：\n-- 对组合索引字段执行查询时，必须要有最左侧字段的条件判断（必须是等值判断，若是like模糊匹配，则不会走索引）， explain select id,username,nickname,password,status,email,userface,regtime from user where nickname = \u0026#39;任我行\u0026#39; and username=\u0026#39;renwoxing\u0026#39;; 对组合索引字段执行查询时，必须要有最左侧字段的条件判断（必须是等值判断，若是like模糊匹配，则不会走索引），此时才会走索引（不论其它字段是否都存在，或者只存在其一）。\n本文参考于：MySQL之自定义函数、索引(三)Mysql创建索引、索引(一)Mysql创建索引\n","date":"2021-11-03","externalUrl":null,"permalink":"/posts/mysql%E5%87%BD%E6%95%B0-%E5%AD%98%E5%82%A8%E8%BF%87%E7%A8%8B-%E7%B4%A2%E5%BC%95%E5%AD%A6%E4%B9%A0/","section":"文章","summary":"","title":"MySQL函数-存储过程-索引学习","type":"posts"},{"content":"Difference between FileReader vs FileInputStream in Java? Answer Even though both FileReader and FileInputStream are used to read data from a file in Java, they are quite different. The main difference between the FileReader and FileInputStream is that one reads data from a character stream while the other reads data from a byte stream. The FileReader automatically converts the raw bytes into characters by using the platform\u0026rsquo;s default character encoding. This means you should use this class if you are reading from a text file that has the same character encoding as the default one.\nIf you happen to read a text file encoded in different character encoding then you should use InputStreamReader with specified character encoding. An InputStreamReader is a bridge between byte stream and character stream and can take a FileInputStream as a source.\nThough, it\u0026rsquo;s worth remembering that it caches the character encoding which means you cannot change the encoding scheme programmatically.\nAs per my recruitment experience, I have often found Java developers good on multi-threading, collections, and basics but fare really poor on Java IO. They struggle to answer questions like channel vs buffer, byte vs character, or IO vs NIO. If you ask them to write code, they never handle the exception, never close the file and hardly write production-quality code. An interview is a place to write your best code.\nBrushing up your IO skills by reading Core Java for Really Impatient is also a good idea, as one reason for lacking Java IO knowledge is the lack of practice. This book, not only explains things well but also gives you lots of exercises to practice well.\nDifferences between FileReader and FileInputStream Here are a couple of key differences between a FileReader and a FileInputStream in Java:\nThe first difference is in their type hierarchy, FileReader extends from Reader class while FileInputStream is descendent of InputStream class.\nThe second difference is in their purpose. The FileReader is meant for reading text data while FileInputStream is for reading binary data.\nThe various overloaded read() methods of FileReader can read one character at a time or multiple characters into an array while read() method of FileInputStream can read one byte at a time or multiple bytes in a byte array.\nHere is a nice slide that explains the difference between FileReader and FileInputStream quite well:\nDifference between FileReader vs FileInputStream in Java\nJava Program to Read File using FileReader vs FileInpustStream Let\u0026rsquo;s see an example to learn how to use both FileReader and FileInputStream classes to read data from a text file. Remember, FileReader reads characters while FileInputStream reads bytes. In this program, I have just read the data from the manifest.mf file which is a text file.\nimport java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException; import java.util.logging.Level; import java.util.logging.Logger; /** * Java Program to demonstrate difference between * FileReader and FileInputStream in Java * * @author WINDOWS 8 */ public class IteratorRemoveTest { public static void main(String args[]) throws IOException { // reading data using FileReader System.out.println(\u0026#34;Reding text file using FileReader\u0026#34;); try { FileReader fr = new FileReader(\u0026#34;manifest.mf\u0026#34;); int i = fr.read(); while(i != -1){ System.out.print((char)i); i = fr.read(); } } catch (FileNotFoundException ex) { Logger.getLogger(IteratorRemoveTest.class.getName()) .log(Level.SEVERE, null, ex); } // reading data using FileInpustStream System.out.println(\u0026#34;Reding text file using FileInputStream\u0026#34;); try { FileInputStream fis = new FileInputStream(\u0026#34;manifest.mf\u0026#34;); int b = fis.read(); while(b != -1){ System.out.print(b); b = fis.read(); } } catch (FileNotFoundException ex) { Logger.getLogger(IteratorRemoveTest.class.getName()) .log(Level.SEVERE, null, ex); } } } Output: Reding text file using FileReader Manifest-Version: 1.0 X-COMMENT: Main-Class will be added automatically by build\nReding text file using FileInputStream 7797110105102101115116458610111411510511111058324 9464813108845677977776978845832779710511045671089711511 53211910510810832981013297100100101100329711711611110997 11610599971081081213298121329811710510810013101310 BUILD SUCCESSFUL (total time: 0 seconds)\nThat\u0026rsquo;s all on the difference between FileReader and FileInputStream in Java. So, use FileReader if you intend to read streams of character and use the FileInputSream if you want to read streams of raw bytes.\nIt\u0026rsquo;s better to use FileReader for reading text files because it will take care of converting bytes to characters but remember that FileReader uses the platform\u0026rsquo;s default character encoding. If you are reading a file that is encoded in a character encoding other than the host\u0026rsquo;s default char encoding then you should use the InputStreamReader.\n本文参考于Java67\n","date":"2021-10-25","externalUrl":null,"permalink":"/posts/difference-between-filereader-vs-fileinputstream-in-java/","section":"文章","summary":"","title":"Difference between FileReader vs FileInputStream in Java","type":"posts"},{"content":" 前言 # 有时候，我们需要对一个目录下的所有图片都进行重命名，如果你选择手动方式进行，在图片少的情况下还可以进行，但是如果一个目录下有几百张图片时，你就会感到无比痛苦了。这时候就会想借助工具来实现了。如下就是一种很简单的实现方式。\n实现 # 可以选择直接下载这个jar包工具，然后通过 java -jar xxx.jar 的方式运行，也可以直接看其源代码然后拷贝其rename方法运行即可。\n代码已托管在gitee上，请移步查看。\n流操作之下载图片 # @Test public void downloadImg() throws Exception{ String urlStr = \u0026#34;https://images7.alphacoders.com/118/1180526.jpg\u0026#34;; // 构造 java.net.URL 网络请求对象 URL url = new URL(urlStr); // 通过 url 打开一个 HttpURLConnection 连接 HttpURLConnection connection = url.openConnection(); // 从打开的连接中，获取响应流 InputStream is = connection.getInputStream(); // 准备获取流中的数据，并且将其写入到文件中 File file = new File(\u0026#34;e:/temp-files/1.png\u0026#34;); // 构造输出流，输出到哪里呢？传入目标文件参数 FileOutputStream fos = new FileOutputStream(file); // 只要涉及到 流的操作，必用 缓冲buffer byte[] buffer = new byte[1024]; // 每次读取的长度 int len = 0; while((len = is.read(buffer)) != -1){ // 读取到的内容写入流中 fos.write(buffer, 0, len); } // 关闭流 fos.close(); is.close(); System.out.println(\u0026#34;download completed\u0026#34;); } 流操作之复制图片 # @Test public void copyImg() throws Exception{ // 要复制的图片地址 String imgPath = \u0026#34;e:/temp-files/1.png\u0026#34;; FileInputStream is = new FileInputStream(imgPath); // 准备获取流中的数据，并且将其写入到文件中 File file = new File(\u0026#34;e:/temp-files/1-bak.png\u0026#34;); // 构造输出流，输出到哪里呢？传入目标文件参数 FileOutputStream fos = new FileOutputStream(file); // 只要涉及到 流的操作，必用 缓冲buffer byte[] buffer = new byte[1024]; // 每次读取的长度 int len = 0; while((len = is.read(buffer)) != -1){ // 读取到的内容写入流中 fos.write(buffer, 0, len); } // 关闭流 fos.close(); is.close(); System.out.println(\u0026#34;copy img completed\u0026#34;); } 流操作之复制txt # @Test public void copyTxt() throws Exception{ // urlPath String filePath = \u0026#34;e:/temp-files/1.txt\u0026#34;; // inputStream FileInputStream fis = new FileInputStream(filePath); // File file = new File(\u0026#34;e:/temp-files/1-bak.txt\u0026#34;); FileOutputStream fos = new FileOutputStream(file); byte[] buffer = new byte[1024]; int len = 0; while ((len = fis.read(buffer)) != -1){ fos.write(buffer, 0, len); } fos.close(); fis.close(); System.out.println(\u0026#34;txt copy completed\u0026#34;); } 通过工具图片API获取图片 # import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClientBuilder; import org.apache.http.util.EntityUtils; /** * 随机图片 url，不一定可用 * 通过 GET 方式，获取 JSON 响应中的 imgUrl 图片url地址 */ public static String getImg() { String str = \u0026#34;\u0026#34;; try { String urlStr = \u0026#34;https://www.dmoe.cc/random.php?return=json\u0026#34;; CloseableHttpClient httpClient = HttpClientBuilder.create().build(); HttpGet httpGet = new HttpGet(urlStr); //获取请求响应值 CloseableHttpResponse response = httpClient.execute(httpGet); //将请求响应值转换为String类型 String responseString = EntityUtils.toString(response.getEntity(), \u0026#34;UTF-8\u0026#34;); //将String类型转换为json对象 JSONObject responseJson = JSON.parseObject(responseString); //获取对应的value值 System.out.println(responseJson); str = responseJson.get(\u0026#34;imgurl\u0026#34;).toString(); } catch (Exception e) { e.printStackTrace(); } return str; } ","date":"2021-09-26","externalUrl":null,"permalink":"/posts/java%E5%AE%9E%E7%8E%B0%E6%89%B9%E9%87%8F%E9%87%8D%E5%91%BD%E5%90%8D%E6%96%87%E4%BB%B6/","section":"文章","summary":"","title":"Java实现批量重命名文件","type":"posts"},{"content":" 前言 # 前些时候，我在某个网站上注册了一个账号，在修改个人头像时，发现该网站仅支持矩形头像的显示，但是我个人是比较喜欢圆形头像的； 因此我需要将电脑上一张矩形图片处理成白底圆形的图片，但是我找了好多在线方法（ps：不太喜欢给电脑上下载许多不常用的工具），发现 都不太好用，于是决定看能否用代码来实现这个需求，因此有了本文。\n构思 # 在Java语言中，其实有一个操作图像的类库，就是 BufferedImage。 Image 是一个抽象类，BufferedImage 是 Image 的实现类，是一个操作缓冲区图像的类。BufferedImage 的主要作用是将一张图片加载到内存中， 然后我们就可以实现对图像的一些操作。比如：获得绘图对象、图像缩放、选择图像平滑度、图片大小变换、改变图片显示颜色、设置透明度等功能。\n实现 # package com.abc.learn; import org.apache.commons.io.FilenameUtils; import org.junit.Test; import sun.misc.BASE64Encoder; import javax.imageio.ImageIO; import java.awt.*; import java.awt.geom.Ellipse2D; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.net.URL; import java.nio.charset.StandardCharsets; import java.time.Instant; /** * @author 030 * @date 13:05 2021/9/24 * @description */ public class ToCirclePicture { // 本地图片示例 private static final String localImgPath = \u0026#34;C:/Users/Administrator/Pictures/4K/312591.jpg\u0026#34;; // 网络图片以我图床上的一张图为例 private static final String netImgUrl = \u0026#34;https://pic.imgdb.cn/item/613e1f7c44eaada739eb4a11.jpg\u0026#34;; /** * 传入的图像必须是正方形的 才会 变成圆形 * 如果是长方形的比例则会变成椭圆的 */ public static BufferedImage changeToCircular(BufferedImage bufferedImage, int radius) { // 这种是黑色底的 // BufferedImage destImg = new BufferedImage(radius, radius, BufferedImage.TYPE_INT_RGB); // 透明底的图片，长、宽都为 既定的半径 BufferedImage destImg = new BufferedImage(radius, radius, BufferedImage.TYPE_4BYTE_ABGR); Ellipse2D.Double shape = new Ellipse2D.Double(0, 0, radius, radius); Graphics2D g2 = destImg.createGraphics(); g2.setClip(shape); // 使用 setRenderingHint 设置抗锯齿 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.drawImage(bufferedImage, 0, 0, null); // 设置颜色 g2.setBackground(Color.white); g2.dispose(); return destImg; } /** * 缩小Image，此方法返回源图像按给定宽度、高度限制下缩放后的图像 * * @param sourceImage * @param newWidth ：压缩后宽度 * @param newHeight ：压缩后高度 */ public static BufferedImage scaleByPercentage(BufferedImage sourceImage, int newWidth, int newHeight) { // 获取原始图像透明度类型 int type = sourceImage.getColorModel().getTransparency(); int width = sourceImage.getWidth(); int height = sourceImage.getHeight(); // 开启抗锯齿 RenderingHints renderingHints = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); // 使用高质量压缩 renderingHints.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY); BufferedImage img = new BufferedImage(newWidth, newHeight, type); Graphics2D graphics2d = img.createGraphics(); // graphics2d.setRenderingHints(renderingHints); graphics2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); graphics2d.drawImage(sourceImage, 0, 0, newWidth, newHeight, 0, 0, width, height, null); graphics2d.dispose(); return img; } /** * 获取字符串的base64编码 */ public static String getBase64(String str) { String destStr = \u0026#34;\u0026#34;; try { byte[] sourceArray = str.getBytes(StandardCharsets.UTF_8); // 对 byte[] 进行base64编码 destStr = new BASE64Encoder().encode(sourceArray); } catch (Exception e) { e.printStackTrace(); } return destStr; } /** * 测试 base64 编码 */ @Test public void testBase64() { String oldStr = \u0026#34;hello java\u0026#34;; String newStr = getBase64(oldStr); System.out.println(newStr); // aGVsbG8gamF2YQ== } /** * 测试 传入的是一个本地硬盘图片时，裁剪尺寸成矩形 */ @Test public void testLocalImg() { try { // BufferedImage是一个Image的实现类，主要作用是将一幅图片加载到内存中（BufferedImage生成的图片在内存里有一个图像缓冲区，利用这个缓冲区可以方便地操作这个图片） // java 中将一副本地图片加载到内存的方式 // ImageIO 提供read()和write()静态方法，读写图片，比以往的InputStream读写更方便 BufferedImage sourceImg = ImageIO.read(new FileInputStream(localImgPath)); // 当然你这里使用File实例构造也是可以的 // 拿到 BufferedImage 实例之后，我们就可以对图片进行各种操作了，比如获得绘图对象、图像缩放、选择图像平滑度等功能，通常用来做图片大小变换、图片变灰、设置透明不透明等 // 将原始图片，处理成既定大小的矩形图片 BufferedImage destImg = scaleByPercentage(sourceImg, sourceImg.getWidth(), sourceImg.getHeight()); File outputFile = new File(FilenameUtils.getBaseName(localImgPath) + \u0026#34;-副本-\u0026#34; + Instant.now().toEpochMilli() + \u0026#34;.png\u0026#34;); // 传输中，图片是不能直接传的，需要先转为字节数组再传输较为方便；而字节数组再转回BufferedImage则还原图片 BufferedImage–\u0026gt;byte[] ImageIO.write(destImg, \u0026#34;png\u0026#34;, outputFile); System.out.println(\u0026#34;转换图片完成\u0026#34;); } catch (Exception e) { e.printStackTrace(); } } /** * 测试 当传入的是网络图片地址时，裁剪图像成矩形 */ @Test public void testNetUrlImg() { try { // BufferedImage是一个Image的实现类，主要作用是将一幅图片加载到内存中（BufferedImage生成的图片在内存里有一个图像缓冲区，利用这个缓冲区可以方便地操作这个图片） // java 中将一个网络图片加载到内存的方式 // ImageIO 提供read()和write()静态方法，读写图片，比以往的InputStream读写更方便 BufferedImage sourceImg = ImageIO.read(new URL(netImgUrl)); // 拿到 BufferedImage 实例之后，我们就可以对图片进行各种操作了，比如获得绘图对象、图像缩放、选择图像平滑度等功能，通常用来做图片大小变换、图片变灰、设置透明不透明等 // 将原始图片，处理成既定大小的矩形图片 BufferedImage destImg = scaleByPercentage(sourceImg, sourceImg.getWidth(), sourceImg.getHeight()); // 获取网络图片的名字 String name = FilenameUtils.getBaseName(netImgUrl); File outputFile = new File(name + \u0026#34;-副本-\u0026#34; + Instant.now().toEpochMilli() + \u0026#34;.png\u0026#34;); // 传输中，图片是不能直接传的，需要先转为字节数组再传输较为方便；而字节数组再转回BufferedImage则还原图片 BufferedImage–\u0026gt;byte[] ImageIO.write(destImg, \u0026#34;png\u0026#34;, outputFile); System.out.println(\u0026#34;转换图片完成\u0026#34;); } catch (Exception e) { e.printStackTrace(); } } /** * 将本地图片裁剪成圆形 */ @Test public void testLocalImgToCircular() { try { // BufferedImage是一个Image的实现类，主要作用是将一幅图片加载到内存中（BufferedImage生成的图片在内存里有一个图像缓冲区，利用这个缓冲区可以方便地操作这个图片） // java 中将一个网络图片加载到内存的方式 // ImageIO 提供read()和write()静态方法，读写图片，比以往的InputStream读写更方便 BufferedImage sourceImg = ImageIO.read(new File(localImgPath)); // 拿到 BufferedImage 实例之后，我们就可以对图片进行各种操作了，比如获得绘图对象、图像缩放、选择图像平滑度等功能，通常用来做图片大小变换、图片变灰、设置透明不透明等 // 将原始图片，处理成 圆形，注意：需要按照矩形的短边裁剪 BufferedImage destImg = changeToCircular(sourceImg, sourceImg.getHeight()); // 圆形的半径，就按照原始图片的高度来设置 // 将 BufferedImage 缓冲区图像，输出保存 /** * 注意：这里有一个很无语的点就是：不管原图片是什么格式的，你最后输出保存的文件格式必须是png的，如果你使用jpg格式后，就会发现图片编程暗粉色的了， * 这个bug我找了好久，不明白是什么原因，只能先这样了。 */ File outputFile = new File(FilenameUtils.getBaseName(localImgPath) + \u0026#34;-副本-圆形\u0026#34; + Instant.now().toEpochMilli() + \u0026#34;.png\u0026#34;); ImageIO.write(destImg, \u0026#34;png\u0026#34;, outputFile); System.out.println(\u0026#34;图片已裁剪成圆形\u0026#34;); } catch (Exception e) { e.printStackTrace(); } } /** * 测试 commons-io 中的 FilenameUtils 对文件的操作 */ @Test public void testUtils() { // 如果 字符串 是 路径字符串时，才可用如下方式 // 获取文件名字，包含后缀 String str = FilenameUtils.getName(localImgPath); // 获取文件名字，不包含后缀 String baseName = FilenameUtils.getBaseName(localImgPath); System.out.println(str); System.out.println(baseName); } /** * 测试 jdk1.8 中 关于时间的工具类 */ @Test public void testNewTime() { Instant instant = Instant.now(); // 获取秒 1632641950 System.out.println(instant.getEpochSecond()); // 获取毫秒 1632641950389 System.out.println(instant.toEpochMilli()); // 获取纳秒 389000000 System.out.println(instant.getNano()); } } 特别注意上面的裁剪成圆形图像的方法，最后输出的文件格式要是png的才可以，至于原因我暂时不清楚。 文章参考：https://blog.csdn.net/jiachunchun/article/details/89670721\n","date":"2021-09-26","externalUrl":null,"permalink":"/posts/java%E4%BB%A3%E7%A0%81%E5%AE%9E%E7%8E%B0%E8%A3%81%E5%89%AA%E5%9B%BE%E5%83%8F/","section":"文章","summary":"","title":"Java代码实现裁剪图像","type":"posts"},{"content":"","date":"2021-08-23","externalUrl":null,"permalink":"/tags/springboot/","section":"Tags","summary":"","title":"SpringBoot","type":"tags"},{"content":" 概述 # Logback是一个日志框架，Logback和Log4j都是开源的日志工具库，Logback是Log4j的改良版本，内置实现了slf4j，比Log4j拥有更多的特性，性能也带来很大提升。SpringBoot默认内置了Logback日志框架，Spring Boot 集成logback需要添加 spring-boot-starter-logging 依赖，而此依赖已经在 spring-boot-starter 中添加过了，所以不用再添加此依赖了(如下图) ： Log4j建议只使用四个级别，优先级从高到低分别是 ERROR、WARN、INFO、DEBUG，优先级高的将被打印出来。（logback通用） 通过定义级别，可以作为应用程序中相应级别的日志信息的开关。\n比如在这里定义了INFO级别，则应用程序中所有DEBUG级别的日志信息将不被打印出来。（设置INFO级别，即：\u0026gt;=INFO 生效* 项目上生产环境的时候一定得把debug的日志级别重新调为warn或者更高，避免产生大量日志。\n配置详解 # 默认情况下，SpringBoot会用Logback来记录日志，并用INFO级别输出到控制台。 配置Logback常用节点结构图： configuration # 根节点 \u0026lt;configuration\u0026gt; 下面包含三个属性：\nscan: 当此属性设置为true时，配置文件如果发生改变，将会被重新加载，默认值为true。 scanPeriod: 设置监测配置文件是否有修改的时间间隔，如果没有给出时间单位，默认单位是毫秒。当scan为true时，此属性生效。默认的时间间隔为1分钟。 debug: 当此属性设置为true时，将打印出logback内部日志信息，实时查看logback运行状态。默认值为false。示例： \u0026lt;configuration scan=\u0026#34;true\u0026#34; scanPeriod=\u0026#34;60 seconds\u0026#34; debug=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;!--其他配置省略--\u0026gt; \u0026lt;/configuration\u0026gt; appender # \u0026lt;appender\u0026gt;：负责谢日志的组件，它有两个必要属性name和class。name指定appender名称，class指定appender的全限定名。\nConsoleAppender # ConsoleAppender 把日志输出到控制台，有以下子节点：\n\u0026lt;encoder\u0026gt; ：对日志进行格式化\n\u0026lt;target\u0026gt;：字符串System.out（默认）或者System.err\n示例：把 \u0026gt;=DEBUG 级别的日志都输出到控制台\n\u0026lt;configuration\u0026gt; \u0026lt;appender name=\u0026#34;STDOUT\u0026#34; class=\u0026#34;ch.qos.logback.core.ConsoleAppender\u0026#34;\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt;%-4relative [%thread] %-5level %logger{35} - %msg %n\u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;root level=\u0026#34;DEBUG\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;STDOUT\u0026#34; /\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/configuration\u0026gt; FileAppender # \u0026lt;FileAppender\u0026gt;：把日志添加到文件，有以下子节点：\n\u0026lt;file\u0026gt;：被写入的文件名，可以是相对目录，也可以是绝对目录，如果上级目录不存在会自动创建，没有默认值。 \u0026lt;append\u0026gt; ：如果是 true，日志被追加到文件结尾，如果是 false，清空现存文件，默认是true。 \u0026lt;encoder\u0026gt; ：对记录事件进行格式化。（具体参数稍后讲解 ） \u0026lt;prudent\u0026gt; ：如果是 true，日志会被安全的写入文件，即使其他的FileAppender也在向此文件做写入操作，效率低，默认是 false。 示例：把 \u0026gt;= DEBUG 级别的日志都输出到 testFile.log 文件：\n\u0026lt;configuration\u0026gt; \u0026lt;appender name=\u0026#34;FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.FileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;testFile.log\u0026lt;/file\u0026gt; \u0026lt;append\u0026gt;true\u0026lt;/append\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt;%-4relative [%thread] %-5level %logger{35} - %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;root level=\u0026#34;DEBUG\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;FILE\u0026#34; /\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/configuration\u0026gt; RollingFileAppender # \u0026lt;RollingFileAppender\u0026gt; ：滚动记录文件，先将日志记录到指定文件，当符合某个条件时，将日志记录到其它文件。有以下子节点：\n\u0026lt;file\u0026gt; ：被写入的文件名，可以是相对目录，也可以是绝对目录，如果上级目录不存在会自动创建，没有默认值。 \u0026lt;append\u0026gt; ：如果是 true，日志被追加到文件结尾，如果是 false，清空现存文件，默认是true。 \u0026lt;rollingPolicy\u0026gt; : 当发生滚动时，决定RollingFileAppender的行为，涉及文件移动和重命名。属性class定义具体的滚动策略类 TimeBasedRollingPolicy # class=\u0026quot;ch.qos.logback.core.rolling.TimeBasedRollingPolicy： 最常用的滚动策略，它根据时间来制定滚动策略，既负责滚动也负责出发滚动。有以下子节点：\n：必要节点，包含文件名及“%d”转换符，“%d”可以包含一个java.text.SimpleDateFormat指定的时间格式，如：%d{yyyy-MM}。 如果直接使用 %d，默认格式是 yyyy-MM-dd。RollingFileAppender的file字节点可有可无，通过设置file，可以为活动文件和归档文件指定不同位置，当前日志总是记录到file指定的文件（活动文件），活动文件的名字不会改变； 如果没设置file，活动文件的名字会根据fileNamePattern 的值，每隔一段时间改变一次。“/”或者“\\”会被当做目录分隔符。 : 可选节点，控制保留的归档文件的最大数量，超出数量就删除旧文件。假设设置每个月滚动，且是6，则只保存最近6个月的文件，删除之前的旧文件。注意，删除旧文件是，那些为了归档而创建的目录也会被删除。 SizeBasedTriggeringPolicy # class=\u0026quot;ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy ： 查看当前活动文件的大小，如果超过指定大小会告知RollingFileAppender 触发当前活动文件滚动。只有一个节点:\n: 这是活动文件的大小，默认值是10MB。 ：当为true时，不支持FixedWindowRollingPolicy。支持TimeBasedRollingPolicy，但是有两个限制，1不支持也不允许文件压缩，2不能设置file属性，必须留空。 : 告知 RollingFileAppender 合适激活滚动。 FixedWindowRollingPolicy # class=\u0026quot;ch.qos.logback.core.rolling.FixedWindowRollingPolicy 根据固定窗口算法重命名文件的滚动策略。有以下子节点：\n: 窗口索引最小值 : 窗口索引最大值，当用户指定的窗口过大时，会自动将窗口设置为12。 : 必须包含“%i”例如，假设最小值和最大值分别为1和2，命名模式为 mylog%i.log,会产生归档文件mylog1.log和mylog2.log。还可以指定文件压缩选项，例如，mylog%i.log.gz 或者 没有log%i.log.zip **示例：**每天生成一个日志文件，保存30天的日志文件：\n\u0026lt;configuration\u0026gt; \u0026lt;appender name=\u0026#34;FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;fileNamePattern\u0026gt;logFile.%d{yyyy-MM-dd}.log\u0026lt;/fileNamePattern\u0026gt; \u0026lt;maxHistory\u0026gt;30\u0026lt;/maxHistory\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt;%-4relative [%thread] %-5level %logger{35} - %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;root level=\u0026#34;DEBUG\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;FILE\u0026#34; /\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;logger\u0026gt; # \u0026lt;logger\u0026gt; ：用来设置某一个包或具体的某一个类的日志打印级别、以及指定。\n```： 仅有一个name属性，一个可选的level和一个可选的addtivity属性。\n可以包含零个或多个元素，标识这个appender将会添加到这个logger。 name: 用来指定受此loger约束的某一个包或者具体的某一个类。 level: 用来设置打印级别，大小写无关：TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF，还有一个特殊值INHERITED或者同义词NULL，代表强制执行上级的级别。 如果未设置此属性，那么当前loger将会继承上级的级别。 addtivity: 是否向上级logger传递打印信息。默认是true。可以包含零个或多个元素，标识这个appender将会添加到这个logger。 \u0026lt;root\u0026gt; # 子节点:它也是元素，但是它是根loger,是所有的上级。只有一个level属性，因为name已经被命名为\u0026quot;root\u0026quot;,且已经是最上级了。\nlevel: 用来设置打印级别，大小写无关：TRACE, DEBUG, INFO, WARN, ERROR, ALL和OFF，不能设置为INHERITED或者同义词NULL。 默认是DEBUG。\n同一样，可以包含零个或多个元素，标识这个appender将会添加到这个logger。\n**示例：**常用logger配置：\n\u0026lt;!-- show parameters for hibernate sql 专为 Hibernate 定制 --\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.type.descriptor.sql.BasicBinder\u0026#34; level=\u0026#34;TRACE\u0026#34; /\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.type.descriptor.sql.BasicExtractor\u0026#34; level=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.SQL\u0026#34; level=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.engine.QueryParameters\u0026#34; level=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.engine.query.HQLQueryPlan\u0026#34; level=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;!--myibatis log configure--\u0026gt; \u0026lt;logger name=\u0026#34;com.apache.ibatis\u0026#34; level=\u0026#34;TRACE\u0026#34;/\u0026gt; \u0026lt;logger name=\u0026#34;java.sql.Connection\u0026#34; level=\u0026#34;DEBUG\u0026#34;/\u0026gt; \u0026lt;logger name=\u0026#34;java.sql.Statement\u0026#34; level=\u0026#34;DEBUG\u0026#34;/\u0026gt; \u0026lt;logger name=\u0026#34;java.sql.PreparedStatement\u0026#34; level=\u0026#34;DEBUG\u0026#34;/\u0026gt; \u0026lt;contextName\u0026gt; # 子节点：用来设置上下文名称，每个logger都关联到logger上下文，默认上下文名称为default。但可以使用设置成其他名字，用于区分不同应用程序的记录。一旦设置，不能修改。\n示例：\n\u0026lt;configuration scan=\u0026#34;true\u0026#34; scanPeriod=\u0026#34;60 seconds\u0026#34; debug=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;contextName\u0026gt;myAppName\u0026lt;/contextName\u0026gt; \u0026lt;!--其他配置省略--\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;property\u0026gt; # 子节点 ：用来定义变量值，它有两个属性name和value，通过定义的值会被插入到 logger 上下文中，可以通过 ${} 来使用变量。　name: 变量的名称 value: 的值时变量定义的值\n示例：\n\u0026lt;configuration scan=\u0026#34;true\u0026#34; scanPeriod=\u0026#34;60 seconds\u0026#34; debug=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;property name=\u0026#34;APP_Name\u0026#34; value=\u0026#34;myAppName\u0026#34; /\u0026gt; \u0026lt;contextName\u0026gt;${APP_Name}\u0026lt;/contextName\u0026gt; \u0026lt;!--其他配置省略--\u0026gt; \u0026lt;/configuration\u0026gt; \u0026lt;timestamp\u0026gt; # 子节点 ：获取时间戳字符串，他有两个属性key和datePattern。\nkey: 标识此 的名字； datePattern: 设置将当前时间（解析配置文件的时间）转换为字符串的模式，遵循java.txt.SimpleDateFormat的格式。\n示例：\n\u0026lt;configuration scan=\u0026#34;true\u0026#34; scanPeriod=\u0026#34;60 seconds\u0026#34; debug=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;timestamp key=\u0026#34;bySecond\u0026#34; datePattern=\u0026#34;yyyyMMdd\u0026#39;T\u0026#39;HHmmss\u0026#34;/\u0026gt; \u0026lt;contextName\u0026gt;${bySecond}\u0026lt;/contextName\u0026gt; \u0026lt;!-- 其他配置省略--\u0026gt; \u0026lt;/configuration\u0026gt; 完整配置demo # 示例一 # \u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;configuration debug=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;!--定义日志文件的存储地址，如果是在window中可以使用/开头的绝对地址，在linux中不要使用 / 开头的地址，因为其表示绝对地址，linux中要使用相对地址时 不要以 盘符开头即可--\u0026gt; \u0026lt;property name=\u0026#34;logPath\u0026#34; value=\u0026#34;/logs\u0026#34; /\u0026gt; \u0026lt;!--日志文件保留天数，最长支持30天--\u0026gt; \u0026lt;property name=\u0026#34;MaxHistory\u0026#34; value=\u0026#34;30\u0026#34;/\u0026gt; \u0026lt;!--日志文件最大的大小，支持KB，MB--\u0026gt; \u0026lt;property name=\u0026#34;MaxFileSize\u0026#34; value=\u0026#34;100MB\u0026#34;/\u0026gt; \u0026lt;!--控制台日志， 控制台输出 --\u0026gt; \u0026lt;appender name=\u0026#34;STDOUT\u0026#34; class=\u0026#34;ch.qos.logback.core.ConsoleAppender\u0026#34;\u0026gt; \u0026lt;encoder class=\u0026#34;ch.qos.logback.classic.encoder.PatternLayoutEncoder\u0026#34;\u0026gt; \u0026lt;!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度,%msg：日志消息，%n是换行符--\u0026gt; \u0026lt;pattern\u0026gt;%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!--文件日志， 按照每天生成日志文件 --\u0026gt; \u0026lt;appender name=\u0026#34;FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;!--日志文件输出的文件名--\u0026gt; \u0026lt;FileNamePattern\u0026gt;${logPath}/TestWeb.log.%d{yyyy-MM-dd}.log\u0026lt;/FileNamePattern\u0026gt; \u0026lt;!--日志文件保留天数--\u0026gt; \u0026lt;MaxHistory\u0026gt;${MaxHistory}\u0026lt;/MaxHistory\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;encoder class=\u0026#34;ch.qos.logback.classic.encoder.PatternLayoutEncoder\u0026#34;\u0026gt; \u0026lt;!--格式化输出：%d表示日期，%thread表示线程名，%-5level：级别从左显示5个字符宽度%msg：日志消息，%n是换行符--\u0026gt; \u0026lt;pattern\u0026gt;%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;!--日志文件最大的大小--\u0026gt; \u0026lt;triggeringPolicy class=\u0026#34;ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy\u0026#34;\u0026gt; \u0026lt;MaxFileSize\u0026gt;${MaxFileSize}\u0026lt;/MaxFileSize\u0026gt; \u0026lt;/triggeringPolicy\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- show parameters for hibernate sql 专为 Hibernate 定制 --\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.type.descriptor.sql.BasicBinder\u0026#34; level=\u0026#34;TRACE\u0026#34; /\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.type.descriptor.sql.BasicExtractor\u0026#34; level=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.SQL\u0026#34; level=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.engine.QueryParameters\u0026#34; level=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.engine.query.HQLQueryPlan\u0026#34; level=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;!--mybatis log configure--\u0026gt; \u0026lt;logger name=\u0026#34;com.apache.ibatis\u0026#34; level=\u0026#34;TRACE\u0026#34;/\u0026gt; \u0026lt;logger name=\u0026#34;java.sql.Connection\u0026#34; level=\u0026#34;DEBUG\u0026#34;/\u0026gt; \u0026lt;logger name=\u0026#34;java.sql.Statement\u0026#34; level=\u0026#34;DEBUG\u0026#34;/\u0026gt; \u0026lt;logger name=\u0026#34;java.sql.PreparedStatement\u0026#34; level=\u0026#34;DEBUG\u0026#34;/\u0026gt; \u0026lt;!-- 日志输出级别 --\u0026gt; \u0026lt;root level=\u0026#34;DEBUG\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;STDOUT\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;FILE\u0026#34;/\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/configuration\u0026gt; 示例二：过滤掉某些级别的信息 # 我们把debug，error，info等级别的日志，都分开，分别打印输出在不同的文件中。\n需要做的就是，在不同的 日志级别中 过滤掉即可。\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;utf-8\u0026#34; ?\u0026gt; \u0026lt;configuration\u0026gt; \u0026lt;!-- 控制台输出日志 --\u0026gt; \u0026lt;appender name=\u0026#34;consoleLog\u0026#34; class=\u0026#34;ch.qos.logback.core.ConsoleAppender\u0026#34;\u0026gt; \u0026lt;layout class=\u0026#34;ch.qos.logback.classic.PatternLayout\u0026#34;\u0026gt; \u0026lt;pattern\u0026gt; %d - %msg%n \u0026lt;!-- 控制台打印日志文件体 时间-信息 --\u0026gt; \u0026lt;/pattern\u0026gt; \u0026lt;/layout\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 输出info级别的日志 --\u0026gt; \u0026lt;appender name=\u0026#34;infoLog\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;!-- 在info中过滤掉掉 error 级别的信息 --\u0026gt; \u0026lt;filter class=\u0026#34;ch.qos.logback.classic.filter.LevelFilter\u0026#34;\u0026gt; \u0026lt;level\u0026gt;ERROR\u0026lt;/level\u0026gt; \u0026lt;onMatch\u0026gt;DENY\u0026lt;/onMatch\u0026gt; \u0026lt;!-- 如果命中就禁止这条日志 --\u0026gt; \u0026lt;onMismatch\u0026gt;ACCEPT\u0026lt;/onMismatch\u0026gt; \u0026lt;!-- 如果没有命中就使用这条规则 --\u0026gt; \u0026lt;/filter\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt; %msg%n \u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;!-- 滚动策略 --\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;!-- 设置info日志路径 --\u0026gt; \u0026lt;fileNamePattern\u0026gt;E:\\\\IntelliJ IDEA\\\\logback\\\\info.%d.log\u0026lt;/fileNamePattern\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 输出error级别的日志 --\u0026gt; \u0026lt;appender name=\u0026#34;errorLog\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;!-- 过滤日志 --\u0026gt; \u0026lt;filter class=\u0026#34;ch.qos.logback.classic.filter.ThresholdFilter\u0026#34;\u0026gt; \u0026lt;level\u0026gt;ERROR\u0026lt;/level\u0026gt; \u0026lt;/filter\u0026gt; \u0026lt;encoder\u0026gt; \u0026lt;pattern\u0026gt; %msg%n \u0026lt;/pattern\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;!-- 滚动策略 --\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.TimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;!-- 设置error日志路径 --\u0026gt; \u0026lt;fileNamePattern\u0026gt;E:\\\\IntelliJ IDEA\\\\logback\\\\error.%d.log\u0026lt;/fileNamePattern\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 设置默认日志级别为INFO，一般都设置为info --\u0026gt; \u0026lt;root level=\u0026#34;info\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;consoleLog\u0026#34;/\u0026gt; \u0026lt;appender-ref ref=\u0026#34;infoLog\u0026#34;/\u0026gt; \u0026lt;appender-ref ref=\u0026#34;errorLog\u0026#34;/\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/configuration\u0026gt; 可以结合示例一进行优化。\n示例三：自动压缩存储按照日期分割后的日志 # 这个日志配置文件是我部署在线上的个人博客使用的，已经经过验证了。生成的日志格式如下：\n\u0026lt;?xml version=\u0026#34;1.0\u0026#34; encoding=\u0026#34;UTF-8\u0026#34;?\u0026gt; \u0026lt;configuration debug=\u0026#34;true\u0026#34;\u0026gt; \u0026lt;!-- 项目名称 --\u0026gt; \u0026lt;property name=\u0026#34;PROJECT_NAME\u0026#34; value=\u0026#34;small-and-beautiful-blog\u0026#34; /\u0026gt; \u0026lt;!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径--\u0026gt; \u0026lt;property name=\u0026#34;LOG_HOME\u0026#34; value=\u0026#34;./logs\u0026#34; /\u0026gt; \u0026lt;!-- 控制台输出 --\u0026gt; \u0026lt;appender name=\u0026#34;CONSOLE\u0026#34; class=\u0026#34;ch.qos.logback.core.ConsoleAppender\u0026#34;\u0026gt; \u0026lt;withJansi\u0026gt;false\u0026lt;/withJansi\u0026gt; \u0026lt;encoder class=\u0026#34;ch.qos.logback.classic.encoder.PatternLayoutEncoder\u0026#34;\u0026gt; \u0026lt;!-- 格式化输出: %d: 日期; %-5level: 级别从左显示5个字符宽度; %thread: 线程名; %logger: 类名; %M: 方法名; %line: 行号; %msg: 日志消息; %n: 换行符 --\u0026gt; \u0026lt;pattern\u0026gt;[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;charset\u0026gt;UTF-8\u0026lt;/charset\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- ERROR日志文件,记录错误日志 --\u0026gt; \u0026lt;appender name=\u0026#34;ERROR_FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;${LOG_HOME}/${PROJECT_NAME}/error.log\u0026lt;/file\u0026gt; \u0026lt;!-- 过滤器，只打印ERROR级别的日志 --\u0026gt; \u0026lt;filter class=\u0026#34;ch.qos.logback.classic.filter.LevelFilter\u0026#34;\u0026gt; \u0026lt;level\u0026gt;ERROR\u0026lt;/level\u0026gt; \u0026lt;onMatch\u0026gt;ACCEPT\u0026lt;/onMatch\u0026gt; \u0026lt;onMismatch\u0026gt;DENY\u0026lt;/onMismatch\u0026gt; \u0026lt;/filter\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;!--日志文件输出的文件名--\u0026gt; \u0026lt;FileNamePattern\u0026gt;${LOG_HOME}/${PROJECT_NAME}/%d{yyyy-MM-dd}/error.%i.zip\u0026lt;/FileNamePattern\u0026gt; \u0026lt;!--日志文件保留天数--\u0026gt; \u0026lt;MaxHistory\u0026gt;3650\u0026lt;/MaxHistory\u0026gt; \u0026lt;!--日志文件最大的大小--\u0026gt; \u0026lt;MaxFileSize\u0026gt;100MB\u0026lt;/MaxFileSize\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;encoder class=\u0026#34;ch.qos.logback.classic.encoder.PatternLayoutEncoder\u0026#34;\u0026gt; \u0026lt;!-- 格式化输出: %d: 日期; %-5level: 级别从左显示5个字符宽度; %thread: 线程名; %logger: 类名; %M: 方法名; %line: 行号; %msg: 日志消息; %n: 换行符 --\u0026gt; \u0026lt;pattern\u0026gt;[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;charset\u0026gt;UTF-8\u0026lt;/charset\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- INFO日志文件，用于记录重要日志信息 --\u0026gt; \u0026lt;appender name=\u0026#34;INFO_FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;${LOG_HOME}/${PROJECT_NAME}/info.log\u0026lt;/file\u0026gt; \u0026lt;!-- 过滤器，只打印INFO级别的日志 --\u0026gt; \u0026lt;filter class=\u0026#34;ch.qos.logback.classic.filter.LevelFilter\u0026#34;\u0026gt; \u0026lt;level\u0026gt;INFO\u0026lt;/level\u0026gt; \u0026lt;onMatch\u0026gt;ACCEPT\u0026lt;/onMatch\u0026gt; \u0026lt;onMismatch\u0026gt;DENY\u0026lt;/onMismatch\u0026gt; \u0026lt;/filter\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;!--日志文件输出的文件名--\u0026gt; \u0026lt;FileNamePattern\u0026gt;${LOG_HOME}/${PROJECT_NAME}/%d{yyyy-MM-dd}/info.%i.zip\u0026lt;/FileNamePattern\u0026gt; \u0026lt;!--日志文件保留天数--\u0026gt; \u0026lt;MaxHistory\u0026gt;3650\u0026lt;/MaxHistory\u0026gt; \u0026lt;!--日志文件最大的大小--\u0026gt; \u0026lt;MaxFileSize\u0026gt;100MB\u0026lt;/MaxFileSize\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;encoder class=\u0026#34;ch.qos.logback.classic.encoder.PatternLayoutEncoder\u0026#34;\u0026gt; \u0026lt;!-- 格式化输出: %d: 日期; %-5level: 级别从左显示5个字符宽度; %thread: 线程名; %logger: 类名; %M: 方法名; %line: 行号; %msg: 日志消息; %n: 换行符 --\u0026gt; \u0026lt;pattern\u0026gt;[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;charset\u0026gt;UTF-8\u0026lt;/charset\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 打印的SQL日志文件，用于执行的SQL语句和参数信息 --\u0026gt; \u0026lt;appender name=\u0026#34;SQL_FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;${LOG_HOME}/${PROJECT_NAME}/sql.log\u0026lt;/file\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;!--日志文件输出的文件名--\u0026gt; \u0026lt;FileNamePattern\u0026gt;${LOG_HOME}/${PROJECT_NAME}/%d{yyyy-MM-dd}/sql.%i.zip\u0026lt;/FileNamePattern\u0026gt; \u0026lt;!--日志文件保留天数--\u0026gt; \u0026lt;MaxHistory\u0026gt;3650\u0026lt;/MaxHistory\u0026gt; \u0026lt;!--日志文件最大的大小--\u0026gt; \u0026lt;MaxFileSize\u0026gt;100MB\u0026lt;/MaxFileSize\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;encoder class=\u0026#34;ch.qos.logback.classic.encoder.PatternLayoutEncoder\u0026#34;\u0026gt; \u0026lt;!-- 格式化输出: %d: 日期; %-5level: 级别从左显示5个字符宽度; %thread: 线程名; %logger: 类名; %M: 方法名; %line: 行号; %msg: 日志消息; %n: 换行符 --\u0026gt; \u0026lt;pattern\u0026gt;[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line] - %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;charset\u0026gt;UTF-8\u0026lt;/charset\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- API请求被访问的日志文件，记录请求的URL和携带的参数 --\u0026gt; \u0026lt;appender name=\u0026#34;REQUEST_FILE\u0026#34; class=\u0026#34;ch.qos.logback.core.rolling.RollingFileAppender\u0026#34;\u0026gt; \u0026lt;file\u0026gt;${LOG_HOME}/${PROJECT_NAME}/request.log\u0026lt;/file\u0026gt; \u0026lt;rollingPolicy class=\u0026#34;ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy\u0026#34;\u0026gt; \u0026lt;!--日志文件输出的文件名--\u0026gt; \u0026lt;FileNamePattern\u0026gt;${LOG_HOME}/${PROJECT_NAME}/%d{yyyy-MM-dd}/request.%i.zip\u0026lt;/FileNamePattern\u0026gt; \u0026lt;!--日志文件保留天数--\u0026gt; \u0026lt;MaxHistory\u0026gt;3650\u0026lt;/MaxHistory\u0026gt; \u0026lt;!--日志文件最大的大小--\u0026gt; \u0026lt;MaxFileSize\u0026gt;100MB\u0026lt;/MaxFileSize\u0026gt; \u0026lt;/rollingPolicy\u0026gt; \u0026lt;encoder class=\u0026#34;ch.qos.logback.classic.encoder.PatternLayoutEncoder\u0026#34;\u0026gt; \u0026lt;!-- 格式化输出: %d: 日期; %-5level: 级别从左显示5个字符宽度; %thread: 线程名; %logger: 类名; %M: 方法名; %line: 行号; %msg: 日志消息; %n: 换行符 --\u0026gt; \u0026lt;pattern\u0026gt;[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] [%logger{50}] [%M] [%line]- %msg%n\u0026lt;/pattern\u0026gt; \u0026lt;charset\u0026gt;UTF-8\u0026lt;/charset\u0026gt; \u0026lt;/encoder\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 异步输出INFO_FILE --\u0026gt; \u0026lt;appender name=\u0026#34;ASYNC_INFO_FILE\u0026#34; class=\u0026#34;ch.qos.logback.classic.AsyncAppender\u0026#34;\u0026gt; \u0026lt;!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --\u0026gt; \u0026lt;queueSize\u0026gt;256\u0026lt;/queueSize\u0026gt; \u0026lt;!-- 默认情况下，当阻塞队列的剩余容量为20％时，它将丢弃TRACE，DEBUG和INFO级别的事件，仅保留WARN和ERROR级别的事件。要保留所有事件，请将discardingThreshold设置为0。 --\u0026gt; \u0026lt;discardingThreshold\u0026gt;0\u0026lt;/discardingThreshold\u0026gt; \u0026lt;!-- 添加附加的appender,使用前面定义的name,最多只能添加一个 --\u0026gt; \u0026lt;appender-ref ref=\u0026#34;INFO_FILE\u0026#34;/\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 异步输出ERROR_FILE --\u0026gt; \u0026lt;appender name=\u0026#34;ASYNC_ERROR_FILE\u0026#34; class=\u0026#34;ch.qos.logback.classic.AsyncAppender\u0026#34;\u0026gt; \u0026lt;!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --\u0026gt; \u0026lt;queueSize\u0026gt;256\u0026lt;/queueSize\u0026gt; \u0026lt;!-- 默认情况下，当阻塞队列的剩余容量为20％时，它将丢弃TRACE，DEBUG和INFO级别的事件，仅保留WARN和ERROR级别的事件。要保留所有事件，请将discardingThreshold设置为0。 --\u0026gt; \u0026lt;discardingThreshold\u0026gt;0\u0026lt;/discardingThreshold\u0026gt; \u0026lt;!-- 添加附加的appender,使用前面定义的name,最多只能添加一个 --\u0026gt; \u0026lt;appender-ref ref=\u0026#34;ERROR_FILE\u0026#34;/\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 异步输出SQL_FILE --\u0026gt; \u0026lt;appender name=\u0026#34;ASYNC_SQL_FILE\u0026#34; class=\u0026#34;ch.qos.logback.classic.AsyncAppender\u0026#34;\u0026gt; \u0026lt;!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --\u0026gt; \u0026lt;queueSize\u0026gt;256\u0026lt;/queueSize\u0026gt; \u0026lt;!-- 默认情况下，当阻塞队列的剩余容量为20％时，它将丢弃TRACE，DEBUG和INFO级别的事件，仅保留WARN和ERROR级别的事件。要保留所有事件，请将discardingThreshold设置为0。 --\u0026gt; \u0026lt;discardingThreshold\u0026gt;0\u0026lt;/discardingThreshold\u0026gt; \u0026lt;!-- 添加附加的appender,使用前面定义的name,最多只能添加一个 --\u0026gt; \u0026lt;appender-ref ref=\u0026#34;SQL_FILE\u0026#34;/\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 异步输出REQUEST_FILE --\u0026gt; \u0026lt;appender name=\u0026#34;ASYNC_REQUEST_FILE\u0026#34; class=\u0026#34;ch.qos.logback.classic.AsyncAppender\u0026#34;\u0026gt; \u0026lt;!-- 更改默认的队列的深度,该值会影响性能.默认值为256 --\u0026gt; \u0026lt;queueSize\u0026gt;256\u0026lt;/queueSize\u0026gt; \u0026lt;!-- 默认情况下，当阻塞队列的剩余容量为20％时，它将丢弃TRACE，DEBUG和INFO级别的事件，仅保留WARN和ERROR级别的事件。要保留所有事件，请将discardingThreshold设置为0。 --\u0026gt; \u0026lt;discardingThreshold\u0026gt;0\u0026lt;/discardingThreshold\u0026gt; \u0026lt;!-- 添加附加的appender,使用前面定义的name,最多只能添加一个 --\u0026gt; \u0026lt;appender-ref ref=\u0026#34;REQUEST_FILE\u0026#34;/\u0026gt; \u0026lt;/appender\u0026gt; \u0026lt;!-- 输出error信息到文件--\u0026gt; \u0026lt;logger name=\u0026#34;error\u0026#34; additivity=\u0026#34;true\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;ERROR_FILE\u0026#34;/\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;!-- 输出info信息到文件--\u0026gt; \u0026lt;logger name=\u0026#34;info\u0026#34; additivity=\u0026#34;true\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;INFO_FILE\u0026#34;/\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;!-- 输出request信息到文件--\u0026gt; \u0026lt;logger name=\u0026#34;request\u0026#34; level=\u0026#34;INFO\u0026#34; additivity=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;REQUEST_FILE\u0026#34; /\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;!-- 输出SQL到控制台和文件--\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.SQL\u0026#34; additivity=\u0026#34;false\u0026#34;\u0026gt; \u0026lt;level value=\u0026#34;DEBUG\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;SQL_FILE\u0026#34; /\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;!-- 输出SQL的参数到控制台和文件--\u0026gt; \u0026lt;logger name=\u0026#34;org.hibernate.type.descriptor.sql.BasicBinder\u0026#34; additivity=\u0026#34;false\u0026#34; level=\u0026#34;TRACE\u0026#34;\u0026gt; \u0026lt;level value=\u0026#34;TRACE\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;SQL_FILE\u0026#34; /\u0026gt; \u0026lt;/logger\u0026gt; \u0026lt;!-- 开发环境下的日志配置 --\u0026gt; \u0026lt;springProfile name=\u0026#34;dev\u0026#34;\u0026gt; \u0026lt;root level=\u0026#34;INFO\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;CONSOLE\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;ERROR_FILE\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;INFO_FILE\u0026#34; /\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/springProfile\u0026gt; \u0026lt;!-- 测试环境下的日志配置 --\u0026gt; \u0026lt;springProfile name=\u0026#34;test\u0026#34;\u0026gt; \u0026lt;root level=\u0026#34;INFO\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;CONSOLE\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;ERROR_FILE\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;INFO_FILE\u0026#34; /\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/springProfile\u0026gt; \u0026lt;!-- 生产环境下的日志配置 --\u0026gt; \u0026lt;springProfile name=\u0026#34;prod\u0026#34;\u0026gt; \u0026lt;root level=\u0026#34;INFO\u0026#34;\u0026gt; \u0026lt;appender-ref ref=\u0026#34;CONSOLE\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;ERROR_FILE\u0026#34; /\u0026gt; \u0026lt;appender-ref ref=\u0026#34;INFO_FILE\u0026#34; /\u0026gt; \u0026lt;/root\u0026gt; \u0026lt;/springProfile\u0026gt; \u0026lt;/configuration\u0026gt; 在application.properties中通过 logging.config=classpath:xxx.xml 来指定配置文件。\n如果需要将第三方框架或库的错误和异常信息（比如Kafka）也写入日志，请参考文章\n本文参考于 https://www.cnblogs.com/gavincoder/p/10091757.html 和 https://www.cnblogs.com/huzhihu/p/8075158.html ，在此表示感谢。\n","date":"2021-08-23","externalUrl":null,"permalink":"/posts/springboot%E4%B9%8Blogback%E6%97%A5%E5%BF%97%E6%96%87%E4%BB%B6%E9%85%8D%E7%BD%AE/","section":"文章","summary":"","title":"SpringBoot之Logback日志文件配置","type":"posts"},{"content":"","date":"2021-06-22","externalUrl":null,"permalink":"/tags/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B/","section":"Tags","summary":"","title":"网络编程","type":"tags"},{"content":" Java共支持三种网络编程模式：BIO，NIO，AIO # 三种IO模式适用场景 # BIO方式适用于连接数目比较小且固定的架构，这种方式对服务器资源要求比较高，并发有局限性，JDK1.4以前是唯一的选择，好处是编码实现方式简单，且也容易理解。 NIO方式适用于连接数目多且连接比较段的架构，比如聊天服务器，弹幕系统等，相比BIO编码较复杂，JDK1.4以后开始支持。 AIO方式适用于连接数据多且连接较长的场景，比如相册服务器等，编程较复杂，JDK1.7才开始支持。目前好像并为得到广泛使用。 BIO(blocking I/O) 基本介绍 # Java BIO是传统的Java io编程，相关的类和接口在java.io包中 Java BIO：同步阻塞，一个连接为一个线程，连接一个客户端就需要启动一个线程进行处理，如果连接未断开且未做任何事，会造会不必要的开销。可以通过线程池优化。 Java BIO：适用于连接数目较小且相对固定的架构，对服务器的要求比较高，对并发有局限性。JDK1.4以前唯一的选择，简单易理解。\nBIO的原理示意图 # 流程 # 服务器启动ServerSoket。 客户端启动Socket与服务器通信，默认情况下服务器需要对每个客户端建立一个线程与之通信。 客户端发出请求与服务器通信。 如果请求成功，客户端会等待请求结束后继续执行。 Java BIO应用实例 # 实例要求：\n使用NIO编写服务端，监听8888端口号，当有客户端连接时，启动一个线程与之通信。 使用线程池改进，可以连接多个客户端。\n服务端\npackage com.crazy.io.bio; import java.io.IOException; import java.io.InputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; public class BIOServer { public static void main(String[] args) throws IOException { /** * 1.创建一个线程池 * 如果有客户端连接了，就创建一个线程与之通信。 */ ExecutorService newCachedThreadPool = Executors.newCachedThreadPool(); // 创建ServerSocket ServerSocket serverSocket = new ServerSocket(6668); System.out.println(\u0026#34;服务器启动了\u0026#34;); while (true) { // 监听，等待客户端连接 final Socket socket = serverSocket.accept(); System.out.println(\u0026#34;连接到了一个客户端\u0026#34;); newCachedThreadPool.execute(new Runnable() { @Override public void run() { // 可以和客户端通讯 handler(socket); } }); } } // 编写一个handler方法，与客户端通讯 public static void handler(Socket socket) { // 通过socket获取输入流 try { System.out.println(\u0026#34;线程信息 id=\u0026#34; + Thread.currentThread().getId() + \u0026#34;线程名字=\u0026#34; + Thread.currentThread().getName()); InputStream inputStream = socket.getInputStream(); byte[] bytes = new byte[1024]; // 循环的读取客户端发送的数据 while (true) { System.out.println(\u0026#34;线程信息 id=\u0026#34; + Thread.currentThread().getId() + \u0026#34;线程名字=\u0026#34; + Thread.currentThread().getName()); int read = inputStream.read(bytes); if (read != -1) { // 输出客户端发送的数据 System.out.println(new String(bytes, 0, read)); } else { break; } } } catch (Exception e) { e.printStackTrace(); } finally { // 关闭和客户端的连接 try { socket.close(); } catch (Exception e) { e.printStackTrace(); } } } } 客户端\npackage com.crazy.io.zerocopy; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.InputStream; import java.net.Socket; public class OldIOClient { public static void main(String[] args) throws Exception { Socket socket = new Socket(\u0026#34;localhost\u0026#34;, 6668); String fileName = \u0026#34;1.txt\u0026#34;; InputStream inputStream = new FileInputStream(fileName); DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()); byte[] buffer = new byte[4096]; long readCount; long total = 0; long startTime = System.currentTimeMillis(); while ((readCount = inputStream.read(buffer)) \u0026gt;= 0) { total += readCount; dataOutputStream.write(buffer); } System.out.println(\u0026#34;发送总字节数： \u0026#34; + total + \u0026#34;, 耗时： \u0026#34; + (System.currentTimeMillis() - startTime)); dataOutputStream.close(); socket.close(); inputStream.close(); } } 有小伙伴说，我就只想写服务器，不想写客户端，能不能测试。能，我都给你们准备好了。可以使用windows的命令行telnet命令来测试。 telnet 127.0.0.1 6668 连接成功后通过按 Ctrl+] 符号进入发送数据界面 send hello world 查看服务端收到的消息 完成了简单的以BIO实现的客户端与服务器之间的交互。\nJava BIO问题 # 每个请求都需要创建独立的线程。 当并发量大时，需要创建大量线程，占用系统资源。 连接建立后，如果当前线程暂时没有数据可读，则线程就阻塞在 Read 操作上，造成线程资源浪费\nJava NIO( java non-blocking IO) 基本介绍 # Java NIO全称（java non-blocking io），从 JDK1.4 开始，Java 提供了一系列改进的输入/输出的新特性，被统称为 NIO(即 New IO)，是同步非阻塞的。 NIO 相关类都被放在 java.nio 包及子包下，并且对原 java.io 包中的很多类进行了改写。 NIO 有三大核心部分：Channel(通道)，Buffer(缓冲区), Selector(选择器) 。 NIO是 面向缓冲区。数据读取到一个它稍后处理的缓冲区中，需要时可在缓冲区中前后移动，这就增加了处理过程中的灵活性，使用它可以提供非阻塞式的高伸缩性网络。 Java NIO的非阻塞模式，使一个线程从某通道发送请求或者读取数据，但是它仅能得到目前可用的数据，如果目前没有数据可用，就什么都不获取，会继续保持线程阻塞，直至数据变的可以读取之前，该线程可以继续做其他的事情。 非阻塞写也是如此，一个线程请求写入一些数据到某通道，但不需要等待它完全写入，这个线程同时可以去做别的事情。 通俗理解：NIO是可以做到用一个线程来处理多个操作。假设有500个请求过来,根据实际情况，可以分配50或者100个线程来处理。而BIO可能需要创建500个线程来处理数据。 NIO的并发请求要远远大于BIO。\nSelector 、 Channel 和 Buffer 的关系图 # 关系图说明 # 每个channel 都会对应一个Buffer。 Selector 对应一个线程， 一个线程对应多个channel(连接)。 该图反应了有三个channel 注册到 该selector 程序。 程序切换到哪个channel 是有事件决定的, Event 就是一个重要的概念。 Selector 会根据不同的事件，在各个通道上切换。 Buffer 就是一个内存块 ， 底层是有一个数组。 数据的读取写入是通过Buffer, 这个和BIO , BIO 中要么是输入流，或者是输出流, 不能双向，但是 NIO的Buffer 是可以读也可以写, 需要 flip 方法切换。 channel 是双向的, 可以返回底层操作系统的情况, 比如Linux ， 底层的操作系统通道就是双向的。\n什么是缓冲区（Buffer）? # 缓冲区本质上是一个可以读写数据的内存块，可以理解成是一个容器对象(含数组)，该对象提供了一组方法，可以更轻松地使用内存块，缓冲区对象内置了一些机制，能够跟踪和记录缓冲区的状态变化情况。Channel 提供从文件、网络读取数据的渠道，但是读取或写入的数据都必须经由 Buffer。 Buffer常用方法解析 # 常用的ByteBuffer是一个抽象类，继承Buffer，实现了Comparable接口。 mark：标记。 Position：位置，下一个要被读或写的元素的索引，每次读写缓冲区数据时都会改变改值，为下次读写作准备。 Limit：表示缓冲区的当前终点，不能对缓冲区超过极限的位置进行读写操作。且极限是可以修改的。 Capacity：容量，即可以容纳的最大数据量；在缓冲区创建时被设定并且不能改变。\nByteBuffer中常用的方法：\n// 缓冲区创建相关api public static ByteBuffer allocateDirect(int capacity)//创建直接缓冲区 public static ByteBuffer allocate(int capacity)//设置缓冲区的初始容量 public static ByteBuffer wrap(byte[] array)//把一个数组放到缓冲区中使用 //构造初始化位置offset和上界length的缓冲区 public static ByteBuffer wrap(byte[] array,int offset, int length) //缓存区存取相关API public abstract byte get( );//从当前位置position上get，get之后，position会自动+1 public abstract byte get (int index);//从绝对位置get public abstract ByteBuffer put (byte b);//从当前位置上添加，put之后，position会自动+1 public abstract ByteBuffer put (int index, byte b);//从绝对位置上put 通道基本介绍 # 通道可以同时进行读写，而流只能读或者只能写。 通道可以实现异步读写数据。 通道可以从缓冲读数据，也可以写数据到缓冲。 通道说明 # Channel是一个接口。\n常用的 Channel 类有：FileChannel、DatagramChannel、ServerSocketChannel 和 SocketChannel。 ServerSocketChanne 类似 ServerSocket 。 SocketChannel 类似 Socket。\n应用实例 # 实例要求:\n把1.txt中的文件读取到2.txt中。\npublic class NIOFileChannel03 { public static void main(String[] args) throws IOException { FileInputStream fileInputStream = new FileInputStream(\u0026#34;1.txt\u0026#34;); FileChannel inputStreamChannel = fileInputStream.getChannel(); FileOutputStream fileOutputStream = new FileOutputStream(\u0026#34;2.txt\u0026#34;); FileChannel outputStreamChannel = fileOutputStream.getChannel(); ByteBuffer byteBuffer = ByteBuffer.allocate(10); while (true) { byteBuffer.clear(); int read = inputStreamChannel.read(byteBuffer); System.out.println(\u0026#34;read =\u0026#34; + read); if (read == -1) { break; } byteBuffer.flip(); outputStreamChannel.write(byteBuffer); } fileInputStream.close(); inputStreamChannel.close(); outputStreamChannel.close(); fileOutputStream.close(); } } Buffer和Channel的注意事项 # ByteBuffer 支持类型化的put 和 get, put 放入的是什么数据类型，get就应该使用相应的数据类型来取出，否则可能有 BufferUnderflowException 异常。 可以将一个普通Buffer 转成只读Buffer。 NIO 还提供了 MappedByteBuffer， 可以让文件直接在内存（堆外的内存）中进行修改， 而如何同步到文件由NIO 来完成。\nSelector(选择器) # Java 的 NIO，用非阻塞的 IO 方式。可以用一个线程，处理多个的客户端连接，就会使用到Selector(选择器)。 Selector 能够检测多个注册的通道上是否有事件发生，如果有事件发生，便获取事件然后针对每个事件进行相应的处理。这样就可以只用一个单线程去管理多个通道，也就是管理多个连接和请求。 只有在 连接/通道 真正有读写事件发生时，才会进行读写，就大大地减少了系统开销，并且不必为每个连接都创建一个线程，不用去维护多个线程。 避免了多线程之间的上下文切换导致的开销。\nSelector的示意图 # 线程从某客户端 Socket 通道进行读写数据时，若没有数据可用时，该线程可以进行其他任务。 线程通常将非阻塞 IO 的空闲时间用于在其他通道上执行 IO 操作，所以单独的线程可以管理多个输入和输出通道。 由于读写操作都是非阻塞的，这就可以充分提升 IO 线程的运行效率，避免由于频繁 I/O 阻塞导致的线程挂起。 一个 I/O 线程可以并发处理 多个客户端连接和读写操作，这从根本上解决了传统同步阻塞 I/O 一个连接一个线程模型，架构的性能、弹性伸缩能力和可靠性都得到了极大的提升。\nNIO 非阻塞网络编程原理图 # 客户端连接时，会通过ServerSocketChannel 得到 SocketChannel Selector 进行监听 select 方法, 返回有事件发生的通道的个数。 将socketChannel注册到Selector上, register(Selector sel, int ops), 一个selector上可以注册多个SocketChannel。 注册后返回一个 SelectionKey, 会和该Selector 关联(集合) 进一步得到各个 SelectionKey。 在通过 SelectionKey 反向获取 SocketChannel , 方法 channel() 可以通过 得到的 channel , 完成业务处理。\n应用案例 # 编写一个 NIO 入门案例，实现服务器端和客户端之间的数据简单通讯（非阻塞）。\n服务器端\npackage com.crazy.io.nio.buffer; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SelectionKey; import java.nio.channels.Selector; import java.nio.channels.ServerSocketChannel; import java.nio.channels.SocketChannel; import java.util.Iterator; import java.util.Set; public class NIOServer { public static void main(String[] args) throws IOException { // 创建serverSocketChannel ServerSocketChannel serverSocketChannel = ServerSocketChannel.open(); // 创建selector Selector selector = Selector.open(); // 绑定一个端口6666.在服务器监听 serverSocketChannel.socket().bind(new InetSocketAddress(6666)); // 设置为非阻塞 serverSocketChannel.configureBlocking(false); // 把serverSocketChannel注册到selector 关心事件为OP_ACCEPT serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT); // 循环等待客户端连接 while (true) { // 一秒没有事件发生，没有事件发生 if (selector.select(1000) == 0) { System.out.println(\u0026#34;等待了一秒，无连接\u0026#34;); continue; } // 如果返回的大于0,拿到selectionkey集合 // 如果大于0，表示已回去到关注的事件 // 通过selectionkeys反向获取通道 Set\u0026lt;SelectionKey\u0026gt; selectionKeys = selector.selectedKeys(); Iterator\u0026lt;SelectionKey\u0026gt; keyIterator = selectionKeys.iterator(); while (keyIterator.hasNext()) { SelectionKey key = keyIterator.next(); // 根据key对应的通道发生的事件做相应处理 // 有新的客户端来连接了 if (key.isAcceptable()) { SocketChannel socketChannel = serverSocketChannel.accept(); // 将socketChannel设置为非阻塞 socketChannel.configureBlocking(false); System.out.println(\u0026#34;客户端连接成功======\u0026#34;); // 注册到selector上, 关注事件为读，给socketChannel关联一个Buffer socketChannel.register(selector, SelectionKey.OP_READ, ByteBuffer.allocate(1024)); } if (key.isReadable()) { // 通过key 反向获取对应的channel SocketChannel channel = (SocketChannel) key.channel(); // 获取到管理的Buffer ByteBuffer buffer = (ByteBuffer) key.attachment(); channel.read(buffer); System.out.println(\u0026#34;form客户端\u0026#34; + new String(buffer.array())); } keyIterator.remove(); } } } } 客户端\npackage com.crazy.io.nio.buffer; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.SocketChannel; public class NIOClient { public static void main(String[] args) throws IOException { // 等到通道 SocketChannel socketChannel = SocketChannel.open(); // 设置非阻塞 socketChannel.configureBlocking(false); InetSocketAddress inetSocketAddress = new InetSocketAddress(\u0026#34;127.0.0.1\u0026#34;, 6666); // 连接服务器 if (!socketChannel.connect(inetSocketAddress)) { while (!socketChannel.finishConnect()) { System.out.println(\u0026#34;没有连接上，可以做其它事情\u0026#34;); } } // 连接成功 String hello = \u0026#34;失忆老幺\u0026#34;; ByteBuffer buffer = ByteBuffer.wrap(hello.getBytes()); // 发送数据,将buffer数据写到channel socketChannel.write(buffer); System.in.read(); } } AIO # 总结 # 以上内容参考自失忆老幺\n","date":"2021-06-22","externalUrl":null,"permalink":"/posts/%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E6%A8%A1%E5%BC%8F%E5%AD%A6%E4%B9%A0/","section":"文章","summary":"","title":"网络编程模式学习","type":"posts"},{"content":"","date":"2021-04-28","externalUrl":null,"permalink":"/tags/intellij-idea/","section":"Tags","summary":"","title":"Intellij IDEA","type":"tags"},{"content":" Tab 页 # 在 intellij idea 中，直接使用快捷键 ctrl+e 来找到最近访问过的文件； 使用 ctrl+shift+e 来访问最近编辑过的文件。\n跳到特定的文件夹 # 在intellij idea 中，可以输入 /文件夹名 来跳到特定的文件夹（使用double shift快捷键）。\n快速补全行末分号 # Java 中，每一条语句的末尾都得加上 ; 号，我们可以在行中任意位置使用快捷键 ctrl+shift+enter 来快速补全分号。\nRest Client # intellij idea 中内置了一个 rest client，可以通过 ctrl+shift+a 调出面板，然后搜索 rest client 来找到，打开以后可以看到一个简单的 rest client。 之所以说它比较简单是因为觉得还是 postman 更加强大，相比之下， rest client 则要显得逊色得多。\n粘贴板历史选择 # 直接通过快捷键 ctrl+shift+v 来访问历史 粘贴板。\nLanguage Injection # 大家都知道在 Java 的 String 中编辑有 JSON 的话有多麻烦，各种转义真是让人疯狂，在 Intellij IDEA 中，我们可以直接使用 Intellij IDEA 的 Language Injection 的功能（Alt + Enter）将一个字符串标记为 JSON，就可以非常方便地编写 JSON 了，再也不用担心转义的问题了。\nSmart Step Into # 在 Debug 的时候，如果一行代码中有多行语句，我们又需要进入其中的一个方法调用的话，经常做的方法是点开源代码，然后打上断点，或者直接右键 Run to Line，而不能使用快捷键快速将 Debug 的当前行进入到想要去的方法上，Intellij IDEA 提供了 Smart Step Into 的能力，只要使用 Shift + F7，就可以选择到底要 Debug 进入哪一个方法。\n多行编辑 # 以前要做多行编辑，总是现在 Sublime 里面先做好，然后再拷贝回到 IDEA 里面，现在知道了 IDEA 本身就自带这个功能，快捷键是 alt+Shift+鼠标，直接来看一个 gif 动画看来这个功能吧：\n快速打印输出 # 除了用 sout 开头快速生成，还能在后面快速生成。\n快速定义局部变量 # 在字符串或者数字……后面输入 .var，回车，IDEA会自动推断并快速定义一个局部变量，不过它是 final 类型的\n快速定义成员变量 # 在值后面输入.field，可以快速定义一个成员变量，如果当前方法是静态的，那生成的变量也是静态的。\n快速格式化字符串 # 在字符串后面输入.format，回车，IDEA会自动生成 String.format…语句，牛逼吧！\n快速判断（非）空 # if (xx != null) if (xx == null) 像上面这种判断空/非空的情况非常多吧，其实可以快速生成 if 判断语句块，非空：.notnull 或者 .nn，空：.null。\n快速取反判断 # 输入 .not 可以让布尔值快速取反，再输入 .if 可快速生成 if 判断语句块。\n快速遍历集合 # 下面是几种 for 循环语句的快速生成演示，.for, .fori, .forr 都可以满足你的要求\n快速返回值 # 在值后面输入 .return，可以让当前值快速返回。\n快速生成同步锁 # 在对象后面输入 .synchronized，可以快速生成该对象的同步锁语句块。\n快速生成JDK8语句 # 下面演示的是快速生成 Lambda 以及 Optional 语句。\n常用快捷键列表 # Alt+回车 导入包,自动修正\nCtrl+N 查找类\nCtrl+Shift+N 查找文件\nCtrl+Alt+L 格式化代码\nCtrl+Alt+O 优化导入的类和包\nAlt+Insert 生成代码(如get,set方法,构造函数等)\nCtrl+E或者Alt+Shift+C 最近更改的代码\nCtrl+R 替换文本\nCtrl+F 查找文本\nCtrl+Shift+Space 自动补全代码\nCtrl+空格 代码提示\nCtrl+Alt+Space 类名或接口名提示\nCtrl+P 方法参数提示\nCtrl+Shift+Alt+N 查找类中的方法或变量\nAlt+Shift+C 对比最近修改的代码\nCtrl+D 复制行\nCtrl+X 删除行(我习惯于修改成 ctrl + y)\nCtrl+/ 或 Ctrl+Shift+/ 注释（// 或者/\u0026hellip;/ ）\nCtrl+J 自动代码\nCtrl+H 显示类结构图\nCtrl+Q 显示注释文档\nAlt+F1 查找代码所在位置\nAlt+1 快速打开或隐藏工程面板\nCtrl+Alt+ left/right 返回至上次浏览的位置\nAlt+ left/right 切换代码视图\nAlt+ Up/Down 在方法间快速移动定位\nCtrl+Shift+Up/Down 代码向上/下移动\nF2 或Shift+F2 高亮错误或警告快速定位\nCtrl+W 选中代码，连续按会有其他效果\nCtrl+B 快速打开光标处的类或方法\nCtrl+Alt+B 快速打开实现类\n本文参考于Intellij IDEA 的一些使用技巧和Intellij IDEA 智能补全的 10 个姿势，在此表示感谢\n","date":"2021-04-28","externalUrl":null,"permalink":"/posts/intellij-idea-%E5%B8%B8%E7%94%A8%E5%8A%9F%E8%83%BD/","section":"文章","summary":"","title":"Intellij IDEA 常用功能","type":"posts"},{"content":" Java 代码的执行顺序 # 通过以下代码，更加快速地理解代码的执行顺序，以助于理解jvm的加载顺序，帮助我们在写代码时，写出更深刻的代码。\nSub 子类 # public class Sub { // 静态 不可变 private static final String str1 = \u0026#34;00\u0026#34;; // 不可变 private final String str2 = \u0026#34;01\u0026#34;; // 普通字符串 private String str3 = \u0026#34;02\u0026#34;; // 静态 字符串 private static String str4 = \u0026#34;03\u0026#34;; { System.out.println(\u0026#34;Sub code block1 str1: \u0026#34; + str1); System.out.println(\u0026#34;Sub code block1 str2: \u0026#34; + str2); System.out.println(\u0026#34;Sub code block1 str3: \u0026#34; + str3); System.out.println(\u0026#34;Sub code block1 str4: \u0026#34; + str4); System.out.println(\u0026#34;Sub: \u0026#34; + \u0026#34;04\u0026#34;); } static { System.out.println(\u0026#34;Sub: \u0026#34; + \u0026#34;05\u0026#34;); System.out.println(\u0026#34;Sub Static block1 str1: \u0026#34; + str1); System.out.println(\u0026#34;Sub Static block1 str4: \u0026#34; + str4); } { System.out.println(\u0026#34;Sub: \u0026#34; + \u0026#34;06\u0026#34;); System.out.println(\u0026#34;Sub code block2 str1: \u0026#34; + str1); System.out.println(\u0026#34;Sub code block2 str2: \u0026#34; + str2); System.out.println(\u0026#34;Sub code block2 str3: \u0026#34; + str3); System.out.println(\u0026#34;Sub code block2 str4: \u0026#34; + str4); } public Sub() { System.out.println(\u0026#34;Sub: \u0026#34; + \u0026#34;07\u0026#34;); System.out.println(\u0026#34;Sub: \u0026#34; + str1); System.out.println(\u0026#34;Sub: \u0026#34; + str2); System.out.println(\u0026#34;Sub: \u0026#34; + str3); System.out.println(\u0026#34;Sub: \u0026#34; + str4); // 修改 静态 字符串值 str4 = str4 + \u0026#34;++Sub++\u0026#34;; // 再输出 System.out.println(\u0026#34;Sub: \u0026#34; + str4); // 修改普通字符串 str3 = str3 + \u0026#34;--Sub--\u0026#34;; System.out.println(\u0026#34;Sub: \u0026#34; + str3); } static { System.out.println(\u0026#34;Sub: \u0026#34; + \u0026#34;08\u0026#34;); System.out.println(\u0026#34;Sub Static block2 str1: \u0026#34; + str1); System.out.println(\u0026#34;Sub Static block2 str4: \u0026#34; + str4); } } Father 父类 # public class Father extends Sub { // 静态 不可变 private static final String str1 = \u0026#34;0\u0026#34;; // 不可变 private final String str2 = \u0026#34;1\u0026#34;; // 普通字符串 private String str3 = \u0026#34;2\u0026#34;; // 静态 字符串 private static String str4 = \u0026#34;3\u0026#34;; { System.out.println(\u0026#34;Father: \u0026#34; + 4); } static { System.out.println(\u0026#34;Father: \u0026#34; + 5); } { System.out.println(\u0026#34;Father: \u0026#34; + 6); } public Father() { System.out.println(\u0026#34;Father: \u0026#34; + 7); System.out.println(\u0026#34;Father: \u0026#34; + str1); System.out.println(\u0026#34;Father: \u0026#34; + str2); System.out.println(\u0026#34;Father: \u0026#34; + str3); System.out.println(\u0026#34;Father: \u0026#34; + str4); // 修改 静态 字符串值 str4 = str4 + \u0026#34;++Father++\u0026#34;; // 再输出 System.out.println(\u0026#34;Father: \u0026#34; + str4); // 修改普通字符串 str3 = str3 + \u0026#34;--Father--\u0026#34;; System.out.println(\u0026#34;Father: \u0026#34; + str3); } static { System.out.println(\u0026#34;Father: \u0026#34; + 8); } } Test 测试 # public class Test { // 静态 不可变 private static final String str1 = \u0026#34;0000000\u0026#34;; // 不可变 private final String str2 = \u0026#34;0000001\u0026#34;; // 普通字符串 private String str3 = \u0026#34;0000002\u0026#34;; // 静态 字符串 private static String str4 = \u0026#34;0000003\u0026#34;; static { System.out.println(\u0026#34;Test: \u0026#34; + \u0026#34;0000004\u0026#34;); System.out.println(\u0026#34;Test Static code1 str1: \u0026#34; + str1); System.out.println(\u0026#34;Test Static code2 str4: \u0026#34; + str4); } public Test() { System.out.println(\u0026#34;Test: \u0026#34; + str1); System.out.println(\u0026#34;Test: \u0026#34; + str2); System.out.println(\u0026#34;Test: \u0026#34; + str3); System.out.println(\u0026#34;Test: \u0026#34; + str4); // 修改 静态 字符串值 str4 = str4 + \u0026#34;++Test++\u0026#34;; // 再输出 System.out.println(\u0026#34;Test: \u0026#34; + str4); // 修改普通字符串 str3 = str3 + \u0026#34;--Test--\u0026#34;; System.out.println(\u0026#34;Test: \u0026#34; + str3); } { System.out.println(\u0026#34;Test: \u0026#34; + \u0026#34;0000005\u0026#34;); System.out.println(\u0026#34;Test code block1 str1: \u0026#34; + str1); System.out.println(\u0026#34;Test code block1 str2: \u0026#34; + str2); System.out.println(\u0026#34;Test code block1 str3: \u0026#34; + str3); System.out.println(\u0026#34;Test code block1 str4: \u0026#34; + str4); } public static void main(String[] args) { System.out.println(\u0026#34;Test: \u0026#34; + 4); Father test = new Father(); System.out.println(\u0026#34;\\033[32;4m\u0026#34; + \u0026#34;==========================\u0026#34; + \u0026#34;\\033[0m\u0026#34;); Father test2 = new Father(); System.out.println(\u0026#34;Test: \u0026#34; + 5); } static { System.out.println(\u0026#34;Test: \u0026#34; + \u0026#34;0000006\u0026#34;); System.out.println(\u0026#34;Test Static code2 str1: \u0026#34; + str1); System.out.println(\u0026#34;Test Static code2 str4: \u0026#34; + str4); } { System.out.println(\u0026#34;Test: \u0026#34; + \u0026#34;0000007\u0026#34;); System.out.println(\u0026#34;Test code block2 str1: \u0026#34; + str1); System.out.println(\u0026#34;Test code block2 str2: \u0026#34; + str2); System.out.println(\u0026#34;Test code block2 str3: \u0026#34; + str3); System.out.println(\u0026#34;Test code block2 str4: \u0026#34; + str4); } } 直接结果如下 # Test: 0000004 Test Static code1 str1: 0000000 Test Static code2 str4: 0000003 Test: 0000006 Test Static code2 str1: 0000000 Test Static code2 str4: 0000003 Test: 4 Sub: 05 Sub Static block1 str1: 00 Sub Static block1 str4: 03 Sub: 08 Sub Static block2 str1: 00 Sub Static block2 str4: 03 Father: 5 Father: 8 Sub code block1 str1: 00 Sub code block1 str2: 01 Sub code block1 str3: 02 Sub code block1 str4: 03 Sub: 04 Sub: 06 Sub code block2 str1: 00 Sub code block2 str2: 01 Sub code block2 str3: 02 Sub code block2 str4: 03 Sub: 07 Sub: 00 Sub: 01 Sub: 02 Sub: 03 Sub: 03++Sub++ Sub: 02--Sub-- Father: 4 Father: 6 Father: 7 Father: 0 Father: 1 Father: 2 Father: 3 Father: 3++Father++ Father: 2--Father-- ========================== Sub code block1 str1: 00 Sub code block1 str2: 01 Sub code block1 str3: 02 Sub code block1 str4: 03++Sub++ Sub: 04 Sub: 06 Sub code block2 str1: 00 Sub code block2 str2: 01 Sub code block2 str3: 02 Sub code block2 str4: 03++Sub++ Sub: 07 Sub: 00 Sub: 01 Sub: 02 Sub: 03++Sub++ Sub: 03++Sub++++Sub++ Sub: 02--Sub-- Father: 4 Father: 6 Father: 7 Father: 0 Father: 1 Father: 2 Father: 3++Father++ Father: 3++Father++++Father++ Father: 2--Father-- Test: 5 Process finished with exit code 0 这个代码的结构理解是基本功，必须掌握精。\n","date":"2021-01-31","externalUrl":null,"permalink":"/posts/java%E4%BB%A3%E7%A0%81%E7%9A%84%E6%89%A7%E8%A1%8C%E9%A1%BA%E5%BA%8F/","section":"文章","summary":"","title":"Java代码的执行顺序","type":"posts"},{"content":" git commit 中使用表情 # 我们经常可以在github上看到国外大佬的commit信息中有很多可爱的表情，这是怎么做到的呢？ ok，可以这样使用哦：git commit -m '提交信息 :emoji:'，示例：git commit -m '增加新功能 :sparkles:'\n有哪些表情呢 # 来了，请参照这个链接： https://gitmoji.carloscuesta.me/\ndemo # gitmoji emoji-cheat-sheet full-emoji-list ","date":"2020-06-23","externalUrl":null,"permalink":"/posts/git-commit-%E4%B8%AD%E6%B7%BB%E5%8A%A0%E8%A1%A8%E6%83%85/","section":"文章","summary":"","title":"Git-commit-中添加表情","type":"posts"},{"content":" java IO 操作分析 # 直接看代码吧\npackage jdk.util.sourcecode; import java.io.*; /** * 经常会遇到各种 IO 流操作，IO 流操作一般分为两类：字符流和字节流。 * 以 \u0026#34;Reader\u0026#34; 结尾都是字符流，操作的都是字符型的数据 * 以 \u0026#34;Stream\u0026#34; 结尾的都是字节流，操作的都是 byte 类型的数据 * 二者的区别： * 字节流没有缓冲区，是直接输出的；而字符流是先输出到缓冲区，然后在调用 close() 方法后再输出信息 * 处理对象不同，字节流能处理所有类型的数据，但是字符流只能处理字符类型的数据（只要是处理纯文本数据，就优先考虑使用字符流，除此之外都使用字节流） * java byte -\u0026gt; short -\u0026gt; int -\u0026gt; long 1byte -\u0026gt; 2byte -\u0026gt; 4byte -\u0026gt; 8byte * * * * InputStream 和 OutputStream 是各种输入输出字节流的基类，所有字节流都继承于这两个基类 * * * FileInputStream 和 FileOutputStream 这两个从字面意思很容易理解，是对文件的字节流操作，也是最常见的 IO 操作流 * * * 非流式文件类 -- File 类 * 从定义来看，File 类是 Object 的直接子类，同时它继承了 Comparable 接口可以进行数组的排序 * File 类的操作包括文件的创建，删除，重命名，得到文件/文件夹的路径，创建时间等 * File 类是对文件系统中文件以及文件夹进行封装的一个对象，可以通过对象的思想来操作文件和文件夹 * / /** * @author: util.you.com@gmail.com * @date: 2019/5/25 15:40 * @description: * @version: 1.0 * @className: TestIO */ public class TestIO { public static void main(String[] args){ // 1.调用 新建文件 // createFile(\u0026#34;F:\\\\github\\\\util.you.com@gmail.com\\\\jdk\\\\src\\\\main\\\\java\\\\jdk\\\\util\\\\sourceCode\\\\\u0026#34;, \u0026#34;测试io.txt\u0026#34;); // 2.调用删除文件 // deleteFile(\u0026#34;F:\\\\github\\\\util.you.com@gmail.com\\\\jdk\\\\src\\\\main\\\\java\\\\jdk\\\\util\\\\sourceCode\\\\\u0026#34;,\u0026#34;测试io.txt\u0026#34;); // 3.调用创建文件夹 // createFolder(\u0026#34;F:\\\\github\\\\util.you.com@gmail.com\\\\jdk\\\\src\\\\main\\\\java\\\\jdk\\\\util\\\\sourceCode\\\\\u0026#34;, \u0026#34;测试io文件夹\u0026#34;); // 4.列出指定目录下面的所有文件，包括隐藏文件 // listFiles(\u0026#34;F:\\\\github\\\\util.you.com@gmail.com\\\\jdk\\\\src\\\\main\\\\java\\\\jdk\\\\util\\\\sourceCode\\\\\u0026#34;); // 5.判断指定的 文件夹是否是一个 目录(即是否是一个 文件夹) // isFolder(\u0026#34;F:\\\\\\\\github\\\\\\\\util.you.com@gmail.com\\\\\\\\jdk\\\\\\\\src\\\\\\\\main\\\\\\\\java\\\\\\\\jdk\\\\\\\\util\\\\\\\\sourceCode\\\\\u0026#34;, \u0026#34;测试io文件夹\u0026#34;); // 6. 向指定的文件中(需要在文件名中给出路径和文件名,我这里是为了简便这样写了)通过 字节流 写入数据 (这里前提：认为该文件已经存在,不需要再创建) // writeFileByByte(\u0026#34;F:\\\\github\\\\util.you.com@gmail.com\\\\jdk\\\\src\\\\main\\\\java\\\\jdk\\\\util\\\\sourceCode\\\\测试io.txt\u0026#34;); // 7.从指定的文件中读取内容 // readFileByByte(\u0026#34;F:\\\\github\\\\util.you.com@gmail.com\\\\jdk\\\\src\\\\main\\\\java\\\\jdk\\\\util\\\\sourceCode\\\\测试io.txt\u0026#34;); // 8. 从 指定文件读取内容并写入到 目标文件 readWriteFile(\u0026#34;F:\\\\game\\\\xx.mp4\u0026#34;, \u0026#34;E:\\\\github-project\\\\jdk\\\\src\\\\main\\\\java\\\\jdk\\\\util\\\\sourceCode\\\\测试io.txt\u0026#34;); } /** * 因为 io 流基本是与 File(文件/文件夹) 操作密不可分的，因此 io 的操作，只要涉及到文件，文件夹的都必须使用 File 类 * 在指定的路径下，新建一个 指定文件名的 文件 * @param path 文件路径 * @param fileName 文件名 */ public static void createFile(String path, String fileName){ // 因为是在 操作 文件，所以用到 File 对象【记住：所有与文件/文件夹操作相关的内容，都必须第一时间想到要用 File 对象】 File file = new File(path+fileName); // 实例化一个 file 操作对象 try { file.createNewFile(); // 调用 file 文件/文件夹 实例对象的 方法，来新建文件 System.out.println(\u0026#34;目标文件已存在: \u0026#34; + path + fileName); } catch (IOException e) { e.printStackTrace(); } } /** * 删除一个指定路径下的 文件 * @param path 该文件的路径 * @param fileName 该文件的文件名 */ public static void deleteFile(String path, String fileName){ File file = new File(path+fileName); if(file.exists()){ file.delete(); System.out.println(\u0026#34;目标文件已删除\u0026#34;); }else{ System.out.println(\u0026#34;要删除的目标文件不存在\u0026#34;); } } /** * 新建一个 文件夹 * @param path 路径 * @param folderName 文件夹名 */ public static void createFolder(String path, String folderName){ File file = new File(path+folderName); file.mkdir(); System.out.println(\u0026#34;该文件夹已经存在于: \u0026#34; + path + folderName); } /** * 列出指定目录下面的所有文件 * @param path 目录的路径名 */ public static void listFiles(String path){ File file = new File(path); if (file.isDirectory()){ File[] fileArray = file.listFiles(); for (int i = 0; i \u0026lt; fileArray.length; i++){ System.out.println( \u0026#34;该目录下的文件: \u0026#34; + fileArray[i]); System.out.println( \u0026#34;该目录下的文件或文件夹的名字: \u0026#34; + fileArray[i].getName()); } }else{ System.out.println(path + \u0026#34; 目录不存在\u0026#34;); } } /** * 判断给定的 文件夹 是否是一个目录 * @param path */ public static void isFolder(String path, String folderName){ File file = new File(path + folderName); if (file.isDirectory()){ System.out.println(path + folderName + \u0026#34; 是一个目录\u0026#34;); }else{ System.out.println(path + folderName + \u0026#34; 不是一个目录\u0026#34;); } } /** * 通过 字节流 向 指定文件 写入内容 * @param fileName 文件名，这里为了简化，文件名中带上 路径 */ public static void writeFileByByte(String fileName){ File file = new File(fileName); OutputStream outputStream = null; // 从内存中 写入内容 到 文件中，这是输出流，因此要用 输出流 // FileOutputStream 的构造器大体上有两类：一类是 传入一个带有文件名和文件路径的字符串；另一类是 传入一个 File 文件/文件夹对象 try { outputStream = new FileOutputStream(file, true); // 给 file 文件对象 构造一个字节输出流 } catch (FileNotFoundException e) { e.printStackTrace(); } // 这里穿插一个小知识点，即我们 给一个 int 参数，但是我们要让 outputStream 以 byte[] 的形式写入,接下来就看 int 转 byte[] 吧 int a = 12345678; // 为什么这样呢？因为 一个 int 是 4个byte,所以一个 int 转成 byte[] 后，一定是里面包含4个byte元素的 byte[] 数组 byte[] b = new byte[]{ (byte) ((a \u0026gt;\u0026gt; 24) \u0026amp; 0xFF), (byte) ((a \u0026gt;\u0026gt; 16) \u0026amp; 0xFF), (byte) ((a \u0026gt;\u0026gt; 8) \u0026amp; 0xFF), (byte) ((a ) \u0026amp; 0xFF) }; try { outputStream.write(b); // 这里还有一个问题没解决：写入的时候，选择编码格式(稍后解决) outputStream.close(); }catch (IOException e) { e.printStackTrace(); } } /** * 通过 字节流 从 指定文件 读取输出内容 * @param fileName 文件名，这里为了简化，文件名中带上 路径 */ public static void readFileByByte(String fileName){ File file = new File(fileName); InputStream inputStream = null; // 从 硬盘中 读取内容 到 内存中，这是 输入流，因此声明 输入流 对象 try { inputStream = new FileInputStream(file); // inputStream 读取内容有5个方法 read():默认读取一个byte,readBytes(byte b[], int off, int len) // 这里我们采用 read(byte b[], int off, int len) 方法 byte[] byter = new byte[1024]; // 所以先实例化一个 byte[] int len = inputStream.read(byter); inputStream.close(); // 最后我们输出一下读取到的内容 System.out.println(new String(byter, 0, len)); } catch (Exception e) { e.printStackTrace(); } } /** * @author: util.you.com@gmail.com * @param: [sourceFile, desFile] * @return: void * @date: 2019/5/25 18:04 * @version: 1.0 * @description: 最后来一个 从 指定文件中 读取内容 到 指定目标文件中 */ public static void readWriteFile(String sourceFile, String desFile){ File inputFile = new File(sourceFile); File outputFile = new File(desFile); InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new FileInputStream(inputFile); byte[] byter = new byte[1024]; inputStream.read(byter); outputStream = new FileOutputStream(outputFile, true); outputStream.write(byter); outputStream.close(); inputStream.close(); System.out.println(\u0026#34;操作完成\u0026#34;); }catch (Exception e){ System.out.println(e.getMessage()); } } } ","date":"2020-01-06","externalUrl":null,"permalink":"/posts/java-%E4%B8%AD-io-%E6%93%8D%E4%BD%9C%E6%80%BB%E7%BB%93/","section":"文章","summary":"","title":"Java 中 IO 操作总结","type":"posts"},{"content":" github上传文件限制 # github默认地上传文件限制是不超过100M，注意：是单个文件不能超过100M(注意：本篇的密码必须是SHA256加密后的密文)\n如何解决呢？ # 其实GitHub提供了 LFS 专门来处理这类大文件的。 如下：\n# 先安装 git lfs git lfs install # 标记跟踪哪些大文件，可以单个标记，也可以使用模式匹配某类文件 git lfs track \u0026#34;*.mp4\u0026#34; # 之后就是常规的 add, commit, push 操作即可 这里以几个视频为例演示一下 # 说明 # 🎉 观看到以上视频的前提是您可以成功地FQ哦，不然看不到视频哦 🏁 欢迎补充哦 ","date":"2019-12-30","externalUrl":null,"permalink":"/posts/github%E4%B8%8A%E4%BC%A0%E5%A4%A7%E6%96%87%E4%BB%B6%E7%9A%84%E6%96%B9%E5%BC%8F/","section":"文章","summary":"","title":"GitHub上传大文件","type":"posts"},{"content":" 2019 # 2019年也算是我的一个小转折吧，主要有几件事：\n因为工作换了城市 换工作 焦虑 因为工作换了城市 之前毕业后一直呆在安徽，说实话我也没觉得安徽有什么不好的，但是无奈总有一颗想流浪的心，所以在年初毅然决然离开熟悉的环境，只身一人南下\n换工作 换了城市后不可避免的需要另换工作了，真是被坑了好大一波，难受😫\n焦虑 这一年来感觉焦虑愈来愈烈，各种焦虑，真是诸事不顺呢\n不管怎样，2019年快要过去了，祝福我们每一个人。\n琵琶仙·中秋 \u0026ndash; 清代：纳兰性德\n碧海年年，试问取、冰轮为谁圆缺？吹到一片秋香，清辉了如雪。愁中看、好天良夜，知道尽成悲咽。只影而今，那堪重对，旧时明月。花径里、戏捉迷藏，曾惹下萧萧井梧叶。记否轻纨小扇，又几番凉热。只落得，填膺百感，总茫茫、不关离别。一任紫玉无情，夜寒吹裂。\n","date":"2019-12-28","externalUrl":null,"permalink":"/posts/%E4%BA%8C%E9%9B%B6%E4%B8%80%E4%B9%9D%E5%B9%B4%E5%BF%AB%E8%A6%81%E8%BF%87%E5%8E%BB%E4%BA%86/","section":"文章","summary":"","title":"二零一九年快要过去了","type":"posts"},{"content":" HSSFWorkbook 介绍 # 开发中经常会遇到 Excel 的处理，在 Java 中，操作 excel 目前有两个主流框架，分别是：\napache 的 poi Apache POI [1] 是用Java编写的免费开源的跨平台的 Java API，Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能。POI为“Poor Obfuscation Implementation”的首字母缩写，意为“简洁版的模糊实现”。\nJava Excel Java Excel是一开放源码项目，通过它Java开发人员可以读取Excel文件的内容、创建新的Excel文件、更新已经存在的Excel文件。jxl 由于其小巧 易用的特点, 逐渐已经取代了 POI-excel的地位, 成为了越来越多的java开发人员生成excel文件的首选\n这里提一下：HSSFWorkbook:是操作Excel2003以前（包括2003）的版本，扩展名是.xls；XSSFWorkbook:是操作Excel2007的版本，扩展名是.xlsx。对于不同版本的EXCEL文档要使用不同的工具类，如果使用错了，会提示如下错误信息：org.apache.poi.openxml4j.exceptions.InvalidOperationException，org.apache.poi.poifs.filesystem.OfficeXmlFileException\nHSSFWorkbook 的使用 # package com.knowledge.point; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.ss.usermodel.Font; import java.io.*; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author: latinos-bub * @date: 2019/11/12 17:32 * @description: 测试生成 excel * @className: com.knowledge.point.TestGenExcel */ public class TestGenExcel { public static void main(String[] args) throws Exception{ // 创建一个 excel 工作簿 HSSFWorkbook workbook = new HSSFWorkbook(); // 创建一个 excel 里面的 sheet 表格，并设置 sheet 名字 HSSFSheet sheet = workbook.createSheet(\u0026#34;测试生成 excel 表格是否乱码\u0026#34;); // -------------------------------设置 工作簿的 样式 start--------------------------// HSSFCellStyle titleStyle = workbook.createCellStyle(); // 创建标题样式 titleStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置标题水平居中显示 titleStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 设置标题垂直居中显示 HSSFFont titleFont = workbook.createFont(); // 创建标题字体 titleFont.setItalic(false); // 设置字体为斜体字 titleFont.setColor(Font.COLOR_RED); // 将字体设置为“红色” titleFont.setFontHeightInPoints((short)16); // 将字体大小设置为18px titleFont.setFontName(\u0026#34;宋体\u0026#34;); // 将“宋体”字体应用到当前单元格上 titleFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); //加粗 titleStyle.setFont(titleFont); // 将 字体应用到 标题样式上 HSSFCellStyle cellStyle = workbook.createCellStyle(); // 创建 cell 单元格样式 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 设置 cell 单元格水平居中显示 cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); // 设置 cell 单元格垂直居中显示 Font cellFont = workbook.createFont(); // 创建 单元格 字体 cellFont.setFontHeightInPoints((short)10); // 将字体大小设置为18px cellFont.setFontName(\u0026#34;宋体\u0026#34;); // 字体应用到当前单元格上 cellStyle.setFont(cellFont); // 将 字体应用到 单元格样式上 // -------------------------------设置 工作簿的 样式 end--------------------------// // 创建 首行(即标题 行) HSSFRow headRow = sheet.createRow(0); // 创建 首行(即标题 行) 的 第一个单元格 HSSFCell headCell = headRow.createCell(0); // 设置 首行(即标题 行)的文字内容 headCell.setCellValue(\u0026#34;更新时间\u0026#34;); headCell.setCellStyle(titleStyle); // 设置 首行的 第一个单元格 样式 // 创建 首行(即标题 行) 的 第二个单元格 headCell = headRow.createCell(1); headCell.setCellValue(\u0026#34;创建时间\u0026#34;); headCell.setCellStyle(titleStyle); // 这里一定要每次实例化之后都要设置样式 headCell = headRow.createCell(2); headCell.setCellValue(\u0026#34;删除状态\u0026#34;); headCell.setCellStyle(titleStyle); // 这里一定要每次实例化之后都要设置样式 headCell = headRow.createCell(3); headCell.setCellValue(\u0026#34;id\u0026#34;); headCell.setCellStyle(titleStyle); // 这里一定要每次实例化之后都要设置样式 headCell = headRow.createCell(4); headCell.setCellValue(\u0026#34;书名\u0026#34;); headCell.setCellStyle(titleStyle); // 这里一定要每次实例化之后都要设置样式 // 获取 模拟的 List\u0026lt;Map\u0026lt;String, Object\u0026gt; 数据 List\u0026lt;Map\u0026lt;String, Object\u0026gt;\u0026gt; list = getList(); for (int i = 0; i \u0026lt; list.size(); i++){ // 外层for是每一行的设置 // 每一行(填充的内容行)时，我们都要新实例化一个 HSSRow 新行 HSSFRow contentRow = sheet.createRow(sheet.getLastRowNum() + 1); // 调用sheet的上次最后一行索引 + 1即可 for (int j = 0; j \u0026lt; 5; j++){ // 内层 for 是 每行的 列数设置，因为我们的标题行有5列，所以这里设置5列 // 每一行，我们都要在该行(即contentRow) 实例化 5 个 cell 单元格 HSSFCell contentCell = contentRow.createCell(j); switch (j){ // 1，2，3，4，5个单元格分别写入自己正确的数据 case 0: // 每一行的第一列(即第一个cell)我们都写入 update_time 对应的数据，以下依次类推 contentCell.setCellValue(String.valueOf(list.get(i).get(\u0026#34;update_time\u0026#34;))); break; case 1: contentCell.setCellValue(String.valueOf(list.get(i).get(\u0026#34;create_time\u0026#34;))); break; case 2: contentCell.setCellValue(String.valueOf(list.get(i).get(\u0026#34;delete_status\u0026#34;))); break; case 3: contentCell.setCellValue(String.valueOf(list.get(i).get(\u0026#34;id\u0026#34;))); break; case 4: contentCell.setCellValue(String.valueOf(list.get(i).get(\u0026#34;content\u0026#34;))); break; } // 设置 内容 居中显示 样式 contentCell.setCellStyle(cellStyle); } } // 设置 列 的宽度 sheet.setColumnWidth(0, 900 * 10); sheet.setColumnWidth(1, 900 * 10); sheet.setColumnWidth(2, 900 * 10); sheet.setColumnWidth(3, 900 * 10); sheet.setColumnWidth(4, 900 * 10); File xlsFile = new File(\u0026#34;测试生成Excel.xls\u0026#34;); workbook.write(new FileOutputStream(xlsFile)); workbook.close(); // 补充：如果是 web 程序，需要页面打开一个对话框，保存文件则，需要额外添加以下代码即可 /*String fileName = \u0026#34;excel表\u0026#34;; fileName = new String(fileName.getBytes(), \u0026#34;ISO-8859-1\u0026#34;); HttpServletResponse response = this.getResponse().getHttpResponse(); response.setHeader(\u0026#34;Content-disposition\u0026#34;, \u0026#34;attachment; filename=\u0026#34; + fileName + \u0026#34;.xls\u0026#34;); response.setContentType(\u0026#34;application/application/vnd.ms-excel;charset=utf-8\u0026#34;); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // workbook 工作簿中写入数据 workbook.write(byteArrayOutputStream); byte[] content = byteArrayOutputStream.toByteArray(); InputStream inputStream = new ByteArrayInputStream(content); ServletOutputStream out = null; try { out = response.getOutputStream(); byte[] b = new byte[2048]; // 设置 缓冲区的读取字节大小 int i; while ((i = inputStream.read(b)) \u0026gt; 0) { out.write(b, 0, i); } out.flush(); } catch (Exception e) { System.out.println(\u0026#34;生成excel表格时出错: \u0026#34; + e.getMessage()); } finally { if (inputStream != null) inputStream.close(); if (out != null) out.close(); }*/ } /** * @Author latinos-bub * @Description //TODO 这里我先准备一个从别的地方获取的 sql 结果集合，以备下面写入数据使用 * 这个 List 中我们就存放 12 个 Map 即可(模拟数据) * @Date 2019/11/12 21:17 * @Param [] * @return java.util.List\u0026lt;java.util.Map\u0026lt;java.lang.String,java.lang.Object\u0026gt;\u0026gt; **/ private static List\u0026lt;Map\u0026lt;String, Object\u0026gt;\u0026gt; getList(){ List\u0026lt;Map\u0026lt;String, Object\u0026gt;\u0026gt; list = new ArrayList\u0026lt;Map\u0026lt;String, Object\u0026gt;\u0026gt;(); Map\u0026lt;String, Object\u0026gt; map1 = new HashMap\u0026lt;String, Object\u0026gt;(); map1.put(\u0026#34;update_time\u0026#34;, \u0026#34;1569404166000\u0026#34;); map1.put(\u0026#34;create_time\u0026#34;, \u0026#34;1569404122000\u0026#34;); map1.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map1.put(\u0026#34;id\u0026#34;, \u0026#34;2\u0026#34;); map1.put(\u0026#34;content\u0026#34;, \u0026#34;如何削铁\u0026#34;); list.add(map1); Map\u0026lt;String, Object\u0026gt; map2 = new HashMap\u0026lt;String, Object\u0026gt;(); map2.put(\u0026#34;update_time\u0026#34;, \u0026#34;1509357581000\u0026#34;); map2.put(\u0026#34;create_time\u0026#34;, \u0026#34;1508893725000\u0026#34;); map2.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map2.put(\u0026#34;id\u0026#34;, \u0026#34;5\u0026#34;); map2.put(\u0026#34;content\u0026#34;, \u0026#34;莎士比亚\u0026#34;); list.add(map2); Map\u0026lt;String, Object\u0026gt; map3 = new HashMap\u0026lt;String, Object\u0026gt;(); map3.put(\u0026#34;update_time\u0026#34;, \u0026#34;1510970055000\u0026#34;); map3.put(\u0026#34;create_time\u0026#34;, \u0026#34;1508986168000\u0026#34;); map3.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map3.put(\u0026#34;id\u0026#34;, \u0026#34;6\u0026#34;); map3.put(\u0026#34;content\u0026#34;, \u0026#34;亚里士多德\u0026#34;); list.add(map3); Map\u0026lt;String, Object\u0026gt; map4 = new HashMap\u0026lt;String, Object\u0026gt;(); map4.put(\u0026#34;update_time\u0026#34;, \u0026#34;1510118932000\u0026#34;); map4.put(\u0026#34;create_time\u0026#34;, \u0026#34;1509001065000\u0026#34;); map4.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map4.put(\u0026#34;id\u0026#34;, \u0026#34;10\u0026#34;); map4.put(\u0026#34;content\u0026#34;, \u0026#34;亚历山大\u0026#34;); list.add(map4); Map\u0026lt;String, Object\u0026gt; map5 = new HashMap\u0026lt;String, Object\u0026gt;(); map5.put(\u0026#34;update_time\u0026#34;, \u0026#34;1509002622000\u0026#34;); map5.put(\u0026#34;create_time\u0026#34;, \u0026#34;1509002622000\u0026#34;); map5.put(\u0026#34;delete_status\u0026#34;, \u0026#34;0\u0026#34;); map5.put(\u0026#34;id\u0026#34;, \u0026#34;11\u0026#34;); map5.put(\u0026#34;content\u0026#34;, \u0026#34;李白\u0026#34;); list.add(map5); Map\u0026lt;String, Object\u0026gt; map6 = new HashMap\u0026lt;String, Object\u0026gt;(); map6.put(\u0026#34;update_time\u0026#34;, \u0026#34;1569376168000\u0026#34;); map6.put(\u0026#34;create_time\u0026#34;, \u0026#34;1569404290000\u0026#34;); map6.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map6.put(\u0026#34;id\u0026#34;, \u0026#34;12\u0026#34;); map6.put(\u0026#34;content\u0026#34;, \u0026#34;无用是什么\u0026#34;); list.add(map6); Map\u0026lt;String, Object\u0026gt; map7 = new HashMap\u0026lt;String, Object\u0026gt;(); map7.put(\u0026#34;update_time\u0026#34;, \u0026#34;1569376160000\u0026#34;); map7.put(\u0026#34;create_time\u0026#34;, \u0026#34;1569404290000\u0026#34;); map7.put(\u0026#34;delete_status\u0026#34;, \u0026#34;0\u0026#34;); map7.put(\u0026#34;id\u0026#34;, \u0026#34;13\u0026#34;); map7.put(\u0026#34;content\u0026#34;, \u0026#34;选择吃什么饭是一件很痛苦的事\u0026#34;); list.add(map7); Map\u0026lt;String, Object\u0026gt; map8 = new HashMap\u0026lt;String, Object\u0026gt;(); map8.put(\u0026#34;update_time\u0026#34;, \u0026#34;1510983431000\u0026#34;); map8.put(\u0026#34;create_time\u0026#34;, \u0026#34;1510983427000\u0026#34;); map8.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map8.put(\u0026#34;id\u0026#34;, \u0026#34;19\u0026#34;); map8.put(\u0026#34;content\u0026#34;, \u0026#34;文章test2\u0026#34;); list.add(map8); Map\u0026lt;String, Object\u0026gt; map9 = new HashMap\u0026lt;String, Object\u0026gt;(); map9.put(\u0026#34;update_time\u0026#34;, \u0026#34;1569376164000\u0026#34;); map9.put(\u0026#34;create_time\u0026#34;, \u0026#34;1569404290000\u0026#34;); map9.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map9.put(\u0026#34;id\u0026#34;, \u0026#34;20\u0026#34;); map9.put(\u0026#34;content\u0026#34;, \u0026#34;就像选择在哪里睡觉一样\u0026#34;); list.add(map9); Map\u0026lt;String, Object\u0026gt; map10 = new HashMap\u0026lt;String, Object\u0026gt;(); map10.put(\u0026#34;update_time\u0026#34;, \u0026#34;1569376166000\u0026#34;); map10.put(\u0026#34;create_time\u0026#34;, \u0026#34;1569404290000\u0026#34;); map10.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map10.put(\u0026#34;id\u0026#34;, \u0026#34;21\u0026#34;); map10.put(\u0026#34;content\u0026#34;, \u0026#34;effective of java\u0026#34;); list.add(map10); Map\u0026lt;String, Object\u0026gt; map11 = new HashMap\u0026lt;String, Object\u0026gt;(); map11.put(\u0026#34;update_time\u0026#34;, \u0026#34;1569376172000\u0026#34;); map11.put(\u0026#34;create_time\u0026#34;, \u0026#34;1569404290000\u0026#34;); map11.put(\u0026#34;delete_status\u0026#34;, \u0026#34;1\u0026#34;); map11.put(\u0026#34;id\u0026#34;, \u0026#34;22\u0026#34;); map11.put(\u0026#34;content\u0026#34;, \u0026#34;荒岛求生\u0026#34;); list.add(map11); Map\u0026lt;String, Object\u0026gt; map12 = new HashMap\u0026lt;String, Object\u0026gt;(); map12.put(\u0026#34;update_time\u0026#34;, \u0026#34;1569376170000\u0026#34;); map12.put(\u0026#34;create_time\u0026#34;, \u0026#34;1569404290000\u0026#34;); map12.put(\u0026#34;delete_status\u0026#34;, \u0026#34;0\u0026#34;); map12.put(\u0026#34;id\u0026#34;, \u0026#34;23\u0026#34;); map12.put(\u0026#34;content\u0026#34;, \u0026#34;天使永远就在身边\u0026#34;); list.add(map12); return list; } } 《行香子·归去来兮》 -- 北宋：辛弃疾 \u003e 归去来兮，行乐休迟。命由天、富贵何时。 百年光景，七十者稀。奈一番愁，一番病，一番衰。 名利奔驰，宠辱惊疑。旧家时、都有些儿。 而今老矣，识破关机。算不如闲，不如醉，不如痴。 ","date":"2019-11-12","externalUrl":null,"permalink":"/posts/java%E4%B8%AD%E4%BD%BF%E7%94%A8hssfworkbook%E7%94%9F%E6%88%90excel/","section":"文章","summary":"","title":"Java中使用HSSFWorkbook生成Excel","type":"posts"},{"content":" MySQL 触发器 # 前言 # 这里呢，有两张表，分别是 CXY_TS_ORDER_TICKET 和 CXY_TS_ORDER_TICKET_STATUS 表，在 CXY_TS_ORDER_TICKET 表里面有一个get_status字段，现在呢，我们想在该字段发生变化时，在CXY_TS_ORDER_TICKET_STATUS` 表中，将该字段插入，并且记录变化时间以及发生变化的记录的主键。因此呢，我打算用触发器去实现这个需求\n实现 # -- Created by util.you.com@gmail.com delimiter $$ CREATE TRIGGER `order_ticket_status_trigger` AFTER UPDATE ON `CXY_TS_ORDER_TICKET` FOR EACH ROW BEGIN DECLARE s1 INT(11); -- 声明变量，用于存入 CXY_TS_ORDER_TICKET 表的 get_status 字段值,id 字段值 DECLARE s2 INT(11); set s2 = new.id; -- 分别给 s1 和 s2 赋值 set s1 = new.get_status; IF((old.get_status != new.get_status) OR (old.get_status IS NULL \u0026amp;\u0026amp; new.get_status IS NOT NULL)) THEN INSERT INTO `CXY_TS_ORDER_TICKET_STATUS`(`order_ticket_id`, `STATUS`, `insert_date_time`) VALUES(s2, s1, DATE_FORMAT(now(),\u0026#39;%Y-%m-%d %H:%i:%s\u0026#39;)); END IF; END$$ 解释 # 在 mysql 中，new、old都是内置的，分别表示一个字段发生变化前、后的值（当然也包括插入操作前后的变化），此处呢，因为我们需要根据 CXY_TS_ORDER_TICKET表的 get_status字段来插入记录到 CXY_TS_ORDER_TICKET_STATUS 表，因此呢，new 和 old 都取该字段即可。\nmysql 中的触发器呢，大致分为三类：insert 型、update 型、delete 型。\n何时触发该操作呢，又分为 after 和 before 型\n上示例子，就是一个触发器的大致模板，根据哪一张表的变化来触发该触发器，就 on 这张表即可了。\n","date":"2019-06-13","externalUrl":null,"permalink":"/posts/mysql%E8%A7%A6%E5%8F%91%E5%99%A8/","section":"文章","summary":"","title":"MySQL触发器","type":"posts"},{"content":" 约束的定义 # 约束用于规定表中的数据规则，保证表中的记录的完整和有效。如果存在违反约束的数据行为，行为会被约束终止，约束可以在创建表时规定(通过 create table 语句)，或者在表创建之后规定(通过 alter table 语句)\n约束种类 # 非空约束（not null） 唯一性约束（unique） 主键约束（primary key） 外键约束（foreign key） 检查约束（check 适用于 Oracle） 缺省约束（default） 注意：约束有上面的6种，但是这些约束还有：表级约束和列级约束的划分\n列级约束：包含在列定义中，直接跟在该列的定义之后，用 空格 分割；不必指定列名。是对某一个特定列的约束，有五种：主键、唯一、检查、默认、非空，即除了外键约束外，所有约束都有列级约束的表现形式\n表级约束：与列级约束的定义相互独立，不包含在列级约束中；通常用于对多个列一起进行约束，约束与定义之间用 , 分割；必须指出要约束的列的名称。用于对多个列一起进行约束，有四种：主键、外键、唯一、检查（巧记：非空约束和缺省约束没有表级约束的表现形式）\n而每一种约束又有单一约束和联合约束之分，比如我们常见的非空约束，既可以只约束一个字段，也可以同时约束多个字段\n非空约束 # 创建表，给字段添加非空约束\n// 非空约束的列级约束表现形式 create table t_user( id int(3), name varchar(255) not null ); // 注意：非空约束没有表级约束，只有列级约束，所以这里只给出了列级约束的例子 插入数据时如果没有插入 name 字段的数据，则会报错\n唯一性约束 # 使用 unique 约束的字段，具有唯一性，不可以重复，但是可以为 null\n// 唯一性约束的列级约束表现形式 create table t_user( id int(3), name varchar(255) not null, email varchar(255) unique ); // 唯一性约束的表级约束表现形式 create table t_user( id int(3), name varchar(255) not null, email varchar(255), unique(email) ); 如果有两条检录插入相同的 email 值，则会报错\nmysql\u0026gt; insert into t_user(id,name,email) values(1,\u0026#39;xlj\u0026#39;,\u0026#39;932834897@qq.com\u0026#39;); Query OK, 1 row affected (0.00 sec) mysql\u0026gt; insert into t_user(id,name,email) values(2,\u0026#39;jay\u0026#39;,\u0026#39;932834897@qq.com\u0026#39;); ERROR 1062 (23000): Duplicate entry \u0026#39;932834897@qq.com\u0026#39; for key \u0026#39;email\u0026#39; 拓展：在实际开发中有时候可能会有注册用户时用户名不能重复的需求，这时候我们就可以通过唯一性约束来实现，而不必非要通过后端的逻辑去实现\n上面的例子都是单一约束，我们再来看一下唯一性约束的联合约束的表现形式，联合约束多见于表级约束：\n联合约束意为如果两条记录中，所定义的联合约束的字段的值都相同，则报错\n// 唯一性约束的联合约束形式 create table t_user( id int(3), name varchar(255) not null, email varchar(255), unique(name, email) ); // 插入第一条数据 mysql\u0026gt; insert into t_user(id,name,email) values(1,\u0026#39;xxx\u0026#39;,\u0026#39;qq.com\u0026#39;); Query OK, 1 row affected (0.05 sec) // 插入第二条数据，如果只是与联合约束中的某一个字段相同，并不会报错 mysql\u0026gt; insert into t_user(id,name,email) values(2,\u0026#39;mmm\u0026#39;,\u0026#39;qq.com\u0026#39;); Query OK, 1 row affected (0.05 sec) // 如果是插入的记录中的两个联合约束的字段都与已存在的记录相同，则报错 mysql\u0026gt; insert into t_user(id,name,email) values(3,\u0026#39;mmm\u0026#39;,\u0026#39;qq.com\u0026#39;); ERROR 1062 (23000): Duplicate entry \u0026#39;mmm-qq.com\u0026#39; for key \u0026#39;name\u0026#39; 表级约束可以使用关键字 constraint 起名字，方便之后删除该约束\ncreate table t_user( id int(3), name varchar(255) not null, email varchar(255), constraint t_user_name_email_unique unique(name, email) ); // 格式: constraint 该约束起的名 约束() 主键约束 # 主键约束和 not null unique 的区别：给某个字段添加主键约束之后，该字段不能重复也不能为空，其表现效果上和 not null unique 相同，但二者的本质不同。因为主键约束还会默认添加为 索引 \u0026ndash;index\n主键呢又有 单一主键和复合主键之分，但是无论是单一主键还是复合主键，一张表的主键约束却只能有一个（只能有一个主键约束），但是可以作用于多个字段\n单一主键：主键约束只作用于一个字段\n复合主键：主键约束作用于多个字段（只能用于表级约束）\n// 单一主键（列级定义） mysql\u0026gt; create table t_user( -\u0026gt; id int(10) primary key, -\u0026gt; name varchar(32) -\u0026gt; ); Query OK, 0 rows affected (0.07 sec) // 单一主键（表级定义） mysql\u0026gt; create table t_user( -\u0026gt; id int(10), -\u0026gt; name varchar(32) not null, -\u0026gt; constraint t_user_id_pk primary key(id) -\u0026gt; ); Query OK, 0 rows affected (0.01 sec) // 复合主键（标记定义） mysql\u0026gt; create table t_user( -\u0026gt; id int(10), -\u0026gt; name varchar(32) not null, -\u0026gt; email varchar(128) unique, -\u0026gt; primary key(id,name) -\u0026gt; ); Query OK, 0 rows affected (0.05 sec) 在 MySql 中提供了一个自动生成主键值的功能，主键值不用用户自己维护，默认从1开始自动递增\n外键约束 # 不常用，而且不建议使用\n致谢 # 本文参考自https://blog.csdn.net/w_linux/article/details/79655073，有兴趣的可以查看\n","date":"2019-04-26","externalUrl":null,"permalink":"/posts/mysql%E7%BA%A6%E6%9D%9F/","section":"文章","summary":"","title":"MySQL约束","type":"posts"},{"content":"","externalUrl":null,"permalink":"/authors/","section":"Authors","summary":"","title":"Authors","type":"authors"},{"content":" 在这里，你可以找到关于 编程、生活、杂记 等方面的实用指南和经验分享。 ","externalUrl":null,"permalink":"/","section":"QiYue's Blog","summary":"","title":"QiYue's Blog","type":"page"},{"content":"","externalUrl":null,"permalink":"/series/","section":"Series","summary":"","title":"Series","type":"series"},{"content":" 关于我 # 你好，我是 QiYue，一名技术探索者。\n这个博客是我的个人技术笔记和随笔空间，主要记录在 Linux 运维、数据库管理、开发工具使用等方面的实践经验。\n技术栈 # Linux 运维：CentOS、Linux Mint 等发行版的安装与配置 数据库：MySQL、Redis 的部署、配置与优化 开发工具：Git、Hugo、Pages CMS 等 部署方案：GitHub Pages + GitHub Actions 自动化部署 关于这个博客 # 这个博客使用以下技术栈搭建：\nHugo — 静态站点生成器，极速构建 Blowfish 主题 — 现代、灵活的 Hugo 主题 Pages CMS — 基于 Git 的可视化内容管理 GitHub Pages — 免费托管与自动部署 GitHub Actions — CI/CD 自动化构建 所有文章内容完全属于我自己，存储在 Git 仓库中，可随时迁移。\n联系我 # 欢迎通过以下方式与我交流：\nGitHub：hello-github-ui X (Twitter)：@yuan_meng_meng Telegram：web.telegram.org ","externalUrl":null,"permalink":"/about/","section":"QiYue's Blog","summary":"","title":"关于","type":"page"},{"content":"","externalUrl":null,"permalink":"/archives/","section":"归档","summary":"","title":"归档","type":"archives"},{"content":"","externalUrl":null,"permalink":"/search/","section":"QiYue's Blog","summary":"","title":"搜索","type":"page"},{"content":"","externalUrl":null,"permalink":"/posts/","section":"文章","summary":"","title":"文章","type":"posts"}]