Как извлечь все строки из приложения в Java - PullRequest
4 голосов
/ 05 октября 2011

В приложении Android все значения строк жестко закодированы (метки, заголовки диалогов, кнопки и т. Д.).Моя задача - извлечь все эти строки в файл ресурсов.Без ручного прохождения кода и создания большого количества c / p, есть ли способ извлечь все строки из приложения?Используя регулярные выражения?Я думал о написании Pattern с чем-то вроде ". *" Или каким-то образом анализировать код?

Редактировать: Мне известны строки externalize для Eclipse, но он создает файл .properties, и мне нужноXML-файл.Итак, потребуется еще некоторое усилие, чтобы снова преобразовать его в файл .xml.

Я думал о написании простой программы, которая извлекала бы все строки с именами классов, в которых они были найдены.

Ответы [ 2 ]

3 голосов
/ 05 октября 2011

Eclipse предоставляет мастер внешних строк .Для решений для Android: Внешние строки для проекта Android .

Надеюсь, это поможет.

1 голос
/ 18 августа 2012

Я написал короткую программу, чтобы помочь мне достичь этого.У меня был файл с более чем сотней строк, поэтому просто нажимать Ctrl + 1 -> Enter в каждой строке было бы слишком хлопотно.

Маленькая программа принимает местоположение вашего файла .javaв качестве ввода и помещает информацию в вашу консоль для C & P.Можно улучшить изображение, чтобы сканировать файловую систему и делать все файлы .java, но этого было достаточно для моей цели ...

package de.panschk.androidutil;
import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.UnsupportedEncodingException;
import java.util.HashSet;
import java.util.Set;

public class ExtractStringHelper {

public static void main (String[] args) throws IOException {
    String fileName = "LOCATION OF .JAVA FILE";
    FileInputStream fis = new FileInputStream(fileName);
    streamToStringReplaceEntities(fis);
    fis.close();

}

private static Set<String> varNames= new HashSet<String>();
public static void streamToStringReplaceEntities(InputStream is)
        throws IOException {
    BufferedInputStream bis = new BufferedInputStream(is);
    ByteArrayOutputStream codeOut = new ByteArrayOutputStream();
    StringBuffer xmlOut = new StringBuffer();
    boolean inLineComment = false;
    boolean inMultilineComment = false;
    boolean inQuotes = false;
    char lastChar = ' ';
    ByteArrayOutputStream stringContent = new ByteArrayOutputStream();
    int result = bis.read();
    while (result != -1) {
        boolean inComment = inLineComment || inMultilineComment;
        byte b = (byte) result;
        // read next byte
        result = bis.read();
        boolean copyCharToBuffer = true;
        if (!inQuotes && !inComment && b == '"') {
            stringContent = new ByteArrayOutputStream();
            inQuotes = true;
            copyCharToBuffer = false;
        } else if (inQuotes && b == '"') {
            String content = stringContent.toString("UTF-8");
            String varName = makeVariableName(content);
            inQuotes = false;
            addXMLContent(varName, content, xmlOut);
            addCodeContent(varName, codeOut);
            copyCharToBuffer = false;

        } else if (inQuotes) {
            copyCharToBuffer = false;
            stringContent.write(b);

        } else if (!inComment && !inQuotes && lastChar == '/' && b == '/') {
            inLineComment = true;
        } else if (!inComment && !inQuotes && lastChar == '/' && b == '*') {
            inMultilineComment = true;
        } else if (inLineComment && b == '\n') {
            inLineComment = false;
        } else if (inMultilineComment && lastChar == '*' && b == '/') {
            inMultilineComment = false;
        }

        if (copyCharToBuffer) {
            codeOut.write(b);
        }
        lastChar = (char) b;
    }

    System.out.println(codeOut.toString("UTF-8"));
    System.out.println(xmlOut.toString());

}

private static void addCodeContent(String varName,
        ByteArrayOutputStream codeOut) throws IOException {
    String contentToAdd = "getResources().getString(R.string."+varName+")";
    byte[] bytes;
    try {
        bytes = contentToAdd.getBytes("UTF-8");
        codeOut.write(bytes);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

}

private static void addXMLContent(String varName, String content,
        StringBuffer xmlOut) {
    if (!varNames.contains(varName)) {
        content = content.replace("'", "\\'");
        xmlOut.append("    <string name=\"").append(varName).append("\">").append(content).append("</string>\n");
        varNames.add(varName);
    }

}

static String makeVariableName(String s) {
    s = s.replace(' ', '_');
    s = s.replaceAll("[^A-Za-z0-9_]", "").toLowerCase();
    return s;
}

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...