【发布时间】:2011-02-16 16:20:02
【问题描述】:
我有仓促 htmlcontent 是 urlstring 的 html 字符串。 我想将 hastable 写入 .text 文件。
谁能提出解决方案?
【问题讨论】:
我有仓促 htmlcontent 是 urlstring 的 html 字符串。 我想将 hastable 写入 .text 文件。
谁能提出解决方案?
【问题讨论】:
由于您对文件格式没有任何要求,因此我不会创建自定义格式。只需使用标准的东西。我建议为此使用 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 库,但我认为这个适合您的需要。
【讨论】:
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();
}
}
}
【讨论】:
你可以试试
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 类重新加载数据。
【讨论】:
对于 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 的第一个声明和初始化,并将其打印到标准输出而不是文本文件。
java.io.PrintWriter API
这个类中的方法从不抛出 I/O 异常,尽管它的一些构造函数可能。客户端可以通过调用
checkError()来查询是否发生错误。
【讨论】:
每个条目一行,用逗号分隔两个字符串怎么样?有点像:
"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();
}
【讨论】:
对于文本表示,我建议选择一些不太可能出现在字符串中的字符,然后输出一个 CSV 格式的文件,其中这些字符作为分隔符、引号、终止符和转义符。本质上,每一行(由终止符指定,否则任何一个字符串中都可能有行尾字符)将作为第一个 CSV“字段”作为哈希表中条目的键,作为第二个字段,值为它。
一种更简单的方法是指定一个任意字符,例如反斜杠\,作为转义字符。当它们出现在任一字符串中时,您必须将反斜杠加倍,并以转义形式表示制表符 (\t) 和行尾 ('\n);那么您可以使用真实(非转义序列)制表符作为两个字段(键和值)之间的字段分隔符,并在每行末尾使用真实(非转义序列)行尾。
【讨论】: