import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
//编写一个程序,将a.txt文件中的单词与b.txt文件中的单词交替合并到c.txt文件中,a.txt文件中的单词用回车符分隔,b.txt文件中用回车或空格进行分隔。
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
final BlockingQueue<String> queue=new ArrayBlockingQueue<>(100);
final Read read1=new Read();
read1.queue=queue;
read1.myflag=1;
final Read read2=new Read();
read2.queue=queue;
read2.myflag=2;
read1.opp=read2;
read2.opp=read1;
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
read1.read(new File("G:\\iotest\\a.txt"));
} catch(Exception e){
e.printStackTrace();
}
}
},"r1").start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
try {
read2.read(new File("G:\\iotest\\b.txt"));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
},"r2").start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
FileWriter fw = null;
try {
fw = new FileWriter(new File("G:\\iotest\\c.txt"));
BufferedWriter bw=new BufferedWriter(fw);
while(true){
String str = null;
str = queue.take();
if("##".equals(str)){
bw.close();
fw.close();
return;
}
bw.append(str);
}
}catch(Exception e){
e.printStackTrace();
}
}
},"write").start();
}
}
class Read{
int myflag;
static int flag=1;
BlockingQueue<String> queue;
static Object lock=new Object();
boolean finsh=false;
Read opp;
public void read(File file) throws IOException, InterruptedException{
FileReader fr=new FileReader(file);
BufferedReader br=new BufferedReader(fr);
String str=null;
synchronized (lock) {
while((str=br.readLine())!=null){
String[] s=str.split(" ");
for(int i=0;i<s.length;++i){
while(flag!=myflag&&!opp.finsh)
lock.wait();
queue.put(s[i]);
flag=flag==1?2:1;
lock.notify();
}
}
finsh=true;
if(opp.finsh){
queue.put("##");
}
try{
lock.notify();
}catch(Exception e ){
}
}
}
}
交替输出
最新推荐文章于 2022-08-24 03:31:24 发布