如何在Java中将Hashtable<string, string>写入文本文件?

4

我有一个哈希表,htmlcontent是urlstring的html字符串。

我想把哈希表写入一个文本文件中。

有人能提供一个解决方案吗?

6个回答

3
每个条目一行,两个字符串用逗号分隔,这样怎么样?就像这样:
"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();
}

这是一个打印哈希表的方法,但我的意思是将哈希表写入文本文件。我使用了以下代码:BufferedWriter writer = new BufferedWriter(new FileWriter(resultOutputFile)); writer.write(googleHashTableResult);但是出现了错误:错误:类型 BufferedWriter 中的方法 write(int) 对参数不适用。 - tiendv
1
FileWriter是OutputStreamWriter的子类。BufferedWriter不是。不要传入BufferedWriter,而要传入FileWriter。如果这不是你想要的,请相应地调整代码。 - Edwin Buck
谢谢您的回复,我已经按照您所说的方法进行了处理!类似这样:OutputStreamWriter writer = new OutputStreamWriter(os); BufferedWriter buffer = new BufferedWriter(writer); for(Entry<String, String> obj: googleHashTableResult.entrySet()) { writer.write(obj.getKey()); writer.write(newline); writer.write(obj.getValue()); } writer.close(); buffer.close(); - tiendv

3
对于I/O部分,您可以使用new PrintWriter(new File(filename))。像使用System.out一样调用println方法,别忘了在之后调用close()。确保优雅地处理任何IOException
如果您有特定的格式,您需要解释一下,否则只需使用Hashtable.entrySet()上的简单for-each循环即可遍历Hashtable的条目。
顺便说一句,如果您不需要synchronized功能,则HashMap<String,String>可能比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。请记住,Maps具有引用可能为空的条目的键。 - Edwin Buck
谢谢更新。可能是因为过于保守地编码,这通常不是坏事。 - Edwin Buck

1
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<String, String>类型的参数。 - tiendv
哦,抱歉。已更新答案。 - Enno Shioji

1

你可以尝试一下

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

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


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 查询一个字符串并获得结果时, String serialized = JSONValue.toJSONString(yourMap);但是当我在 Jeditor 中显示结果时,它无法显示 Unicode(越南语),但 Yahoo 搜索结果可以。 请问 Google 搜索引擎的结果编码是什么?如何在结果为越南语时显示它? - tiendv
抱歉回复晚了。这是另一个问题,您应该在此处回答一个问题并打开另一个问题。干杯! - Jonas Fagundes

1

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

同样的思路还有一种更简单的方法,就是将一个任意字符(比如反斜杠\)指定为转义字符。当它们出现在任何一个字符串中时,你必须将反斜杠加倍,并以转义形式表示制表符(\t)和换行符('\n);然后你可以使用真正的(而不是转义序列)制表符作为两个字段(键和值)之间的字段分隔符,并在每行末尾使用真正的(而不是转义序列)换行符。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接