Java实现多线程写数据到文件【队列-文件】

大致流程

先将要写入文件的数据写入到一个队列中,然后单开一个线程专门读取队列数据写入文件,可以保证写入到文件的数据的顺序,

生产者类即多线程写入文件模拟

package com.ldl.test.domain;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 将数据保存到队列中(生产者)
 * @author liam
 *
 */
public class SaveDataToQueue implements Runnable{
	private ConcurrentLinkedQueue<String> queue;
	private String data;
	
	public SaveDataToQueue(ConcurrentLinkedQueue<String> queue, String data) {
		this.queue = queue;
		this.data = data;
	}

	@Override
	public void run() {
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:hh:ss sss");
		data = sdf.format(new Date())+":"+data;
		System.out.println(data);
		queue.add(data);
	}
	
}

消费者类(将队列数据写入文件)

package com.ldl.test.domain;

import java.io.BufferedWriter;
import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;

/**
 * 将队列中的数据写进文件中(消费者)
 * @author liam
 *
 */
public class PutDataToFile implements Runnable {
	private ConcurrentLinkedQueue<String> queue;
	private BufferedWriter buff;
	
	public PutDataToFile(ConcurrentLinkedQueue<String> queue, BufferedWriter buff) {
		super();
		this.queue = queue;
		this.buff = buff;
	}



	@Override
	public void run() {
		while(true){
			if(!queue.isEmpty()){
				try {
					buff.write(queue.poll());
					buff.newLine();
					buff.flush();
				} catch (IOException e) {
					e.printStackTrace();
				}  
			}
		}
		
		
	}

}

测试类

package com.ldl.test.controller;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.concurrent.ConcurrentLinkedQueue;

import com.ldl.test.domain.PutDataToFile;
import com.ldl.test.domain.SaveDataToQueue;

/**
 * 
 * @author liam
 *
 */
public class WriteFileFromQueue {

	public static void main(String[] args) {

		//获取当前类所在的包
		/*File fileB = new File(WriteFileFromQueue.class.getResource("").getPath());
		System.out.println("fileB path: " + fileB); */
		//获取当前类所在的工程名
//		System.out.println(System.getProperty("user.dir"));
		FileWriter fw= null;
    	BufferedWriter bufw= null;
        try {
        	File file = new File(System.getProperty("user.dir")+File.separator+"upload"+File.separator+"liam.txt");
        	if(!file.exists()){
        		//file.mkdirs();
        		file.createNewFile();
        	}
			fw=new FileWriter(file,true);  
			bufw=new BufferedWriter(fw);
		} catch (IOException e) {
			e.printStackTrace();
		} 
        ConcurrentLinkedQueue<String> queue = new ConcurrentLinkedQueue<>();
        
        for(int i = 0; i < 10; i++){
        	new Thread(new SaveDataToQueue(queue, "写入数据为:  "+i)).start();
        }
        new Thread(new PutDataToFile(queue, bufw)).start();;
		
	}

}

测试结果

以上内容,仅作为记录本次练习使用




版权声明:本文为Liam1994原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。