想改进一下实验代码,要求在for循环中添加一段java代码把每次循环中的参数positionMap的值写入每个新建的txt文件中,要求一个txt文件存储一个positionMap的值,且txt文件命名为自增的数字序号。
图示代码部分如下:
程序代码如下:
import client.utils.*;
import it.unisa.dia.gas.jpbc.Element;
import orestes.bloomfilter.CountingBloomFilter;
import orestes.bloomfilter.FilterBuilder;
import pojo.PrivateKey;
import pojo.PublicKey;
import server.Search;
import server.utils.HomoEncryption_Server;
import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;
import java.util.concurrent.*;
import java.util.concurrent.atomic.AtomicInteger;
public class Phrase_multi {
public static void main(String[] args) {
KeyGenUtils.genKey();
Object[] key = KeyGenUtils.getKeyFromFile("key.data");
PublicKey publicKey = (PublicKey) key[0];
PrivateKey privateKey = (PrivateKey) key[1];
CountingBloomFilter<Object> cbf = new FilterBuilder(1000000, 0.01)
.buildCountingBloomFilter();
ConcurrentHashMap<Integer, HashMap<String, ArrayList<Element>>> filesMaps = new ConcurrentHashMap<>();
File dataSetFolder = new File("C:\\mypaperdataset\\enron\\version2\\256");
ExecutorService executorService = Executors.newCachedThreadPool();
long s = System.currentTimeMillis();
for (File file : dataSetFolder.listFiles()) {
// if (count==7000) break;
// count++;
Integer node = NodeGen_Client.getNode();
executorService.execute(()->{
System.out.println("正在处理文件:" + file.getName() +"分配的节点:"+node);
List<String> extracted = ExtractKeyword.extract_easy(file);//一个文件提取关键词耗费5ms
IndexBuilding.buildCBF_Batch(extracted, node, cbf);
HashMap<String, ArrayList<Element>> positionMap = IndexBuilding.buildHashTable_exp(extracted, privateKey);
filesMaps.put(node, positionMap);
//System.out.println(positionMap);//写一段java代码把每次循环中的参数positionMap的值写入每个txt文件中,一个txt文件对应一个positionMap的值
});
}
executorService.shutdown();
try {
while (!executorService.awaitTermination(5, TimeUnit.SECONDS)) {
System.out.println("线程池没有关闭");
// System.out.println("isTerminated:" + executorService.isTerminated());
ThreadPoolExecutor executor = (ThreadPoolExecutor) executorService;
System.out.println("剩余线程数: "+executor.getActiveCount());
}
} catch (InterruptedException e) {
e.printStackTrace();
}
long e = System.currentTimeMillis();
System.out.println("线程池已经关闭");
System.out.println("isTerminated:" + executorService.isTerminated());
System.out.println("用时:"+(e-s)+"毫秒");
// 搜索
HomoEncryption_Client homo_client = new HomoEncryption_Client(privateKey, publicKey);
Element elementX = homo_client.getElementX();
Element elementY = homo_client.getElementY();
while (true) {
ArrayList<String> keywords = new ArrayList<>();
while (true) {
System.out.println("请输入:");
Scanner input = new Scanner(System.in);
String next = input.next();
if (next.equals("0")) {
System.out.println("开始查询");
break;
}
keywords.add(MyHashUtils.md5(next));
}
HomoEncryption_Server homo_server = new HomoEncryption_Server(publicKey);
long kk = System.nanoTime();
List<Integer> search_result1 = Search.searchKeywords(keywords, cbf);
long ll = System.nanoTime();
System.out.println("普通查询完成,用时:"+(ll-kk)+"ns 查询到了"+search_result1.size()+"个文件");
long pp = System.nanoTime();
List<Integer> search_result2 = Search.searchKeywords_Phrase(keywords, cbf, filesMaps, homo_server, elementX, elementY);
long jj = System.nanoTime();
System.out.println("词组查询完成,用时:"+(jj-pp)+"ms 查询到了"+search_result2.size()+"个文件");
}
}
}