从多个文件中读取并使用多线程将它们写入文件文件序列 [英] Read from multiple files and write them into file file sequenction using multithread

查看:133
本文介绍了从多个文件中读取并使用多线程将它们写入文件文件序列的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想从多个文件中读取并使用多线程将它们写入单个文件。我做了一些代码,它们完全正确地读取文件内容并将它们写入另一个文件。但我的问题是数据不顺序。就像读取f1并写入输出文件一样,然后读取f2并写入输出文件,依此类推。查看我的代码

I want to read from multiple files and write them into single file using multithread. I have done some code which is reading content of files perfectly fine and writing them into another file. But my problem is data is not coming sequential. Like reading f1 and write into output file, then read f2 and write into out file and so on. Have a look on my code

public MultiFileReadingThread(BufferedWriter writer, BufferedReader reader, String name, java.util.List<File> files){
        this.writer = writer;
        this.reader = reader;
        this.name = name;
        this.files = files;
    }

    @Override
    public void run() {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/mm/yyyy hh:mm:ss:ms");
        System.out.println("Start Time : " + name + formatter.format(System.currentTimeMillis()));
//      readFile();
        if(i == 1){

        }
        writeIntoSharedBufferedWriter();
        System.out.println("End Time : " + name +  formatter.format(System.currentTimeMillis()));
    }

public void writeIntoBufferedWriter(){

        for(File f : files){
            try{
            BufferedReader r = new BufferedReader(new FileReader(f));
            String line = null;
            while((line = r.readLine()) != null){
                writer.write(line);
                writer.write("\n");
            }
            } catch(Exception ex){
                ex.printStackTrace();
            }
        }
    }

运行线程的代码。他们有五个不同的任务和工人。这个代码给了我但不正确。像f1,f2,f3

Code to run the threads. There are five different task and worker for them.Again this code giving me the out but not correct. like f1, f2, f3

BufferedReader r1 = new BufferedReader(new FileReader(new File("/home/naveen/f1")));
        BufferedReader r2 = new BufferedReader(new FileReader(new File("/home/naveen/f2")));
        BufferedReader r3 = new BufferedReader(new FileReader(new File("/home/naveen/f3")));
        BufferedReader r4 = new BufferedReader(new FileReader(new File("/home/naveen/f4")));
        BufferedReader r5 = new BufferedReader(new FileReader(new File("/home/naveen/f5")));

        BufferedWriter writer = new BufferedWriter(new FileWriter(new File("/home/naveen/write")));
        Runnable task1 = new MultiFileReadingThread(null, writer, r1, "f");
        Runnable task2 = new MultiFileReadingThread(null, writer, r2, "s");
        Runnable task3 = new MultiFileReadingThread(null, writer, r3, "t");
        Runnable task4 = new MultiFileReadingThread(null, writer, r4, "fu");
        Runnable task5 = new MultiFileReadingThread(null, writer, r5, "fi");

        Thread wroker1 = new Thread(task1, "w1");
        Thread wroker2 = new Thread(task2, "w2");
        Thread wroker3 = new Thread(task3, "w3");
        Thread wroker4 = new Thread(task4, "w4");
        Thread wroker5 = new Thread(task5, "w5");

有人可以帮助实现这一目标。
提前致谢。

Can somebody help to achieve the taks. Thanks in advance.

推荐答案

更好的方法是使用生产者消费模式。生产者线程将读取文件并通过将其包装在某个类中将内容发送给消费者。将组合文件写入磁盘。

The better way is to use producer consumer pattern. The producer threads will read the files and send the content to consumer by wrapping it in some class. Which will write the combined file into the disk.

在消费者方面,您可以使用优先级队列,让生产者设置优先级。

On consumer side you can use priority queue and let producer set the priority.

这篇关于从多个文件中读取并使用多线程将它们写入文件文件序列的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