簡體   English   中英

從多文件讀取並使用多線程將它們寫入文件文件序列

[英]Read from multiple files and write them into file file sequenction using multithread

我想從多個文件中讀取並使用多線程將它們寫入單個文件中。 我已經完成了一些代碼,可以很好地讀取文件內容並將它們寫入另一個文件。 但是我的問題是數據不是連續的。 就像讀取f1並寫入輸出文件,然后讀取f2並寫入輸出文件,依此類推。 看看我的代碼

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

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");

有人可以幫助實現這些任務嗎? 提前致謝。

更好的方法是使用生產者消費者模式。 生產者線程將讀取文件,並通過將其包裝在某個類中來將內容發送給消費者。 它將把合並的文件寫入磁盤。

在消費者方面,您可以使用優先級隊列,並讓生產者設置優先級。

好吧,這里有很多不必要的代碼重復。

MultiFileReadingThread的每個實例都應具有自己的讀取器和寫入器,而該讀取器和寫入器決不能從線程外部進行訪問。 似乎您使用同一個編寫器有多個線程,在這種情況下,效果不太好。

嘗試這個:

public MultiFileReadingThread(String name, List<File> inputFiles, File outputFile) {
    this.writer = new BufferedWriter(new FileWriter(outputFile));
    this.name = name;
    this.files = inputFiles;
}

@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();
        }
    }
}

不要忘記,您還需要關閉BufferedReader和BufferedWriter。

線程化可能很困難,不幸的是,沒有單個教程或資源可以提供您所需的所有信息。 我建議您多次閱讀每本可以找到的書。 在您對主題沒有足夠的了解之前嘗試實現多線程可能會導致很多問題。 有時直到應用程序生命周期的后期,需要進行重大更改才能更正它們時,線程問題才變得明顯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM