В этой статье объясняются 5 методов для решения эксклюзивного написания файлов Java, включая некоторые из ваших собственных понимания. Если есть какая -то неуместность, вы можете предложить это.
Решение 1: Используйте параметр «Работа файла randomaccessfile », S, S, означает написание в режиме блокировки синхронизации
Randomaccessfile file = new randomaccessfile (файл, "rws");
Решение 2: используйте блокировку файла FileChannel
File file = new File ("test.txt"); fileInputStream fis = new FileInputStream (file); fileChannel Channel = fis.getChannel (); filelock filelock = null; while (true) {filelock = channel.trylock (0, long.max_value, false); // true означает общую блокировку, false - это исключительный замок, если (filelock! = null) перерыв; else // Есть и другие потоки, которые занимают замок (1000);} Решение 3: сначала напишите содержимое, которое будет записано во временный файл, а затем измените имя временного файла (схема взлома использует принцип буферизации + атомной операции)
открытый класс myfile {private String filename; public myfile (String FileName) {this.filename = filename; } public Synchronized void writedata (String Data) бросает ioException {string tmpfilEname = uuid.randomuuid (). toString ()+". tmp"; File tmpfile = new File (tmpfilename); Файл -автор fw = new FileWriter (tmpfile); fw.write (data); fw.flush (); fw.close (); // Теперь переименовать временный файл в желаемое имя, эта операция представляет собой атомную операцию при большинстве ОС if (! tmpfile.renameto (filename) {// Мы можем захотеть повторно, если перемещение не удалось. Забросить новое ioException («Не удалось»);}}}}}}}}}}}}}} Решение 4: Инкапсулируйте файл в соответствии с путем файла и используйте синхронизированный для управления написанием файла
открытый класс myfile {private String filename; public myfile (String FileName) {this.filename = filename; } public Synchronized void viritedata (String Data) Throws IOException {fileWriter fw = new FileWriter (filename); fw.write (data); fw.flush (); fw.close (); }} План 5: План, который я придумал, не очень точен. Переключившись на установку управления разрешением чтения и записи, моделируйте настройку маркера записи (превращается в классическую проблему чтения и записи в операционной системе ...)
открытый класс myfile {private volatile boolean canWrite = true; частное имя файла; public myfile (String FileName) {this.filename = filename; } public void writedata (String Data) {while (! canWrite) {try {thread.sleep (100); } catch (croptedException, т.е.) {} // Вы можете установить время записи тайм -аута} canWrite = false; // теперь написать файл canWrite = true; }}Выше представлено решение Java исключительно написания файлов. Вы узнали это? Вы можете ссылаться на другие статьи, чтобы узнать и понять это.