我想获取一个文件,其中包含来自其他文件的随机顺序的信函。我必须用线程来做。而且我不知道为什么我要从1个文件中输出文件内容,然后从2个文件中获取内容,然后从3个文件中获取内容。我有Main:
public static void main(final String[] args) throws Exception {
for(int i=1;i<args.length; i++) {
new Thread1( args[i], args[0]).start();
}
}
和Thread1类:
public class Thread1 extends Thread {
String path;
FileWriter fw;
private String desc;
public Thread1( String path, String desc) {
super();
this.desc=desc;
this.path=path;
}
@Override
public void run() {
FileReader f = null;
try {
f = new FileReader(path);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
int c;
try {
fw = new FileWriter(desc, true);
while((c = f.read()) != -1) {
fw.write(c);
}
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
请解释一下,为什么它不能正常工作,我认为应该起作用。
最佳答案
请解释一下,为什么它不能正常工作,我认为应该起作用。
您的问题是所有线程都将追加到同一文件,但使用不同的FileWriter
实例。这听起来像可行,但是它们彼此覆盖。当您打开要追加的文件时,将其打开并将写入标记放置在文件末尾。当两个线程执行此操作时,它们都将位于同一标记处。如果线程1写一个字符,那么线程2将写一个字符并覆盖第一个字符。
您可以使用一个FileWriter
并与您的每个线程共享。然后,出于互斥目的在其上synchronize
并执行写操作。
public Thread1( String path, String desc, FileWriter fw) {
this.fw = fw;
...
}
...
// when you write to it, you will need to synchronize on the writer
sychronized (fw) {
fw.write(c);
}
// don't close it in the threads but close it later after you have joined with
// the threads
另一种选择是共享一个内部已为
PrintStream
的synchronized
。