gpt4 book ai didi

java - 以相同的方式解析文件和命令行选项

转载 作者:搜寻专家 更新时间:2023-11-01 03:45:52 25 4
gpt4 key购买 nike

我用 Java 写了一个脚本(不确定它是不是 write 术语)。用户可以通过两种方式指定环境变量:命令行或文件。命令行如下(以~~~分隔)

ENV1=1~~~ENV2=String2

文件如下所示:

setenv ENV1 1
setenv ENV2 String2

我写了一个返回环境集合的函数(所以输出是:{ENV2=String2, ENV1=1})。它看起来如下:

public Map<String, String> getEnvs() {
final String envArg = getOption(cmdNames.ENV); // returns the path or the command-line options
if (null != envArg && !"".equals(envArg) && envArg.contains("=")) {
final String varArray[] = envArg.split("~~~"); // split by a special string
final Map<String, String> new_vars = new HashMap<String, String>();
for (final String var : varArray) {
final String varName = var.split("=")[0];
String varValue = var.split("=")[1];
if (!varValue.contains("\"") && varValue.contains(" ")) {
varValue = "\"" + varValue + "\"";
}
new_vars.put(varName, varValue);
}
return new_vars;
}
return null;
}

现在,我为命令行选项编写了一个函数。我想添加对文件选项的支持。问题是这些选项有不同的外观 - 其中一个我需要用 ~~~ 拆分,而另一个用 setenv 拆分。我会非常高兴听到一些关于如何在同一 getEnvs 函数中添加对文件选项的支持的建议。我脑子里已经有了一些实现,但它变得困惑,我正在寻找尽可能干净的方法。 (据我了解,我们需要将文件中的数据插入数组并通过 setenv 拆分,但我们还需要在 namevalue 之间拆分code> - 感觉代码可以使用两次,但我不确定应该用哪一部分。

最佳答案

您似乎试图解决的问题似乎最好由策略模式处理。

文件内容和命令行都可以用字符串表示。这些字符串可以由某种类型的解析器处理,这些解析器可以根据您希望执行的操作使用不同的策略。

看起来像这样

public static void main(String... args) throws IOException{
boolean parseFromFile = true; //whatever criteria you want to use
String content;
Parser p;
String fileName = "yikes";
if(parseFromFile){
p = new Parser(new FileParseStrategy());
//we need to read contents of file prior to parsing
content = Files.readAllLines(Paths.get(fileName)).stream()
.collect(Collectors.joining(System.lineSeparator()));
}
else {
p = new Parser(new CmdLineParseStrategy());
content = getContent(cmdNames.ENV); //just coping what you used.
}
Map<String, String> vars = p.run(content);
}

public class Parser{
final ParseStrategy parseStrategy;

public Parser(ParseStrategy ps) {
this.parseStrategy = ps;
}

public Map<String, String> run(String input){
return parseStrategy.parse(input);
}
}

public interface ParseStrategy {
Map<String, String> parse(String input);
}

public class FileParseStrategy implements ParseStrategy{

@Override
public Map<String, String> parse(String input) {
Map<String, String> result = new HashMap<>();
for(String line : input.split("\r?\n|\r")) {
String[] parts = validate(line.split(" "));
result.put(parts[1], parts[2]);
}
return result;
}

private String[] validate(String[] parts) {
if(parts.length != 3) {
throw new IllegalArgumentException("3 parts needed");
}
if(!parts[0].equalsIgnoreCase("setenv")){
throw new IllegalArgumentException("unrecognized cmd");
}
return parts;
}
}
//given implementation of parsing from command line.
public class CmdLineParseStrategy implements ParseStrategy {

@Override
public Map<String, String> parse(String envArg) {
if (null != envArg && !"".equals(envArg) && envArg.contains("=")) {
final String varArray[] = envArg.split("~~~"); // split by a special string
final Map<String, String> new_vars = new HashMap<String, String>();
for (final String var : varArray) {
final String varName = var.split("=")[0];
String varValue = var.split("=")[1];
if (!varValue.contains("\"") && varValue.contains(" ")) {
varValue = "\"" + varValue + "\"";
}
new_vars.put(varName, varValue);
}
return new_vars;
}
return null;
}
}

关于java - 以相同的方式解析文件和命令行选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55695718/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com