Как написать хеш-таблицув текстовый файл, Java? - PullRequest
4 голосов
/ 07 мая 2010

у меня есть хастабл htmlcontent - это строка html строки urlstring. Я хочу записать hastable в текстовый файл.

Кто-нибудь может предложить решение?

Ответы [ 6 ]

3 голосов
/ 07 мая 2010

Для части ввода / вывода вы можете использовать new PrintWriter(new File(filename)).Просто вызовите методы println, как если бы вы System.out, и не забудьте потом close().Убедитесь, что вы обрабатываете любой IOException изящно.

Если у вас есть определенный формат, вам придется объяснить его, но в противном случае простой цикл for-each в Hashtable.entrySet()это все, что вам нужно для перебора записей 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 и выведите его на стандартный вывод вместо текстового файла.

См. также

3 голосов
/ 07 мая 2010

Как насчет одной строки для каждой записи и двух строк, разделенных запятой? Вроде как:

"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();
}
1 голос
/ 07 мая 2010

Поскольку у вас нет требований к формату файла, я бы не стал создавать собственный. Просто используйте что-то стандартное. Я бы рекомендовал использовать 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, но я думаю, что она соответствует вашим потребностям.

1 голос
/ 07 мая 2010

Вы можете попробовать

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 голос
/ 07 мая 2010
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();
    }
  }
}
1 голос
/ 07 мая 2010

Для представления текста я бы порекомендовал выбрать несколько символов, которые вряд ли встретятся в ваших строках, а затем вывести файл формата CSV с этими символами в качестве разделителей, кавычек, ограничителей и экранированных символов. По сути, каждая строка (как обозначено терминатором, так как в противном случае в любой строке могут быть символы конца строки) будет иметь в качестве первого поля CSV ключ записи в хеш-таблице, в качестве второго поля - значение для это.

Более простой подход в том же духе заключается в назначении одного произвольного символа, скажем, обратной косой черты \, в качестве escape-символа. Вам придется удваивать обратную косую черту, когда они встречаются в любой строке, и выражать в escape-форме табуляцию (\t) и конец строки ('\n); тогда вы можете использовать реальный (не escape-последовательность) символ табуляции в качестве разделителя полей между двумя полями (ключ и значение) и реальный (не escape-последовательность) конец строки в конце каждой строки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...