У меня есть огромная структура данных HashMap, которую я хочу сжать ее значения и записать их и ключи hashmap в виде байта на файлы. Также я хочу прочитать эти данные из некоторых файлов и распаковать их и поместить их в Hashmap.
Я реализовал все части, кроме записи и чтения этих данных из файла.
Я объяснил, что я делал до сих пор.
Я определил свой hashmap как HashMap<String, ArrayList<Posting>>
Проводка определена:
class Posting {
public int documentId;
public double score;
public Posting(){
documentId=-1;
score=1;
}
public Posting(int docId, double scr){
documentId = docId;
score = scr;
}
После того, как я заполнил Hashmap, я сжимаю все docIds ключа и сохраняю их как byte[]
и сжимаю scr как int[]
. Затем я хочу записать эту информацию в следующем порядке в файле.
key(String){seperator1}docIds(byte[]){seprator2}scores(int[]){seperator3}
key2(String){seperator1}docIds1(byte[]){seprator2}scores1(int[]){seperator3}
Я использую "." как отдельный в моей реализации.
Я написал и прочитал эти данные в файле на основе следующих кодов
DataOutputStream os= new DataOutputStream(new FileOutputStream(file,true));
os.writeBytes(key);
os.writeBytes(".");
int n = finalInvertedLists.get(key).size();
for (int i = 0; i < n ; i++) {
Posting p = finalInvertedLists.get(key).get(i);
os.writeByte(p.documentId);
os.writeBytes(".");
os.writeByte((int)p.score);
os.writeBytes(".");
}
os.close();
чтение списка проводки для данного слова на основе следующего кода
DataInputStream is= new DataInputStream(new FileInputStream(str));
String line="";
while((line = is.readLine()) != null)
{
StringTokenizer tokens = new StringTokenizer(line,".");
if(tokens.nextToken().equals(word))
{
while(tokens.hasMoreTokens())
{
int id=Integer.parseInt(tokens.nextToken());
double score= Double.parseDouble(tokens.nextToken());
//int docLength= Integer.parseInt(tokens.nextToken());
postings.add(new Posting(id,score)); //, docLength ));
}
}
}
is.close();
Я не могу правильно читать; Я думаю; возможно, я тоже неправильно писал. Я не знаю, как записать эти данные в файл в виде байта, а затем получить их эффективно. Я надеюсь, что моя ошибка не является глупой, так как я начинаю работать с файлом на Java.
Двоичные файлы обычно не используют разделителей или разделителей. Вместо этого они добавляют метаданные, которые определяют длину поля данных или количество записей в списке.
В Java вы можете использовать DataOutputStream, который имеет такие методы, как writeUTF(..)
. Он действует точно так же, как я писал, сначала количество байтов записывается в стеразу, а затем содержимое строки.
В вашем случае вы можете написать eack-запись, начиная с ключа, затем десять int для количества проводок в списке и для каждого размещения полей.
Для чтения, конечно, доступен соответствующий DataInputStream.