我有一个巨大的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上的文件以来,我的错误并不愚蠢。
答案 0 :(得分:0)
二进制文件通常不使用分隔符或分隔符。相反,他们添加了指定数据字段长度或列表中条目数的元数据。
在Java中,您可以使用DataOutputStream,其中包含writeUTF(..)
等方法。它的行为与我写的完全一样,首先将字节数写入steram,然后将其写入
字符串内容。
在你的情况下,你可以写一个eack条目,从密钥开始,然后十个int表示列表中的Postings数量,每个发布字段。
对于读取当然是匹配的DataInputStream可用。