gpt4 book ai didi

java - 'Un'-从 Eclipse 或 Intellij 外部化字符串

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

我在属性文件中有一堆字符串,我想“取消外部化”,即内联到我的代码中。

我看到 Eclipse 和 Intellij 都非常支持从代码中“外部化”字符串,但是它们是否支持将属性文件中的字符串内联回代码中?

例如,如果我有这样的代码 -

My.java

System.out.println(myResourceBundle.getString("key"));

我的.properties

key=a whole bunch of text

我希望我的 java 代码被替换为 -

My.java

System.out.println("a whole bunch of text");

最佳答案

我编写了一个简单的 Java 程序,您可以使用它来执行此操作。

去外部化.java

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map.Entry;
import java.util.Properties;
import java.util.Set;
import java.util.Stack;
import java.util.logging.Level;
import java.util.logging.Logger;


public class Deexternalize {

public static final Logger logger = Logger.getLogger(Deexternalize.class.toString());

public static void main(String[] args) throws IOException {
if(args.length != 2) {
System.out.println("Deexternalize props_file java_file_to_create");
return;
}

Properties defaultProps = new Properties();
FileInputStream in = new FileInputStream(args[0]);
defaultProps.load(in);
in.close();

File javaFile = new File(args[1]);

List<String> data = process(defaultProps,javaFile);

buildFile(javaFile,data);

}

public static List<String> process(Properties propsFile, File javaFile) {
List<String> data = new ArrayList<String>();
Set<Entry<Object,Object>> setOfProps = propsFile.entrySet();
int indexOf = javaFile.getName().indexOf(".");
String javaClassName = javaFile.getName().substring(0,indexOf);

data.add("public class " + javaClassName + " {\n");
StringBuilder sb = null;

// for some reason it's adding them in reverse order so putting htem on a stack
Stack<String> aStack = new Stack<String>();

for(Entry<Object,Object> anEntry : setOfProps) {
sb = new StringBuilder("\tpublic static final String ");
sb.append(anEntry.getKey().toString());
sb.append(" = \"");
sb.append(anEntry.getValue().toString());
sb.append("\";\n");
aStack.push(sb.toString());
}

while(!aStack.empty()) {
data.add(aStack.pop());
}

if(sb != null) {
data.add("}");
}

return data;
}

public static final void buildFile(File fileToBuild, List<String> lines) {
BufferedWriter theWriter = null;

try {
// Check to make sure if the file exists already.
if(!fileToBuild.exists()) {
fileToBuild.createNewFile();
}

theWriter = new BufferedWriter(new FileWriter(fileToBuild));

// Write the lines to the file.
for(String theLine : lines) {
// DO NOT ADD windows carriage return.
if(theLine.endsWith("\r\n")){
theWriter.write(theLine.substring(0, theLine.length()-2));
theWriter.write("\n");
} else if(theLine.endsWith("\n")) {
// This case is UNIX format already since we checked for
// the carriage return already.
theWriter.write(theLine);
} else {
theWriter.write(theLine);
theWriter.write("\n");
}
}

} catch(IOException ex) {
logger.log(Level.SEVERE, null, ex);
} finally {
try {
theWriter.close();
} catch(IOException ex) {
logger.log(Level.SEVERE, null, ex);
}
}
}
}

基本上,您需要做的就是使用属性文件的位置和您要创建的包含属性的 java 文件的名称来调用此 java 程序。

例如这个属性文件:

测试.properties

TEST_1=test test test
TEST_2=test 2456
TEST_3=123456

将变成:

java_test.java

public class java_test {
public static final String TEST_1 = "test test test";
public static final String TEST_2 = "test 2456";
public static final String TEST_3 = "123456";
}

希望这就是您所需要的!

编辑:

我明白你现在的要求了。如果您使用一些正则表达式魔法,您可以使用我的代码来做您想做的事。假设您有上面的 java_test 文件。将内联属性复制到要用其替换 myResourceBundle 代码的文件中。

例如,

测试文件.java

public class TestFile {

public static final String TEST_1 = "test test test";
public static final String TEST_2 = "test 2456";
public static final String TEST_3 = "123456";

public static void regexTest() {

System.out.println(myResourceBundle.getString("TEST_1"));
System.out.println(myResourceBundle.getString("TEST_1"));
System.out.println(myResourceBundle.getString("TEST_3"));

}
}

好的,现在如果您使用的是 eclipse(任何现代 IDE 都应该能够执行此操作),请转到编辑菜单 -> 查找/替换。在窗口中,您应该看到一个“正则表达式”复选框,选中它。现在将以下文本输入到查找文本区域:

myResourceBundle\.getString\(\"(.+)\"\)

和反向引用

\1

进入替换。

现在单击“全部替换”,瞧!代码应该已内联以满足您的需求。

现在 TestFile.java 将变成:

测试文件.java

public class TestFile {

public static final String TEST_1 = "test test test";
public static final String TEST_2 = "test 2456";
public static final String TEST_3 = "123456";

public static void regexTest() {

System.out.println(TEST_1);
System.out.println(TEST_1);
System.out.println(TEST_3);

}
}

关于java - 'Un'-从 Eclipse 或 Intellij 外部化字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4766602/

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