Каков эффективный способ записи и чтения смешанных данных в виде байтов в файле

1

У меня есть огромная структура данных 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.

Теги:
file-io
byte

1 ответ

0
Лучший ответ

Двоичные файлы обычно не используют разделителей или разделителей. Вместо этого они добавляют метаданные, которые определяют длину поля данных или количество записей в списке.

В Java вы можете использовать DataOutputStream, который имеет такие методы, как writeUTF(..). Он действует точно так же, как я писал, сначала количество байтов записывается в стеразу, а затем содержимое строки.

В вашем случае вы можете написать eack-запись, начиная с ключа, затем десять int для количества проводок в списке и для каждого размещения полей.

Для чтения, конечно, доступен соответствующий DataInputStream.

  • 0
    Запись числа длины также увеличивает размер файла; не так ли? потому что я сжимаю, чтобы сэкономить пространство
  • 0
    Да, но обычно необходимое пространство незначительно, и в любом случае эти данные необходимы. Использование разделителей также потребовало бы места. Как могут записи у вас более миллиона?
Показать ещё 7 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню