4

我正在使用 Java,但我确信这个问题会扩展到其他多种语言和情况。

如果我定期在 a 中显示大块文本JTextPane

将它们写入 .txt 文件并定期调用扫描程序读取所述文件并将其放入 JTextPane 是否更好,

或者我应该简单地将文本作为字符串直接写入我的代码中,然后将它们显示在 JTextPane 中?

一种方法比另一种更合适吗?我知道“将其全部写入代码”方法最终会给我提供大量的方法和一些比我习惯的更丑陋的代码。但是,某些情况需要包含或排除不同的文本位。

如果所需的应用程序使问题更容易回答,我正在尝试使用 RPG 元素进行基于文本的冒险来练习我的 Java 编码。一点都不专业,只是概念实践。因此,我必须根据玩家之前的选择在大块的故事讲述和较小的问题和情况之间交替进行。

我是新手,不得不在我的编码中处理大量文本,所以感谢所有回答的人!

4

2 回答 2

4

最好将它放在一个单独的文件中,最好放在 JAR 本身中,这样您就可以轻松地使用getResourceAsStream().

然后,您可以轻松地编辑此文件而不会弄乱代码,您还可以在应用程序编译为 JAR 后对其进行修改。

一般来说,将逻辑与数据分开是一种很好的做法。


以下是我的 FileUtils 类中您可能喜欢的一些方法:

public static String streamToString(InputStream in) {

    BufferedReader br = null;
    StringBuilder sb = new StringBuilder();

    String line;
    try {

        br = new BufferedReader(new InputStreamReader(in));
        while ((line = br.readLine()) != null) {
            sb.append(line + "\n");
        }

    } catch (IOException e) {
        Log.e(e);
    } finally {
        if (br != null) {
            try {
                br.close();
            } catch (IOException e) {
                Log.e(e);
            }
        }
    }

    return sb.toString();
}


public static InputStream stringToStream(String text) {

    try {
        return new ByteArrayInputStream(text.getBytes("UTF-8"));
    } catch (UnsupportedEncodingException e) {
        Log.e(e);
        return null;
    }
}


public static InputStream getResource(String path) {

    return FileUtils.class.getResourceAsStream(path);
}

您还可以使用SimpleConfig类从文件中解析列表和映射:(
注释掉 Log.something 调用并替换为 System.err.println())

package net.mightypork.rpack.utils;


import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


/**
 * Utility for parsing simple config files<br>
 * # and // mark a comment<br>
 * empty lines and lines without "=" are ignored<br>
 * lines with "=" must have "key = value" format, or a warning is logged.<br>
 * use "NULL" to create empty value.
 * 
 * @author MightyPork
 */
public class SimpleConfig {

    /**
     * Load list from file
     * 
     * @param file file
     * @return map of keys and values
     * @throws IOException
     */
    public static List<String> listFromFile(File file) throws IOException {

        String fileText = FileUtils.fileToString(file);

        return listFromString(fileText);
    }


    /**
     * Load map from file
     * 
     * @param file file
     * @return map of keys and values
     * @throws IOException
     */
    public static Map<String, String> mapFromFile(File file) throws IOException {

        String fileText = FileUtils.fileToString(file);

        return mapFromString(fileText);
    }


    /**
     * Load list from string
     * 
     * @param text text of the file
     * @return map of keys and values
     */
    public static List<String> listFromString(String text) {

        List<String> list = new ArrayList<String>();

        String[] groupsLines = text.split("\n");

        for (String s : groupsLines) {
            // ignore invalid lines
            if (s.length() == 0) continue;
            if (s.startsWith("#") || s.startsWith("//")) continue;

            // NULL value
            if (s.equalsIgnoreCase("NULL")) s = null;

            if (s != null) s = s.replace("\\n", "\n");

            // save extracted key-value pair
            list.add(s);
        }

        return list;
    }


    /**
     * Load map from string
     * 
     * @param text text of the file
     * @return map of keys and values
     */
    public static Map<String, String> mapFromString(String text) {

        LinkedHashMap<String, String> pairs = new LinkedHashMap<String, String>();

        String[] groupsLines = text.split("\n");

        for (String s : groupsLines) {
            // ignore invalid lines
            if (s.length() == 0) continue;
            if (s.startsWith("#") || s.startsWith("//")) continue;
            if (!s.contains("=")) continue;

            // split and trim
            String[] parts = s.split("=");
            for (int i = 0; i < parts.length; i++) {
                parts[i] = parts[i].trim();
            }

            // check if both parts are valid
            if (parts.length == 0) {
                Log.w("Bad line in config file: " + s);
                continue;
            }

            if (parts.length == 1) {
                parts = new String[] { parts[0], "" };
            }

            if (parts.length != 2) {
                Log.w("Bad line in config file: " + s);
                continue;
            }


            // NULL value
            if (parts[0].equalsIgnoreCase("NULL")) parts[0] = null;
            if (parts[1].equalsIgnoreCase("NULL")) parts[1] = null;

            if (parts[0] != null) parts[0] = parts[0].replace("\\n", "\n");
            if (parts[1] != null) parts[1] = parts[1].replace("\\n", "\n");

            // save extracted key-value pair
            pairs.put(parts[0], parts[1]);
        }

        return pairs;
    }


    /**
     * Save map to file
     * 
     * @param target
     * @param data
     * @throws IOException
     */
    public static void mapToFile(File target, Map<String, String> data) throws IOException {

        String text = ""; //# File written by SimpleConfig

        for (Entry<String, String> e : data.entrySet()) {
            if (text.length() > 0) text += "\n";

            String key = e.getKey();
            String value = e.getValue();

            if (key == null) key = "NULL";
            if (value == null) value = "NULL";

            key = key.replace("\n", "\\n");
            value = value.replace("\n", "\\n");

            text += key + " = " + value;
        }

        FileUtils.stringToFile(target, text);

    }


    /**
     * Save list to file
     * 
     * @param target
     * @param data
     * @throws IOException
     */
    public static void listToFile(File target, List<String> data) throws IOException {

        String text = ""; //# File written by SimpleConfig

        for (String s : data) {
            if (text.length() > 0) text += "\n";

            if (s == null) s = "NULL";

            s = s.replace("\n", "\\n");

            text += s;
        }

        FileUtils.stringToFile(target, text);

    }
}
于 2013-08-01T13:49:17.733 回答
2

最好有单独的文件。原因之一是在某些时候您希望能够将您的游戏翻译成不同的语言。

于 2013-08-01T13:50:35.067 回答