当前位置: 主页 > JAVA语言

java获取文件编码-java文件 gbk编码

发布时间:2023-02-09 14:44   浏览次数:次   作者:佚名

java文件 gbk编码_java获取文件编码_java文件编码转换

作者|Soham Sengupta, Srijeeb Roy

译者|陈良芬策展|丁小云

复杂的企业应用程序通常具有不同的业务逻辑。 这些业务逻辑中的前提条件和后续的系统动作(我们称之为规则)总是在变化。 而且,我们在这里谈论的规则需要比技术和编程更多的领域特定知识。 当我们实施这些规则时,我们不应该总是想着依赖代码,而应该驻留在代码库之外,由具有核心领域专业知识的人编写(他们只需要具备最低限度的技术和编程知识)。 有一种特定类型的软件工具,即规则引擎,可以帮助解决难以确定的业务规则需求。 领域专家不需要擅长编码和技术,就像公司的品牌和营销团队不需要了解企业门户和移动应用程序的底层技术,但他们需要擅长编写和编辑图像,横幅和其他内容帐户可以轻松完成)。 Adobe aem 是提供无代码/低代码内容创作的内容管理系统之一。 新兴技术和云平台不断提出低代码和无代码解决方案,这些解决方案被需求市场广泛接受。 本文介绍了一种将业务操作外部化为低代码工具的轻量级方法,这样具有领域专业知识的人也可以帮助实现业务规则。

虽然我们已经可以在市场上选择很多规则引擎,比如Drools(它是一个功能丰富的业务规则管理系统)、Easy Rules、Rule Book、Oracle Rules SDK、Blaze(fico)、IBM Decision Manager等等。 这些规则引擎通过各自丰富的功能(包括版本控制)以声明方式启用规则管理,这通常对许多应用程序非常有用。 然而,在一些不太复杂的解决方案中,它们通常是多余的并且未得到充分利用。 相反,维护这个额外的组件似乎更像是一种负债而不是资产,成本大于实际使用价值。

在本文中,我们试图展示如何以最简单的方式实现外部化规则,利用 Java 的固有特性,而不局限于其他框架的任何传递依赖性。 当技术规则(用 Java 编写的代码片段)需要外部化并且可能经常更改时,这种方法很有用。 因此,无论框架如何,这种方法在任何 Java 生态系统中都同样有价值。 为从外部源(例如文件或 URL)加载的规则提供一个简单的基于声明模型的 POJO,这些规则表示谓词或相当于 lambda 表达式的 Java 代码片段。 外部源的内容是Java lambda风格的表达式或Java代码片段,源范围包括本地数据库和云端资源,这样就可以在应用程序之外编写规则,即使应用程序不停机。 无论有没有云总线,我们都可以轻松地将它与 Spring 微服务和云配置集成。 此方法提供静态加密以确保业务规则的安全性(机密性和完整性)。 此外,除了支持 Jasypt 和 Spring Config Ciphering 之外,还可以将任何自定义安全性插入其中。

规则引擎:传统方式

处理业务逻辑频繁变化的最传统和理想的方式是规则引擎。 规则通常是一组 IF-THEN 条件。

规则 ≡ 前置条件+后续动作(RULE ≡ CONDITION+ACTION)

规则引擎是一种软件工具,简单来说,它为我们提供了在源代码之外设置规则的能力。 规则引擎使半技术/非程序员能够以不同方式设置规则。 利用特定领域的知识,这些规则引擎可以提供 GUI 驱动的直观规则创作。 Drools、DTRules、Oracle Policy Automation system、Easy-Rules等都是常用的规则引擎。

