java代码中的中文资源提取 国际化

  背景:由于之前开发插件的java代码里,中文注释和显示信息都是直接写在java代码中,现在需要将其中的需要做国际化的中文资源提取出来,放到properties文件里,所以写了一个小工具。

  思想:应用了状态机模式编程,定义正常状态(NormalState),引号内状态(QuotState),块注释状态(BlockNote),行注释状态(LineNote),四个状态类,定义一个流程控制类(Process),一个数据模型类(DataModel),还有一个Main类(Main)。

  废话不多说,上代码。

  数据模型类(DataModel)

import java.io.BufferedReader;
import java.io.PrintWriter;

public class DataModel {
    private State state;
    private BufferedReader reader;
    private String line;
    private int from;
    private PrintWriter output;

    public DataModel(State state, BufferedReader reader, String line, int from,
            PrintWriter output) {
        super();
        this.state = state;
        this.reader = reader;
        this.line = line;
        this.from = from;
        this.output = output;
    }

    public State getState() {
        return state;
    }

    public void setState(State state) {
        this.state = state;
    }

    public BufferedReader getReader() {
        return reader;
    }

    public void setReader(BufferedReader reader) {
        this.reader = reader;
    }

    public String getLine() {
        return line;
    }

    public void setLine(String line) {
        this.line = line;
    }

    public int getFrom() {
        return from;
    }

    public void setFrom(int from) {
        this.from = from;
    }

    public PrintWriter getOutput() {
        return output;
    }

    public void setOutput(PrintWriter output) {
        this.output = output;
    }

}

  状态类的基类:

import java.io.BufferedReader;
import java.io.PrintWriter;

public abstract class State {
        public abstract  void handle(BufferedReader reader,String line,int from,PrintWriter output);
}

  四个状态子类,其中行注释类不需要做处理。

package src;

import java.io.BufferedReader;
import java.io.PrintWriter;

public class NormalState extends State {
    public static final NormalState normal = new NormalState();

    @Override
    public void handle(BufferedReader reader, String line, int from,
            PrintWriter output) {
        // TODO Auto-generated method stub
        for (int k = from; k < line.length(); k++) {
            char now = line.charAt(k);
            if ((now == '"' && k == 0)
                    || (now == '"' && k > 0 && line.charAt(k - 1) != '\\')) {
                Process.queue.add(new DataModel(QuotState.quotState, reader,
                        line, k + 1, output));
                break;
            } else if ('/' == now && k < line.length() - 1
                    && ('/' == line.charAt(k + 1))) {
                break;// go back to process's excute
            } else if ('/' == now && k < line.length() - 1
                    && ('*' == line.charAt(k + 1))) {
                Process.queue.add(new DataModel(BlockNote.blockNote, reader,
                        line, k + 2, output));
                break;
            }
        }
    }
}
package src;

import java.io.BufferedReader;
import java.io.PrintWriter;

public class QuotState extends State {
    public static final QuotState quotState = new QuotState();
    public static int keynum = 0;

    @Override
    public void handle(BufferedReader reader, String line, int from,
            PrintWriter output) {
        // TODO Auto-generated method stub
        int beginIndex = from, endIndex = from, k = from;
        boolean out = false;
        for (k = from; k < line.length(); k++) {
            char now = line.charAt(k);
            if ((now == '"' && k == 0)
                    || (now == '"' && k > 0 && line.charAt(k - 1) != '\\')) {
                Process.queue.add(new DataModel(NormalState.normal, reader,
                        line, k + 1, output));
                break;
            } else if (line.substring(k, k + 1).getBytes().length > 1) {
                for (; k < line.length(); k++) {
                    if (line.charAt(k) == '"' && line.charAt(k - 1) != '\\') {
                        endIndex = k;
                        break;
                    }
                }
                System.out.println("key: " + keynum++ + "  "
                        + line.substring(beginIndex, endIndex));
                output.write(line.substring(beginIndex, endIndex) + "\n");
                out = true;
                break;
            }
        }
        if (out) {

            Process.queue.add(new DataModel(NormalState.normal, reader, line,
                    k + 1, output));
        }

    }

}
package src;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;

class BlockNote extends State {
    public static final BlockNote blockNote = new BlockNote();

    @Override
    public void handle(BufferedReader reader, String line, int from,
            PrintWriter output) {
        // TODO Auto-generated method stub
        boolean out = false;
        int k = from;
        for (k = from; k < line.length(); k++) {
            char now = line.charAt(k);
            if ('*' == now && k < line.length() - 1
                    && ('/' == line.charAt(k + 1))) {
                out = true;
                break;
            }
        }

        try {
            label:
            while (!out && (line = reader.readLine()) != null) {
                for (k = 0; k < line.length(); k++) {
                    char now2 = line.charAt(k);
                    if ('*' == now2 && k < line.length() - 1
                            && ('/' == line.charAt(k + 1))) {
                        out = true;
                        break label;
                    }
                }
            }
            if (out) {
                Process.queue.add(new DataModel(NormalState.normal, reader,
                        line, k + 2, output));
            }
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}
import java.io.BufferedReader;
import java.io.PrintWriter;

public class LineNote extends State{

    @Override
    public void handle(BufferedReader reader, String line, int from,PrintWriter output) {
        // TODO Auto-generated method stub
        
    }

}

  处理控制类

package src;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;

public class Process {
    public static Queue<DataModel> queue = new ConcurrentLinkedQueue<DataModel>();
    private PrintWriter output = null;
    private String charset = null;

    public Process(PrintWriter output, String charset) {
        this.output = output;
        this.charset = charset;
    }

    public void readTxt(File tempFile) throws IOException {

        System.out.println("#" + tempFile.getName() + "\n");
        output.write("#" + tempFile.getName() + "\n");
        BufferedReader reader = new BufferedReader(new InputStreamReader(
                new FileInputStream(tempFile), charset));
        String tempString = "";
        while ((tempString = reader.readLine()) != null) {
            queue.add(new DataModel(NormalState.normal, reader, tempString, 0,
                    output));
            while (queue.size() > 0) {
                DataModel dm = queue.remove();
                dm.getState().handle(dm.getReader(), dm.getLine(),
                        dm.getFrom(), dm.getOutput());
            }
        }
        reader.close();

    }

    public void readDir(String folder) throws IOException {
        File dir = new File(folder);
        // PrintWriter output = new PrintWriter(new FileWriter(new
        // File(outFile)));
        if (dir.isDirectory()) {
            System.out.println("#Dir#" + dir.getName() + "\n");
            output.write("#Dir#" + dir.getName() + "\n");
            String[] children = dir.list();
            for (int i = 0; i < children.length; i++) {
                File tempFile = new File(dir, children[i]);
                if (tempFile.isDirectory())
                    readDir(tempFile.getName());
                else {
                    readTxt(tempFile);
                }
            }
        }
    }
}

  最后就是含有main方法的调用了。

package src;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Main {
    public static String outFile = "F:/tiqu.properties";
    public static String inFolder = "F:/src";
    public static String charset = "gbk";

    public static void main(String[] args) throws IOException {
        PrintWriter output = new PrintWriter(new FileWriter(new File(outFile)));
        Process process = new Process(output, charset);
        process.readDir(inFolder);
        output.close();
    }
}