讀書時,我是新來的在Java併發編程。的BufferedReader的ReadLine在一個線程
我需要閱讀,分析和處理一個非常快速增長的日誌文件,所以我一定是 快。 我的想法是讀取文件(逐行)並且在匹配相關的行我想 傳遞者行單獨的線程,可以上線做進一步的處理。 我在下面的示例代碼中調用了這些線程「IOThread」。
我的問題是,在IOthread.run()的BufferedReader中的readline顯然從未返回。 什麼是讀取線程內流的工作方式? 有沒有比以下更好的方法?
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
class IOThread extends Thread {
private InputStream is;
private int t;
public IOThread(InputStream is, int t) {
this.is = is;
this.t = t;
System.out.println("iothread<" + t + ">.init");
}
public void run() {
try {
System.out.println("iothread<" + t + ">.run");
String line;
BufferedReader streamReader = new BufferedReader(new InputStreamReader(is));
while ((line = streamReader.readLine()) != null) {
System.out.println("iothread<" + t + "> got line " + line);
}
System.out.println("iothread " + t + " end run");
} catch (Exception e) {
e.printStackTrace();
}
}
}
public class Stm {
public Stm(String filePath) {
System.out.println("start");
try {
BufferedReader reader = new BufferedReader(new FileReader(filePath));
PipedOutputStream po1 = new PipedOutputStream();
PipedOutputStream po2 = new PipedOutputStream();
PipedInputStream pi1 = new PipedInputStream(po1);
PipedInputStream pi2 = new PipedInputStream(po2);
IOThread it1 = new IOThread(pi1,1);
IOThread it2 = new IOThread(pi2,2);
it1.start();
it2.start();
// it1.join();
// it2.join();
String line;
while ((line = reader.readLine()) != null) {
System.out.println("got line " + line);
if (line.contains("aaa")) {
System.out.println("passing to thread 1: " + line);
po1.write(line.getBytes());
} else if (line.contains("bbb")) {
System.out.println("passing to thread 2: " + line);
po2.write(line.getBytes());
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new Stm(args[0]);
}
}
一個例子的輸入文件是:
line 1
line 2
line 3 aaa ...
line 4
line 5 bbb ...
line 6 aaa ...
line 7
line 8 bbb ...
line 9 bbb ...
line 10
呼叫上面的代碼與輸入文件作爲參數的文件名。
可能是'PipedInputStream'期待更多的字節被讀取......你能關閉()''PipedOutputStream'來測試嗎? – SJuan76
哦,無論如何,我與Sanjay ...使用來自內部進程通信的輸入流和輸出流是凌亂的。將受影響的行傳遞給線程不是更好嗎? – SJuan76
我在'while((line = streamReader.readLine())!= null)'line in run()方法中得到'java.io.IOException:寫入結束死亡異常。 –