什么是以文件为单位写入和读取混合数据的有效方法

时间:2014-08-05 14:44:44

标签: java file-io byte

我有一个巨大的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后,我压缩密钥的所有docId并将其保存为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上的文件以来,我的错误并不愚蠢。

1 个答案:

答案 0 :(得分:0)

二进制文件通常不使用分隔符或分隔符。相反,他们添加了指定数据字段长度或列表中条目数的元数据。

在Java中,您可以使用DataOutputStream,其中包含writeUTF(..)等方法。它的行为与我写的完全一样,首先将字节数写入steram,然后将其写入 字符串内容。

在你的情况下,你可以写一个eack条目,从密钥开始,然后十个int表示列表中的Postings数量,每个发布字段。

对于读取当然是匹配的DataInputStream可用。