1. 程式人生 > >Java實現多執行緒寫資料到檔案【佇列-檔案】

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

}

測試結果

以上內容,僅作為記錄本次練習使用