簡體   English   中英

來自Eclipse或Intellij的'Un'-外化字符串

[英]'Un'-externalize strings from Eclipse or Intellij

我在屬性文件中有一堆字符串,我想“取消外部化”,即內聯到我的代碼中。

我看到Eclipse和Intellij都支持從代碼中“外化”字符串,但是它們中的任何一個都支持將屬性文件中的字符串內聯回代碼嗎?

例如,如果我有像 -

My.java

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

My.properties

key=a whole bunch of text

我希望將我的java代碼替換為 -

My.java

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

我寫了一個簡單的java程序,你可以用來做這個。

Dexternalize.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程序。

例如這個屬性文件:

test.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代碼的文件中。

例如,

TestFile.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將成為:

TestFile.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);

    }
}

您可以使用Eclipse“Externalize Strings”小部件。 它也可以用於非外化。 選擇所需的字符串,然后按“內部化”按鈕。 如果字符串之前被外部化,它將被放回並從messages.properties文件中刪除。

如果你可以解釋你需要怎么做,那么你可以得到正確的答案。

對你的問題的簡短回答是否定的,特別是在Intellij中(我對eclipse知之甚少)。 當然,稍微長一點但仍然不是很有用的答案是編寫一個插件。 (這將獲取屬性文件列表並讀取映射中的鍵和值,然后使用Map中的值(對於鍵)執行正則表達式替換ResourceBundle.getValue(“Key”)。我將編寫此插件我自己,如果你能說服我,有更多像你這樣的人,有這個要求。)

更精細的答案就是這個。

1_首先,我將所有執行屬性文件讀取的代碼重新分解為單個類(或稱為PropertyFileReader的模塊)。

2_我將創建一個屬性文件閱讀器模塊,它遍歷屬性文件中的所有鍵,然后將這些信息存儲在一個映射中。

4_我可以使用填充的值創建靜態地圖對象,也可以從中創建一個常量類。 然后我將替換屬性文件讀取器模塊中的邏輯,以使用地圖上的get或靜態類而不是屬性文件讀取。

5_一旦我確定應用程序執行正常。(通過檢查我的所有單元測試是否通過),然后我將刪除我的屬性文件。

注意:如果您使用的是spring,則可以通過一種簡單的方法從屬性文件列表中拆分所有屬性鍵值對。 如果你使用彈簧讓我知道。

來自@potong sed 's|^\\([^=]*\\)=\\(.*\\)|s@Messages.getString("\\1")@"\\2"@g|;s/\\\\/\\\\\\\\/g' messages.properties | sed -i -f - *.java sed 's|^\\([^=]*\\)=\\(.*\\)|s@Messages.getString("\\1")@"\\2"@g|;s/\\\\/\\\\\\\\/g' messages.properties | sed -i -f - *.java在你的src目錄中運行它,看看魔法。

我會推薦其他東西:將外部化字符串拆分為可本地化和不可本地化的屬性文件。 將某些字符串移動到另一個文件可能比將其移回源代碼更容易(順便說一下,這會損害可維護性)。

當然,您可以編寫簡單的(在某種程度上)Perl(或其他)腳本,它將搜索對資源包的調用並在此處引入常量...換句話說,我沒有聽說過去外化機制,你需要手工完成(或自己編寫一些自動化腳本)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM