【问题标题】:How to write a hashtable<string, string > in to text file,java?如何将 hashtable<string, string> 写入文本文件,java?
【发布时间】:2011-02-16 16:20:02
【问题描述】:

我有仓促 htmlcontent 是 urlstring 的 html 字符串。 我想将 hastable 写入 .text 文件。

谁能提出解决方案?

【问题讨论】:

    标签: java hashtable


    【解决方案1】:

    由于您对文件格式没有任何要求,因此我不会创建自定义格式。只需使用标准的东西。我建议为此使用 json!

    替代方案包括 xml 和 csv,但我认为 json 是这里的最佳选择。 Csv 不处理复杂类型,例如在地图的一个键中包含一个列表,并且 xml 编码/解码可能非常复杂。

    json-simple 为例:

    String serialized = JSONValue.toJSONString(yourMap);
    

    然后将字符串保存到您的文件中(使用 Apache Commons IO 不是特定于您的域的内容):

    FileUtils.writeStringToFile(new File(yourFilePath), serialized);
    

    读取文件:

    Map map = (JSONObject) JSONValue.parse(FileUtils.readFileToString(new File(yourFilePath));
    

    您也可以使用其他 json 库,但我认为这个适合您的需要。

    【讨论】:

    • 好的,谢谢您的回复。我有一个关于 Jonson 数组的问题。当我使用 google api 查询字符串并获取结果时。字符串序列化 = JSONValue.toJSONString(yourMap);但是当我通过 Jeditor 显示结果时,它不能显示 uicode (VietNamese) 但 yahoo seach reult 可以。显示 google seachengine 结果的编码是什么?当它是越南语时,我如何显示结果?
    • tiendv,抱歉回复晚了。这是另一个问题,您应该在这里回答一个问题并为此打开另一个问题。干杯,
    • 谢谢!这拯救了我的一天!
    【解决方案2】:
    import java.io.*;
    class FileWrite 
    {
       public static void main(String args[])
      {
        HashTable table = //get the table
        try{
            // Create file 
            BufferedWriter writer = new BufferedWriter(new FileWriter("out.txt"));
            writer.write(table.toString());
        }catch (Exception e){
            e.printStackTrace();
        }finally{
          out.close();
        }
      }
    }
    

    【讨论】:

    • 它有一个错误BufferedWriter类型中的write(int)方法不适用于参数(Hashtable)
    • 哦,对不起。更新了答案。
    【解决方案3】:

    你可以试试

    public static void save(String filename, Map<String, String> hashtable) throws IOException {
        Properties prop = new Properties();
        prop.putAll(hashtable);
        FileOutputStream fos = new FileOutputStream(filename);
        try {
           prop.store(fos, prop);
        } finally {
           fos.close();
        }
    }
    

    这会将哈希表(或任何 Map)存储为属性文件。您可以使用 Properties 类重新加载数据。

    【讨论】:

      【解决方案4】:

      对于 I/O 部分,您可以使用new PrintWriter(new File(filename))。只需像调用System.out 一样调用println 方法,之后不要忘记close()。确保你优雅地处理任何IOException

      如果您有特定格式,则必须对其进行解释,否则您只需在 Hashtable.entrySet() 上进行简单的 for-each 循环即可遍历 Hashtable 的条目。

      顺便说一句,如果您不需要synchronized 功能,HashMap&lt;String,String&gt; 可能会比Hashtable 更好。

      相关问题


      这是一个简单的组合示例,但为了清楚起见省略了强大的 IOException 处理,并使用简单的格式:

      import java.io.*;
      import java.util.*;
      
      public class HashMapText {
          public static void main(String[] args) throws IOException {
              //PrintWriter out = new PrintWriter(System.out);
              PrintWriter out = new PrintWriter(new File("map.txt"));
      
              Map<String,String> map = new HashMap<String,String>();
              map.put("1111", "One");
              map.put("2222", "Two");
              map.put(null, null);
      
              for (Map.Entry<String,String> entry : map.entrySet()) {
                  out.println(entry.getKey() + "\t=>\t" + entry.getValue());
              }
      
              out.close();
          }
      }
      

      在我的机器上运行它会生成一个包含三行的map.txt

      null    =>  null
      2222    =>  Two
      1111    =>  One
      

      作为奖励,您可以使用out 的第一个声明和初始化,并将其打印到标准输出而不是文本文件。

      另见

      【讨论】:

      • 这将在引用具有 NullPointerException 的空条目的键上失败。请记住,地图的键引用可能为空的条目。
      • 感谢您的更新。一定是因为编码过于保守,这通常不是一件坏事。
      【解决方案5】:

      每个条目一行,用逗号分隔两个字符串怎么样?有点像:

      "key1","value1"
      "key2","value2"
      ...
      "keyn","valuen"
      

      保留引号,您也可以写出引用空条目的键,例如

      "key", null
      

      要实际生成表格,您可能需要使用类似于以下的代码:

      public void write(OutputStreamWriter out, HashTable<String, String> table)
      throws IOException {
        String eol = System.getProperty("line.separator");
        for (String key: table.keySet()) {
          out.write("\"");
          out.write(key);
          out.write("\",\"");
          out.write(String.valueOf(table.get(key)));
          out.write("\"");
          out.write(eol);
        }
        out.flush();
      }
      

      【讨论】:

      • 这是一种打印hastable的方法,但我的意思是将hashtable写入txt文件我使用BufferedWriter writer = new BufferedWriter(new FileWriter(resultOutputFile)); writer.write(googleHashTableResult);但它有一个错误:erro BufferedWriter 类型中的方法 write(int) 不适用于参数
      • FileWriter 是 OutputStreamWriter 的子类。 BufferedWriter 不是。不要传入 BufferedWriter,传入 FileWriter。如果这不是您想要的,请相应地调整代码。
      • 感谢您的回复,我有您所说的!类似的东西 OutputStreamWriter writer = new OutputStreamWriter(os); BufferedWriter 缓冲区 = 新的 BufferedWriter(writer); for(Entry obj: googleHashTableResult.entrySet()) { writer.write(obj.getKey()); writer.write(换行符); writer.write(obj.getValue()); } writer.close();缓冲区.close();
      【解决方案6】:

      对于文本表示,我建议选择一些不太可能出现在字符串中的字符,然后输出一个 CSV 格式的文件,其中这些字符作为分隔符、引号、终止符和转义符。本质上,每一行(由终止符指定,否则任何一个字符串中都可能有行尾字符)将作为第一个 CSV“字段”作为哈希表中条目的键,作为第二个字段,值为它。

      一种更简单的方法是指定一个任意字符,例如反斜杠\,作为转义字符。当它们出现在任一字符串中时,您必须将反斜杠加倍,并以转义形式表示制表符 (\t) 和行尾 ('\n);那么您可以使用真实(非转义序列)制表符作为两个字段(键和值)之间的字段分隔符,并在每行末尾使用真实(非转义序列)行尾。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-03-14
        • 2015-11-26
        • 2013-03-01
        • 2021-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多