大致流程
先将要写入文件的数据写入到一个队列中,然后单开一个线程专门读取队列数据写入文件,可以保证写入到文件的数据的顺序,
生产者类即多线程写入文件模拟
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版权协议,转载请附上原文出处链接和本声明。