Java - 多个线程写入同一文件

2022-09-04 06:23:30

我正在尝试通过Java中的多个线程将一些内容写入文件。每个线程读取不同的输入文件,执行一些计算并将一些(不同的)内容写入公共输出文件。问题在于,最终,输出文件仅包含最后一个终止线程写入的内容,而不包含其他线程的内容。线程的相关代码 -

public void run()
{
    try
    {
        File file = new File("/home/output.txt");
        if (!file.exists()) 
        {
             file.createNewFile();
        }
        FileWriter fw = new FileWriter(file.getAbsoluteFile());
        BufferedWriter bw = new BufferedWriter(fw);

        BufferedReader br = new BufferedReader(new FileReader(inputfile)); // each thread reads a different input file
        String line="";

        while((line=br.readLine())!=null)
        {
            String id = line.trim();               // fetch id

            StringBuffer sb = processId(userId);   // process id

            synchronized(this){
            bw.write(sb.toString() + "\n");        // write to file
            }
        }
        bw.close();
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
}

如何使所有线程将其内容写入公共文件?


答案 1

使用构造函数,使用追加模式FileWriter

FileWriter fw = new FileWriter(file.getAbsoluteFile(), true);

答案 2

具有单个文件编写器线程,该线程可防止阻塞队列读取并写入文件。所有其他 20 个线程只会将数据放入阻塞队列中。这将防止 20 个编写器线程之间的争用。