我想给文件写一些字符串.所以,我使用了BufferedWriter类.由于许多线程倾向于写入该文件,我想知道write和writeLine方法是否是原子的.
此外,我希望程序将输出写入多个文件,每个文件100行(比如file.txt0,file.txt1,…).例如
public class Main { static ExecutorService exec = Executors.newFixedThreadPool(5); BufferedWriter bw; public class myWriter implements Runnable { String str; myWriter (String str) { this.str = str; } public void run() { bw.write(str); bw.writeLine(); } } public static void main(String[] args) { bw = new BufferedWriter(new FileWriter("train.txt")); for (String arg: args) exec.execute(new myWriter(arg)); exec.awaitTermination(100000,TimeUnit.MILLISECONDS); } }
有人能帮我吗?如果它们不是原子的,我怎样才能使它们成为原子并避免碰撞?
解决方法
不,那些不是原子的.
try { // Get a file channel for the file File file = new File("filename"); FileChannel channel = new RandomAccessFile(file,"rw").getChannel(); // Use the file channel to create a lock on the file. // This method blocks until it can retrieve the lock. FileLock lock = channel.lock(); // Try acquiring the lock without blocking. This method returns // null or throws an exception if the file is already locked. try { lock = channel.tryLock(); } catch (OverlappingFileLockException e) { // File is already locked in this thread or virtual machine } // Release the lock lock.release(); // Close the file channel.close(); } catch (Exception e) { }