我的文件同步阅读有问题。情况很简单:处理文件中的数据。我的问题是同步。我试图使它成为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,并且它是您想要的。但是为了对文件进行并行处理,我认为你的文件阅读器应该读取文件的不同部分,并且你必须连接最终结果。这会更有意义。 –