我的文件同步閱讀有問題。情況很簡單:處理文件中的數據。我的問題是同步。我試圖使它成爲BufferedReader類的對象讀取器,但我有兩個問題。如果我初始化讀者在我的方法read()中的「試用資源」,當我在不同的角色中使用它時,我會得到同一個對象的BufReader的不同對象。第二個我在課堂上初始化它,並獲得線程的同一個對象,但是這是一個很大的問題,具有不可預知的行爲。我將爲第二種情況編寫代碼。你能告訴我如何解決。我正在學習,這就是爲什麼我需要建議。多線程的Java問題
class FileReaderClass {
private File file = new File("src\\exer1\\Transfers.txt");
private BufferedReader reader = null;
private FileReader fr = null;
StringBuilder sb = new StringBuilder();
void read() throws IOException {
try {
fr = new FileReader(file);
reader = new BufferedReader(fr);
String buftext;
while ((buftext = reader.readLine()) != null){
synchronized (reader) {
System.out.println(Thread.currentThread().getName());//for testing
sb.append(buftext).append("\n");
//System.out.println(buftext);
}
}
}
catch (IOException e) {
e.printStackTrace();
}
finally {
if (reader != null)
reader.close();
if (fr != null)
fr.close();
}
}
}
class Reader1 implements Runnable {
private FileReaderClass frc;
public Reader1(FileReaderClass frc) {
this.frc = frc;
}
@Override
public void run() {
try {
frc.read();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Ex1 {
public static void main(String[] args) throws InterruptedException {
FileReaderClass frc = new FileReaderClass();
Thread t1 = new Thread(new Reader1(frc));
Thread t2 = new Thread(new Reader2(frc));
t1.start();
t2.start();
t1.join();
t2.join();
System.out.println("---------------------");
System.out.println(frc.sb);
}
}
你想做什麼?一次只有一個打開的文件?只有一個同時讀取同一個文件? –
是的,我只想現在就讀。其他邏輯是下一步。但是我想要讀取文件中的一行,而不是一次寫入Stringbuilder。我想在幾個線程中使它平行。案例是文件的並行處理。 –
在這種情況下,@SelçukCihan是正確的。同步沒有意義。你可以嘗試使用資源。您創建的每個FileReaderClass都將擁有自己的FileReader,並且它是您想要的。但是爲了對文件進行並行處理,我認爲你的文件閱讀器應該讀取文件的不同部分,並且你必須連接最終結果。這會更有意義。 –