Adolf K Wiseman 2023-06-07 09:43 采纳率: 70%
浏览 80
已结题

java实现把每次循环中的参数值写入txt文件中

想改进一下实验代码,要求在for循环中添加一段java代码把每次循环中的参数positionMap的值写入每个新建的txt文件中,要求一个txt文件存储一个positionMap的值,且txt文件命名为自增的数字序号。
图示代码部分如下:

img


程序代码如下:

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()+"个文件");




        }

    }
}


  • 写回答

4条回答 默认 最新

  • 瞬间的未来式 2023-06-07 09:53
    关注

    该回答引用chatgpt:

    //添加一个计数器
    private static AtomicInteger fileCounter = new AtomicInteger(1);
    
    executorService.execute(() -> {
        // 省略其他代码...
    
        HashMap<String, ArrayList<Element>> positionMap = IndexBuilding.buildHashTable_exp(extracted, privateKey);
        filesMaps.put(node, positionMap);
    
        // 将positionMap写入txt文件
        int fileIndex = fileCounter.getAndIncrement();
        String fileName = fileIndex + ".txt";
        writePositionMapToFile(fileName, positionMap);
    });
    
    // ...
    
    private static void writePositionMapToFile(String fileName, HashMap<String, ArrayList<Element>> positionMap) {
        try (PrintWriter writer = new PrintWriter(fileName)) {
            for (String key : positionMap.keySet()) {
                writer.println(key + ": " + positionMap.get(key));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    
    

    在每次循环中,我们首先通过fileCounter.getAndIncrement()获取一个自增的序号作为文件名,然后调用writePositionMapToFile()方法将positionMap写入txt文件中。该方法使用PrintWriter将数据写入文件,并按照指定的格式进行写入

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(3条)

报告相同问题?

问题事件

  • 系统已结题 6月15日
  • 已采纳回答 6月7日
  • 创建了问题 6月7日

悬赏问题

  • ¥30 使用matlab将观测点聚合成多条目标轨迹
  • ¥15 Workbench中材料库无法更新,如何解决?
  • ¥20 如何推断此服务器配置
  • ¥15 关于github的项目怎么在pycharm上面运行
  • ¥15 内存地址视频流转RTMP
  • ¥100 有偿,谁有移远的EC200S固件和最新的Qflsh工具。
  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析