传统的规则引擎帮助领域专家从代码库中编写规则集和行为,这对于复杂的大型业务环境非常有用。 但对于较小的、不复杂的系统,考虑到在本地或云基础设施上运行的经常性成本、许可成本等,事实证明,通常对于这种小型、简单的系统,规则引擎功能的必要性很大,而且它很难被充分利用。 对于小型团队,添加任何需要额外技能的组件都是对带宽的浪费。 一些商业规则引擎学习曲线陡峭,一直追求更好的规则引擎性能,较少考虑用户的成本效益。 在本文中,我们尝试说明如何在源代码之外成功维护规则,以强制运行在 Java Tech-Stack(如 Spring Boot)上的中型系统,从而使其他用户更容易自定义这些规则。

这种方法适用于那些负担不起专用规则引擎及其基础设施、维护、经常性成本等开销的团队,并且团队中的领域专家具有软件基础,​​或者团队成员身兼数职。

这种极简的做法适合刚创业的人。 深究大公司的起源,不难发现,很多大公司起步时都是小团队,精打细算,人才济济,理念创新。 因此,考虑到所有因素,虽然团队的规模可能并不完全确定,但 10 人或更少的团队在面临相同的限制时可以充分利用这种方法。

更大的团队也可以从这种方法中受益。 此外,除非需要所有很酷的核心功能(商业规则引擎的主要功能),否则削减一些专用规则引擎将是有益的。

java文件编码转换_java获取文件编码_java文件 gbk编码

结果和新颖性摘要

下图中概述的步骤描述了这些组件,还概述了该机制的更高级别的功能。

java文件编码转换_java获取文件编码_java文件 gbk编码

配置存储规则,它们只是 java 方法或布尔表达式。 为了避免 Java 语法的冗长,我们还使用了 Lambdas 和方法引用,它们在 Java 方法语法之上提供了一个额外的抽象层。

配置存储由领域专家编写的规则。 以下是有效的语句java获取文件编码,以类似 lambda 主体的语法编写,以捕捉专家的意图。 例如,要将娱乐软件分级委员会 (ESRB) 分级的成人视频游戏归类为适合年龄的产品,领域专家可以这样写:

customer -> customer.getAge()>=17

配置可以是文件、原始字节流或 URL,并且可以放在任何地方。 提供多种放置选项,包括:

本地磁盘上的文件。

数据库(SQL 和 NoSQL)。

远程网络位置(例如 HTTP URL、原始 TCP 套接字等)。

放在云端的某个位置(比如亚马逊云科技的S3 bucket或者谷歌的云硬盘等)

该框架提供了源编码、安全和传输的综合抽象。 任何标准或专有编解码器 (CODEC) 都可用于存储和检索规则,这同样适用于两个主要的安全范例——机密性和完整性。 至此,大家就可以编写自己的适配器(Adapter)了。 只有这样,其检索过程的最后一步才应该在 Java 表达式或谓词中生成规则。

java获取文件编码_java文件 gbk编码_java文件编码转换

通过一些额外的工作,添加一种机制,可以使流规则适应使用任何标准协议(例如 WebSocket、HTTP/2、XMPP、MQTT)的浏览器。 这种方法甚至可以与 Web 程序集相结合,以在 Web 浏览器中集成安全性和复杂规则。

入门指南

虽然传统上最好在开始使用之前了解 SDK 的结构,但为了方便和简单起见,我们颠倒了顺序。 在本节中,我们将说明如何通过简单的问题陈述或用例将规则具体化。

先决条件

用户必须具有使用 Java SE 1.8 或更高版本进行软件开发的经验。 除此之外,还需要一台装有 Java SE 1.8(带有 IDE)的标准机器。 在本文的所有示例中,将选择 Eclipse 作为 IDE,并选择 MAVEN 作为构建工具。

步骤1

从 () 下载库并将其保存在本地路径,例如 D:\externalize-rules.jar。 这是完整的源代码()。

第二步

创建一个 Maven 项目java获取文件编码,将编译器源代码级别设置为 1.8,并具有如下所示的依赖项。

java文件编码转换_java文件 gbk编码_java获取文件编码

java文件编码转换_java文件 gbk编码_java获取文件编码

