我有使用PrintStream
打印到文件的代码。每个线程产生自己的PrintStream
版本。我知道通常操作系统(在我的情况下是linux)锁定文件以获得写入权限。这是java中的情况吗?或者换句话说,以下代码线程是否安全?
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
。请假设它有多个实例,并且不能改变。同样,这一方法无法同步。我不想要只是说“同步你的代码”的答案。
如果操作系统确实将文件锁定为写入权限,则会在写入请求或实例化File
时将其锁定。换句话说,在完成写入或调用out.close()
时是否释放锁定?
答案 0 :(得分:0)
在Linux上,多个进程可以同时写入文件。默认情况下没有锁定,并且应用程序层中的缓冲可能会产生不可预测的结果。
在Windows上,可以使用共享模式打开文件,该模式允许其他进程同时打开文件进行写入。在CreateFile Windows API函数中打开文件时,将设置“锁定”。如果我没记错,Java默认使用此模式,这样两个进程就可以同时打开一个文件进行写入。
使用文件锁定API获得可预测的,与平台无关的结果。