powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Эксклюзивный доступ к файлу
22 сообщений из 22, страница 1 из 1
Эксклюзивный доступ к файлу
    #37871750
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не пойму, как мне конфиг эксклюзивно получить, чтобы несколько копий приложения, запущенных у разных пользователей, не могли его одновременно править? В С++ Билдере у меня так реализовано:
Код: plaintext
1.
fileData = new TFileStream(applicationPath + "pay.ini", fmOpenReadWrite | fmShareExclusive);


А в Яве что-то найти не могу, что для этого нужно сделать.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37871763
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм, кажется наконец-то нашёл пример, спасибо.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
import java.io.FileOutputStream;
import java.nio.channels.*;

public class FileLocking {
  public static void main(String[] args) throws Exception {
    FileOutputStream fos= new FileOutputStream("file.txt");
    FileLock fl = fos.getChannel().tryLock();
    if(fl != null) {
      System.out.println("Locked File");
      Thread.sleep(100);
      fl.release();
      System.out.println("Released Lock");
    }
    fos.close();
  }
}
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37871848
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Хмм, такое ощущение, что это не совсем то что нужно.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37871928
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще-то это гуглится на раз
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37872516
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaвообще-то это гуглится на раз
А что толку? В Яве ведь нужно ещё подобрать класс подходящий по интерфейсу, а мне RandomAccessFile не подходит, нужно чтобы InputStream или Reader был, одновременно являясь OutputStream или Writer.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37872528
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нужно чтобы и Properties использовать, и при этом ещё и заблокировать файл перед чтением, считать, обработать, сохранить обновлённые данные, и разблокировать файл. А похоже получается что сначала придётся блокировать в FileInputStream, который читает, потом разблокировать, и снова блокировать в FileOutputStream, чтобы сохранить. Мне не нравится промежуток между разблокированием и блокированием. Как бы что не вышло, с другими копиями приложения. Файл то конфига хранится на сервере, а пользователей много. У них общий файл, из которого они берут очередной номер последовательности, и сохраняют х+1 обратно вместо х. В том и суть, что без блокировки иногда бывает, что у двоих юзеров приходит одинаковый номер. Коллизия.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37872532
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вообще в Яве обычно ищется цепочка преобразований, которая приведёт куда надо?
Я имею в виду примерно вот такое:
new Object1(new Object2(new Object3()));
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37872556
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Такое ощущение, что следует сделать наследников для InputStream и OutputStream, которые будут прикидываться наследниками, а фактически тупо вызывать методы RandomAccessFile. Изврат, но цель будет достигнута.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37872618
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чувствую себя извращенцем, но сделал так:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
public class RandomAccessFileIO extends RandomAccessFile
{
    public RandomAccessFileIO(File file, String mode) throws FileNotFoundException
    {
        super(file, mode);
    }
    public InputStream getInputStream()
    {
        return new RAFInputStream();
    }            
    public OutputStream getOutputStream()
    {
        return new RAFOutputStream();
    }
    private class RAFInputStream extends InputStream
    {
        @Override
        public int read() throws IOException
        {
            return RandomAccessFileIO.this.read();
        }        
    }
    private class RAFOutputStream extends OutputStream
    {
        @Override
        public void write(int b) throws IOException
        {
            RandomAccessFileIO.this.write(b);
        }        
    }
}
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37872701
Фотография schwa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему нельзя вычитать из RandomAccessFile все байты, произведя перед этим все нужные действия для захвата локов на файле, и загрузить потом их с помощью какого нибудь ByteArrayInputStream в инстанс Properties?
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37872704
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
schwaПочему нельзя вычитать из RandomAccessFile все байты, произведя перед этим все нужные действия для захвата локов на файле, и загрузить потом их с помощью какого нибудь ByteArrayInputStream в инстанс Properties?
Давай, попробуй. Я сутки убил, чтобы найти приемлемый вариант. Ничего лучше не нашлось, как сделать этот класс с двумя иннер классами.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37872973
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoДавай, попробуй. Я сутки убил, чтобы найти приемлемый вариант

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
File file = new File("E:\\Downloads\\test.properties");
        RandomAccessFile randomAccessFile = new RandomAccessFile(file, "rw");
        FileChannel channel = randomAccessFile.getChannel();

        FileLock lock = channel.tryLock();
        if (lock != null) {
            try {
                byte[] buffer = new byte[(int)file.length()];
                randomAccessFile.readFully(buffer, 0, buffer.length);
                Properties properties = new Properties();
                properties.load(new ByteArrayInputStream(buffer));
            } finally {
                lock.release();
            }
        }
        channel.close();