问题陈述:一家高端服装零售店经常根据一系列不同的参考标准,如职业、收入水平、工作/生活地点、教育程度等,在不同的场合为顾客提供折扣。为了不为了复杂化,我们假设一个简单的客户模型类如下:

java文件 gbk编码_java获取文件编码_java文件编码转换

让我们进一步假设一个类 Repo_Customer 作为客户信息的来源,并根据特定的资格标准选择有资格享受折扣的客户。

java获取文件编码_java文件 gbk编码_java文件编码转换

然后,我们可以使用以下任何一种或组合来定义折扣资格规则:

java获取文件编码_java文件 gbk编码_java文件编码转换

第三步

值得注意的是,Lambda 没有那么冗长。 主题专家可以使用它们来定义规则,而无需深入了解 Java 编程语言。

我们将折扣规则保留在代码库之外,因为它可能会经常更改。 然后选择所有可用存储选项中最简单的一个,将规则存储在本地磁盘上的文件中。 SDK 帮助加载和执行这些规则。 以下文件存储在本地磁盘上:

java文件 gbk编码_java获取文件编码_java文件编码转换

我们在文件中创建自己的标记标准(它可以是任何一种设计和实现,不依赖于任何特定的实现):

第四步

最后,我们写一小段代码来检查我们的规则,看规则是否执行成功:

java文件 gbk编码_java文件编码转换_java获取文件编码

java获取文件编码_java文件 gbk编码_java文件编码转换

在开发工具包中

现在我们已经成功启动并编写了一个简单的快速启动程序,我们可以回头开始探索这个SDK是做什么的,如下示意图所示。

一、整体程序结构:

java文件 gbk编码_java获取文件编码_java文件编码转换

java文件编码转换_java文件 gbk编码_java获取文件编码

java文件编码转换_java文件 gbk编码_java获取文件编码

com.yourcompany.libs.externalizedrules.poc.RuleExecutor 是定义规则执行方法的抽象类。 规则的实现需要通过用户应用程序代码(提供实现)对这两个抽象方法进行子类化。 R代表决策的结果,T代表决策所依据的输入对象。 例如,如果我们要定义一个规则来过滤所有 60 岁以上的客户,我们需要进行子类化。 规则执行器

com.yourcompany.libs.externalizedrules.poc.models.RuleExecutionConfig 此类从配置源加载规则并且必须事先初始化。 此类负责以下内容:

1.从配置源加载原始规则库

2.将规则库片段合成java代码(如Lamda)

3.编译综合Java代码

java文件 gbk编码_java获取文件编码_java文件编码转换

4.最后将这个类加载到主存中进行规则执行。定义框架的具体实现

我们在[2]中使用了PredicateRuleExecutor。这是一个特殊的实现

com.yourcompany.libs.externalizedrules.poc.RuleExecutor 其值为布尔值。

它执行以下 3 个任务:

1.加载评估为true或false的规则。也就是说,它将原始规则库或lambda表达式转换为一个java方法,该方法接受一个对象并返回一个布尔值,即形成一个

java.util.function.Predicate

2.它的框架,尤其是PredicateExecutionContextLoader,它是RuleExecutionContextLoader的子类,为底层任务提供了抽象。

3. 如果需要加载加密、编码/混淆的字节序列,根据一些标准/自定义编解码器,必须重写此方法,

com.yourcompany.libs.externalizedrules.poc.services.PredicateExecutionContextLoader.load(InputStream

4. 这种方法的一个优点是它以字节为单位工作。 因此,可以从文件系统、URL、云存储、数据库等加载规则。

5. 从本地文件加载原始规则。 方法 getConfigStream() 返回一个 java.io.inputStream。 它提供了从任何地方加载原始字节的灵活性。

我们将简要说明如何从几个主要和常用的来源加载规则。

java文件编码转换_java获取文件编码_java文件 gbk编码

一些常用源码的实现

在本节中,我们将探讨一些可以从中加载配置的常见且重要的源文件。