2013-08-01 38 views
4

我在Java工作,但我确信这个问题扩展到多种其他语言和情况。从外部.txt文件流入大字符串还是直接在其中直接编码是更智能的?

如果我定期在JTextPane显示文本的大块,

是更好地把它们写入到一个文本文件,并定期呼吁 一个扫描器读取所述文件,把它扔进了JTextPane,

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

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

如果所需的应用程序使问题更容易回答,我正在使用RPG元素进行基于文本的冒险以练习我的Java编码。根本不是专业,只是概念练习。因此,我必须在大量的讲故事和更小的问题和情况之间切换,这取决于玩家以前的选择。

我是新来的,不得不处理我的编码中的大量文字,所以谢谢所有回答!

回答

4

把它放在一个单独的文件里,最好是在JAR本身,所以你可以通过getResourceAsStream()轻松找到它。

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

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


以下是你可能想从我的文件实用程序类的一些方法:

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

    } 
} 
+1

不错的实用程序,但是当您将整个文件读入内存时,它们会出现大文本文件失败。尽管如此,仍然适用于这类问题。 –

+2

是的,我从来没有用它来做任何大于几千字节的事情,但我认为对于大多数实际应用来说,它们就足够了。 – MightyPork

2

最好有单独的文件。其中一个原因是,在某个时候,你希望能够将你的游戏翻译成不同的语言。