ахтунгThe behavior of the file lock is platform-dependent. On some platforms, the file lock is advisory, which means that unless an application checks for a file lock, it will not be prevented from accessing the file. On other platforms, the file lock is mandatory, which means that a file lock prevents any application from accessing the file
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873025
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpasha,
Вот-вот, мудрёная штука у тебя вышла. Пока найдёшь обходной путь блин, проще уже такой адаптер чтоль сделать, как я тут привёл. Но всё равно спасибо, еслиб я ещё не сделал, то использовал бы. И кстати lock() от tryLock() как я понял отличается тем, что tryLock сразу отзывается, а lock ждёт пока файл разлочится? Так мне как раз ждать нужно, пока файл освободится. А насчёт того, что платформенно-зависимо, я уже протестировал, под виндой если файл лочится этим приложением, то другая копия этого приложения, ждёт пока снимется блокировка. В принципе так и нужно. Допустим если копий будет запущено до нескольких десятков, на разных компьютерах в сети, то они нормально смогут работать с одним конфиг-файлом. Так как он лочится то на доли секунды, коллизии редки, но хочется избежать их раз и навсегда. Одно не уверен, а что если программа где-то глюканёт и повиснет, когда залочка снимется?
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873077
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLochpasha,
Вот-вот, мудрёная штука у тебя вышла.
мудренная? ну ты жжешь.

XDiaBLo Пока найдёшь обходной путь блин
да ничего там не надо было искать. просто ты видимо еще в java io плаваешь.

XDiaBLotryLock сразу отзывается, а lock ждёт пока файл разлочится?
да. еще tryLock еще можно задать время ожидания.

XDiaBLoОдно не уверен, а что если программа где-то глюканёт и повиснет, когда залочка снимется?
я бы вообще задумался о том, не пора ли использовать какую-то (возможно embedded) базу данных, которая автоматом обеспечит атомарность.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873086
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaXDiaBLochpasha,
Вот-вот, мудрёная штука у тебя вышла.
мудренная? ну ты жжешь.

XDiaBLo Пока найдёшь обходной путь блин
да ничего там не надо было искать. просто ты видимо еще в java io плаваешь.

XDiaBLotryLock сразу отзывается, а lock ждёт пока файл разлочится?
да. еще tryLock еще можно задать время ожидания.

XDiaBLoОдно не уверен, а что если программа где-то глюканёт и повиснет, когда залочка снимется?
я бы вообще задумался о том, не пора ли использовать какую-то (возможно embedded) базу данных, которая автоматом обеспечит атомарность.
Ясен пень плаваю, яж не синьор джава девелопер.

Эмбеддед куда? И ради чего, небольшой кучки циферок?
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873217
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoЭмбеддед куда?
никуда. без централизированного сервера. например firebird embedded или sqlite.

XDiaBLo И ради чего, небольшой кучки циферок?
ну а так ты фактически лепишь свою файловую бд с сомнительной реализацией.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873223
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaXDiaBLoЭмбеддед куда?
никуда. без централизированного сервера. например firebird embedded или sqlite.

XDiaBLo И ради чего, небольшой кучки циферок?
ну а так ты фактически лепишь свою файловую бд с сомнительной реализацией.
Ну как никуда? Тут имеем приложение, запускаемое с разных компьютеров, а нумерация нужна сквозная. И под эту тему сервер поднимать надо получается.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873265
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoНу как никуда? Тут имеем приложение, запускаемое с разных компьютеров, а нумерация нужна сквозная. И под эту тему сервер поднимать надо получается.
не получается. для упомянутых реализаций сервер не нужен. нужны лишь клиентские библиотеки, которые автоматом обеспечат и эксклюзивность доступа и атомарность операций. но вообще да, сервер надежнее, потому что как будут работать локи на сетевом диске х.з. (это кстати касается и FileChannel.lock). впрочем поднимать, это слишком громко сказано.

P.S. альтернативно можно создавать пустой лок-файл перед доступом к редактируемому файлу (и проверять его существование, если уже создан, значит кто-то другой пишет в файл) и удалять его по завершении записи. если какой-то процесс завис (или сеть упала) не удалив файл, любой другой процесс может удалить этот файл если его возраст превышает какой-то разумный срок. тоже наколенка, но более менее failsafe
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873267
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaP.S. альтернативно можно создавать пустой лок-файл перед доступом к редактируемому файлу (и проверять его существование, если уже создан, значит кто-то другой пишет в файл) и удалять его по завершении записи. если какой-то процесс завис (или сеть упала) не удалив файл, любой другой процесс может удалить этот файл если его возраст превышает какой-то разумный срок. тоже наколенка, но более менее failsafe
Во, такой вариант поинтереснее будет. Я даже на секунду задумывался о нём. Но его я внедрю, если вдруг начнутся проблемы с тем вариантом. Итак проект затягиваю, завтра бы сдать его уже.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873294
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLoесли вдруг начнутся проблемы с тем вариантомони почти наверняка возникнут
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873298
Фотография XDiaBLo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
chpashaXDiaBLoесли вдруг начнутся проблемы с тем вариантомони почти наверняка возникнут
У меня сейчас такой же вариант функционирует в программе, написанной на С++, год работает, интенсивно, и ничего не возникает.
...
Рейтинг: 0 / 0
Эксклюзивный доступ к файлу
    #37873367
chpasha
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
XDiaBLochpashaпропущено...
они почти наверняка возникнут
У меня сейчас такой же вариант функционирует в программе, написанной на С++, год работает, интенсивно, и ничего не возникает.Если какая-нибудь неприятность может произойти, она случиться. (с) Мерфи
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Эксклюзивный доступ к файлу
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]