引用外部库
概述
OracleLoadstar/SCE-Universe_Java_Edition 项目在“引用外部库”方面采取了一种不同寻常的方法。它没有采用现代Java项目常用的依赖管理工具,如Maven或Gradle,而是主要依赖于Java标准库(JDK自带的类库)以及项目内部自定义实现的工具类。这意味着项目中没有显式声明的第三方库依赖,所有的功能都基于JDK或项目自身的代码。
这种方法简化了构建过程,仅通过 javac 和 jar 命令即可完成编译和打包,避免了管理复杂的第三方依赖。然而,这也意味着项目需要自行实现一些常见的功能(例如JSON解析),或者仅限于使用Java标准库提供的功能。
架构
主组件交互
此架构图展示了 SCE-Universe_Java_Edition 应用程序如何与Java标准库以及项目内部的工具模块进行交互。核心应用程序通过使用Java标准库提供的基础功能(如Swing GUI、文件I/O等)和项目自定义工具(如JSON处理)来提供其功能。
说明:
- Application (cn.oraclestar.sce.App.App): 应用程序的入口点,负责协调各项功能。
- Internal Tools (内部工具模块): 包含项目自定义实现的功能,例如
gui类用于文件选择器,Json和JsonArray用于自定义JSON数据的序列化与反序列化。这些工具类对应用程序的其他部分提供了“库”级别的服务。 - Java Standard Library (Java标准库): 应用程序和内部工具都广泛使用了Java开发工具包(JDK)自带的类库,如
javax.swing用于构建用户界面,java.io处理文件输入输出,java.util提供数据结构和算法。
自定义JSON工具类结构
项目内部实现了 Json 和 JsonArray 类来处理JSON数据的序列化和反序列化,这替代了通常会引入的第三方JSON库(如Jackson, Gson)。
说明:
Json类提供了基础的Map<String, String>到 JSON 字符串以及 JSON 字符串到Map<String, String>的转换功能。JsonArray类在此基础上扩展,处理List<Map<String, String>>与 JSON 数组字符串之间的转换,并提供数组的增删改查操作。
核心流程
该项目的核心流程不涉及复杂的外部依赖管理系统,其构建和运行流程非常直接。
说明: 这个流程图展示了从开发者执行构建脚本到应用程序在JVM中运行的整个过程。它强调了没有外部依赖管理工具的参与,编译器和打包工具直接处理项目内部的源文件。
使用示例
使用 javax.swing.JFileChooser 进行文件选择
项目通过 cn.oraclestar.sce.system.tools.gui 类封装了 JFileChooser,用于在GUI中进行文件或目录选择。这是Java标准库在GUI交互中的典型应用。
1package cn.oraclestar.sce.system.tools;
2
3import javax.swing.JFileChooser;
4import javax.swing.filechooser.FileSystemView;
5
6public class gui {
7 public static String selectorD(){
8 JFileChooser filechooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
9 filechooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
10 filechooser.showOpenDialog(null);
11 // 如果用户选择了文件,返回其绝对路径;否则返回null或空字符串,具体取决于实现
12 if (filechooser.getSelectedFile() != null) {
13 return filechooser.getSelectedFile().getAbsolutePath();
14 }
15 return null; // 或者抛出异常,根据需求而定
16 }
17
18 public static String selector(){
19 JFileChooser fileChooser = new JFileChooser(FileSystemView.getFileSystemView().getHomeDirectory());
20 fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
21 fileChooser.showOpenDialog(null);
22 // 如果用户选择了文件,返回其绝对路径;否则返回null或空字符串,具体取决于实现
23 if (fileChooser.getSelectedFile() != null) {
24 return fileChooser.getSelectedFile().getAbsolutePath();
25 }
26 return null; // 或者抛出异常,根据需求而定
27 }
28}使用内部 Json 工具类进行JSON处理
项目内部的 Json 类提供了一个将 Map<String, String> 转换为JSON字符串以及反向操作的简单实现。
1package cn.oraclestar.sce.system.tools;
2
3import java.io.StringReader;
4import java.util.HashMap;
5import java.util.Map;
6import java.util.Properties;
7
8public class Json {
9 // 将 Map<String,String> 转换为 JSON 字符串
10 public static String toJson(Map<String,String> a){
11 String rawJson = "{";
12 for (Map.Entry<String,String> temp : a.entrySet()){
13 rawJson += ("\"" + temp.getKey().toString() + "\":" + "\"" + temp.getValue() + "\",");
14 }
15 rawJson = rawJson.substring(0,rawJson.length() - 1); // 移除最后一个逗号
16 return rawJson + "}";
17 }
18
19 // 将 JSON 字符串转换为 Map<String,String>
20 public static Map<String,String> toMap(String json){
21 json = json.replaceAll("[{}]",""); // 移除大括号
22 json = json.replaceAll(",","\n"); // 逗号替换为换行,方便 Properties 解析
23 json = json.replaceAll(":","="); // 冒号替换为等号
24 json = json.replaceAll("\"",""); // 移除引号
25
26 Properties props = new Properties();
27 StringReader sr = new StringReader(json);
28 try{
29 props.load(sr); // 使用 Properties 加载
30 Map<String,String> temp_map = new HashMap<String,String>();
31 for(Map.Entry<Object,Object> e : props.entrySet()){
32 temp_map.put((String)e.getKey(),(String)e.getValue());
33 }
34 return temp_map;
35 } catch (Exception e){
36 e.printStackTrace();
37 } finally {
38 if(sr != null){
39 sr.close();
40 }
41 }
42 return null; // 发生异常时返回 null
43 }
44}使用内部 JsonArray 工具类进行JSON数组处理
JsonArray 类用于处理包含多个JSON对象的字符串,并将其转换为 List<Map<String, String>>。
1package cn.oraclestar.sce.system.tools;
2
3import java.util.ArrayList;
4import java.util.HashMap;
5import java.util.List;
6import java.util.Map;
7
8public class JsonArray {
9
10 // 将 Map 列表转换为 JSON 数组字符串
11 public static String toJson(List<Map<String,String>> list) {
12 String rawJson = "[";
13 for (Map<String,String> map : list) {
14 rawJson += Json.toJson(map) + ","; // 复用 Json.toJson
15 }
16 if (list.size() > 0) {
17 rawJson = rawJson.substring(0, rawJson.length() - 1); // 移除最后一个逗号
18 }
19 return rawJson + "]";
20 }
21
22 // 将 JSON 数组字符串转换为 Map 列表
23 public static List<Map<String,String>> toList(String jsonArray) {
24 List<Map<String,String>> resultList = new ArrayList<>();
25
26 if (jsonArray.startsWith("[") && jsonArray.endsWith("]")) {
27 jsonArray = jsonArray.substring(1, jsonArray.length() - 1);
28 }
29
30 String[] jsonObjects = splitJsonObjects(jsonArray); // 分割JSON对象
31
32 for (String jsonObject : jsonObjects) {
33 if (jsonObject.trim().isEmpty()) continue;
34
35 Map<String,String> map = Json.toMap(jsonObject); // 复用 Json.toMap
36 if (map != null) {
37 resultList.add(map);
38 }
39 }
40
41 return resultList;
42 }
43
44 // 辅助方法:分割JSON对象,处理嵌套括号
45 private static String[] splitJsonObjects(String jsonArray) {
46 List<String> objects = new ArrayList<>();
47 int braceCount = 0;
48 int startIndex = 0;
49
50 for (int i = 0; i < jsonArray.length(); i++) {
51 char c = jsonArray.charAt(i);
52 if (c == '{') {
53 braceCount++;
54 } else if (c == '}') {
55 braceCount--;
56 } else if (c == ',' && braceCount == 0) { // 仅在括号平衡时分割
57 objects.add(jsonArray.substring(startIndex, i).trim());
58 startIndex = i + 1;
59 }
60 }
61
62 if (startIndex < jsonArray.length()) {
63 objects.add(jsonArray.substring(startIndex).trim());
64 }
65
66 return objects.toArray(new String[0]);
67 }
68}API 参考
cn.oraclestar.sce.system.tools.Json
提供静态方法,用于将 Map<String, String> 与简单的JSON字符串相互转换。
static String toJson(Map<String,String> a)
将给定的 Map<String, String> 对象转换为JSON格式的字符串。
参数:
a(Map<String,String>): 待转换的映射对象。
返回:
- (
String): 转换后的JSON字符串。
static Map<String,String> toMap(String json)
将给定的JSON字符串转换为 Map<String, String> 对象。
参数:
json(String): 待转换的JSON字符串。
返回:
- (
Map<String,String>): 转换后的映射对象。若解析失败,返回null。
cn.oraclestar.sce.system.tools.JsonArray
提供静态方法,用于将 List<Map<String, String>> 与JSON数组字符串相互转换,并提供操作JSON数组的方法。
static String toJson(List<Map<String,String>> list)
将给定的 List<Map<String, String>> 对象转换为JSON数组格式的字符串。
参数:
list(List<Map<String,String>>): 待转换的映射列表。
返回:
- (
String): 转换后的JSON数组字符串。
static List<Map<String,String>> toList(String jsonArray)
将给定的JSON数组字符串转换为 List<Map<String, String>> 对象。
参数:
jsonArray(String): 待转换的JSON数组字符串。
返回:
- (
List<Map<String,String>>): 转换后的映射列表。
static String[] splitJsonObjects(String jsonArray) (private)
辅助方法,用于将JSON数组字符串分割成单个JSON对象的字符串数组。
static String addToJsonArray(String jsonArray, Map<String,String> newMap)
向一个JSON数组字符串中添加一个新的 Map<String, String> 对象。
参数:
jsonArray(String): 原始的JSON数组字符串。newMap(Map<String,String>): 要添加的新映射对象。
返回:
- (
String): 添加新对象后的JSON数组字符串。
static String removeFromJsonArray(String jsonArray, int index)
从一个JSON数组字符串中移除指定索引位置的对象。 参数:
jsonArray(String): 原始的JSON数组字符串。index(int): 要移除对象的索引位置。
返回:
- (
String): 移除对象后的JSON数组字符串。
static int getSize(String jsonArray)
获取JSON数组字符串中包含的对象数量。 参数:
jsonArray(String): 原始的JSON数组字符串。
返回:
- (
int): JSON数组中对象的数量。
cn.oraclestar.sce.system.tools.gui
提供静态方法,用于显示Java Swing的文件选择器以选择文件或目录。
static String selectorD()
打开一个JFileChooser对话框,允许用户选择一个目录。 返回:
- (
String): 用户选择的目录的绝对路径。如果用户取消选择,可能返回null。
static String selector()
打开一个JFileChooser对话框,允许用户选择一个文件。 返回:
- (
String): 用户选择的文件的绝对路径。如果用户取消选择,可能返回null。
相关链接
- build.sh - 项目的构建脚本,展示了如何编译和打包应用程序。
- App.java - 应用程序的入口点。
- gui.java - 包含
JFileChooser用法的GUI工具类。 - Json.java - 自定义JSON序列化/反序列化工具类。
- JsonArray.java - 自定义JSON数组处理工具类。