0%

Scala 文件操作:读写与系统命令交互

Scala 提供了简洁的 API 用于文件读写和系统命令执行,既可以利用 Java 的 IO 类库,也可以使用 Scala 标准库中的工具(如 scala.io.Source)。此外,Scala 对系统命令的支持尤为便捷,能轻松实现命令执行、管道和重定向。本文将详细介绍 Scala 的文件操作和系统命令交互方式。

文件读取:scala.io.Source

Scala 标准库的 scala.io.Source 是读取文本文件的首选工具,支持从文件、URL、输入流等多种来源读取数据。

读取文件的所有行

使用 Source.fromFile 打开文件,getLines 方法获取所有行(返回 Iterator[String]):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import scala.io.Source
import java.io.File

object FileReader {
def main(args: Array[String]): Unit = {
// 打开文件(指定路径和编码)
val source: Source = Source.fromFile(new File("data.txt"), "UTF-8")

try {
// 读取所有行(返回迭代器)
val lines: Iterator[String] = source.getLines()

// 遍历行并打印
println("文件内容:")
lines.foreach(println)
} finally {
// 关闭资源(避免内存泄漏)
source.close()
}
}
}

关键说明

  • Source.fromFile 的第一个参数可以是文件路径字符串("data.txt")或 java.io.File 对象。
  • 第二个参数指定编码(如 "UTF-8"),默认使用系统编码。
  • 必须在 finally 块中调用 source.close(),确保资源释放。

读取整个文件为字符串

使用 mkString 方法直接将文件内容转换为单个字符串:

阅读全文 »

Git 协议详解:四种数据传输传输方式对比

Git 作为分布式版本控制系统,支持多种协议进行仓库数据的传输和同步。了解不同协议的特点和适用场景,有助于选择更高效、安全的协作方式。Git 主要支持四种协议:本地协议(Local)HTTP 协议SSH 协议Git 协议

本地协议(Local Protocol)

本地协议通过本地文件系统或网络文件共享(如 NFS)访问仓库,远程仓库本质上是本地硬盘或局域网中的一个目录。

1. 基本用法

1
2
3
4
5
6
7
8
# 克隆本地仓库(绝对路径)
git clone file:///opt/git/project.git

# 克隆本地仓库(相对路径)
git clone ./../project.git

# 为现有仓库添加本地远程
git remote add local /opt/git/project.git

2. 特点

  • 优点
    • 简单直观,适合本地单机或局域网内的小型团队。
    • 无需额外配置服务,直接通过文件系统访问。
    • 传输速度快(本地磁盘或局域网传输)。
  • 缺点
    • 不适合跨网络的远程协作(如异地团队)。
    • 权限管理依赖文件系统(如 Linux 文件权限),不够灵活。
    • 多人同时操作可能导致文件锁定或冲突。

3. 适用场景

  • 个人本地多仓库同步。
  • 局域网内的小型团队临时协作。

HTTP 协议

HTTP 协议是最常用的协议之一,通过 http://https:// 访问仓库,支持用户名 / 密码认证。

1. 基本用法

阅读全文 »

Nginx 多端适配配置:基于 User-Agent 的动态资源分发

在移动互联网时代,网站通常需要为 PC 端、移动端(手机、平板)提供不同的页面或服务。Nginx 可通过解析客户端的User-Agent头(浏览器标识),自动将请求导向对应的资源或服务,实现多端适配。本文详细讲解 Nginx 多端适配的配置方法、场景示例及优化技巧。

多端适配原理:解析 User-Agent

