我正在尝试写入文件。我需要能够“追加”到文件而不是写入文件。此外,我需要它是线程安全和有效的。我目前的代码是:
private void writeToFile(String data) {
File file = new File("/file.out");
try {
if (!file.exists()) {
//if file doesnt exist, create it
file.createNewFile();
}
PrintStream out = new PrintStream(new FileOutputStream(file, true));
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date = new Date();
out.println(dateFormat.format(date) + " " + data);
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
一切都很好。我只是不知道PrintStream是否是线程安全的。所以,我的问题:从PrintStream的几个实例写入相同的物理文件是否安全?如果是这样,它是使用锁定(降低性能)还是排队? 你知道任何线程安全的本机java库并使用排队吗? 如果不是我写我自己没有问题。在我自己编写之前,我只是想看看是否有任何原生的东西。
答案 0 :(得分:3)
PrintStream源表明它是线程安全的。
如果要从不同的线程写入同一个文件,为什么不跨线程共享相同的PrintStream实例? PrintStream为您进行同步。
/**
* Prints a String and then terminate the line. This method behaves as
* though it invokes <code>{@link #print(String)}</code> and then
* <code>{@link #println()}</code>.
*
* @param x The <code>String</code> to be printed.
*/
public void println(String x) {
synchronized (this) {
print(x);
newLine();
}
}