我想以随机顺序从其他文件中获取一个包含其他文件的文件。我必须用Threads来做。而且我不知道为什么我从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();
}
}
}
请解释一下,为什么它不起作用,我认为它应该起作用。
答案 0 :(得分:1)
请解释一下,为什么它不起作用,我认为它应该起作用。
您的问题是所有线程都附加到同一文件但使用不同的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
的{{1}}。