客户端发起请求时,会在 HTTP 头中携带User-Agent(UA)信息,包含设备类型、浏览器版本等(如:

  • PC 端:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.0.0 Safari/537.36
  • 移动端:Mozilla/5.0 (iPhone; CPU iPhone OS 16_5 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Mobile/15E148

Nginx 通过$http_user_agent变量获取 UA 信息,结合正则匹配判断设备类型,进而分发到对应的资源或服务。

基础配置:静态资源多端适配

若 PC 端和移动端的静态资源(HTML、CSS、JS)存放在不同目录,可通过root指令动态切换根目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
server {
listen 80;
server_name example.com;

location / {
# 默认指向PC端资源目录
root /var/www/pc;

# 匹配移动端UA,切换到移动端资源目录
if ($http_user_agent ~* '(Android|webOS|iPhone|iPod|BlackBerry|iPad)') {
root /var/www/mobile;
}

# 索引页设置
index index.html index.htm;
}
}

配置说明

  • 正则匹配规则~*表示不区分大小写匹配,(Android|iPhone|...)涵盖主流移动设备的 UA 特征;
  • 目录结构
    • PC 端资源:/var/www/pc/index.html
    • 移动端资源:/var/www/mobile/index.html
  • 访问效果:PC 端访问example.com加载pc/index.html,移动端访问则加载mobile/index.html

进阶配置:反向代理多端服务

若 PC 端和移动端对应不同的后端服务(如 PC 端 API 和移动端 API),可通过proxy_pass反向代理到不同服务:

阅读全文 »

Elasticsearch 索引变为只读问题:原因与解决方案

当 Elasticsearch 集群磁盘空间不足时,可能会触发内置的磁盘保护机制,将索引强制设置为只读状态,导致无法写入或修改数据。本文详细解析这一问题的成因、解决步骤及预防措施。

问题根源:磁盘水位线(Watermark)保护机制

Elasticsearch 为防止磁盘空间耗尽,通过磁盘水位线机制监控节点磁盘使用率,并在达到阈值时采取保护措施:

水位线参数 默认值 触发行为
cluster.routing.allocation.disk.watermark.low 85% 磁盘使用率超过 85% 时,不再向该节点分配新分片。
cluster.routing.allocation.disk.watermark.high 90% 磁盘使用率超过 90% 时,将该节点上的分片迁移到其他节点。
cluster.routing.allocation.disk.watermark.flood_stage 95% 磁盘使用率超过 95% 时,将节点上所有索引设置为只读read_only_allow_delete),仅允许删除操作。

触发只读的典型日志

当达到 flood_stage 水位线时,日志会显示类似以下内容:

1
2
flood stage disk watermark [95%] exceeded on [node-id][node-name][/path/to/data] 
free: 1.9gb[4%], all indices on this node will be marked read-only

此时,所有写入、更新操作会失败,仅查询和删除操作可用。

解决步骤:恢复读写能力

紧急处理:释放磁盘空间

首先需释放足够的磁盘空间(建议至少保留 10% 以上空闲空间):

  • 删除无用的索引、日志文件或临时文件。
  • 迁移部分数据到其他存储(如冷数据归档)。

关闭磁盘水位线检查(临时)

若无法立即扩容,可临时关闭磁盘阈值检查,允许 Elasticsearch 忽略水位线限制:

阅读全文 »

Tomcat 类加载器:打破双亲委派的隔离机制

Java 类加载器的双亲委派模型通过层级委派确保类加载的安全性和唯一性,但 Tomcat 作为多 Web 应用容器,需要实现应用间类库隔离(避免不同应用的同名类冲突)和类热部署,因此自定义了一套类加载器体系。本文将详细解析 Tomcat 类加载器的结构、加载机制及与双亲委派的差异。

Tomcat 类加载器的结构

Tomcat 打破了 Java 原生的双亲委派模型,设计了多层次的类加载器,实现不同范围类的隔离与共享。其核心类加载器结构如下(从顶层到应用层):

tomcat类加载器

核心类加载器及职责

类加载器 父加载器 配置参数 职责范围
Common 类加载器 System 类加载器 common.loader 加载 Tomcat 内部和所有 Web 应用共享的类(如 Servlet 规范 API、通用工具类)。
Catalina 类加载器 Common 类加载器 server.loader 加载仅 Tomcat 内部可见的类(对 Web 应用隐藏),默认与 Common 共享。
Shared 类加载器 Common 类加载器 shared.loader 加载所有 Web 应用共享但对 Tomcat 不可见的类,默认与 Common 共享。
Web 应用类加载器 Shared 类加载器 无(自动生成) 加载当前 Web 应用私有类(/WEB-INF/classes/WEB-INF/lib 下的类),仅当前应用可见。
Jasper 类加载器 Web 应用类加载器 无(JSP 专用) 加载 JSP 编译后的类,支持 JSP 热部署(修改后重新编译加载)。

配置文件:catalina.properties

Tomcat 通过 conf/catalina.properties 配置类加载器的资源路径:

阅读全文 »