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


А в Яве что-то найти не могу, что для этого нужно сделать.
...
Рейтинг: 0 / 0
09.07.2012, 15:20:55
    #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
09.07.2012, 16:01:59
    #37871848
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
Хмм, такое ощущение, что это не совсем то что нужно.
...
Рейтинг: 0 / 0
09.07.2012, 16:44:37
    #37871928
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
вообще-то это гуглится на раз
...
Рейтинг: 0 / 0
10.07.2012, 07:22:30
    #37872516
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
chpashaвообще-то это гуглится на раз
А что толку? В Яве ведь нужно ещё подобрать класс подходящий по интерфейсу, а мне RandomAccessFile не подходит, нужно чтобы InputStream или Reader был, одновременно являясь OutputStream или Writer.
...
Рейтинг: 0 / 0
10.07.2012, 07:54:11
    #37872528
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
Нужно чтобы и Properties использовать, и при этом ещё и заблокировать файл перед чтением, считать, обработать, сохранить обновлённые данные, и разблокировать файл. А похоже получается что сначала придётся блокировать в FileInputStream, который читает, потом разблокировать, и снова блокировать в FileOutputStream, чтобы сохранить. Мне не нравится промежуток между разблокированием и блокированием. Как бы что не вышло, с другими копиями приложения. Файл то конфига хранится на сервере, а пользователей много. У них общий файл, из которого они берут очередной номер последовательности, и сохраняют х+1 обратно вместо х. В том и суть, что без блокировки иногда бывает, что у двоих юзеров приходит одинаковый номер. Коллизия.
...
Рейтинг: 0 / 0
10.07.2012, 08:04:28
    #37872532
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
Как вообще в Яве обычно ищется цепочка преобразований, которая приведёт куда надо?
Я имею в виду примерно вот такое:
new Object1(new Object2(new Object3()));
...
Рейтинг: 0 / 0
10.07.2012, 08:36:43
    #37872556
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
Такое ощущение, что следует сделать наследников для InputStream и OutputStream, которые будут прикидываться наследниками, а фактически тупо вызывать методы RandomAccessFile. Изврат, но цель будет достигнута.
...
Рейтинг: 0 / 0
10.07.2012, 09:33:13
    #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
10.07.2012, 10:23:25
    #37872701
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
Почему нельзя вычитать из RandomAccessFile все байты, произведя перед этим все нужные действия для захвата локов на файле, и загрузить потом их с помощью какого нибудь ByteArrayInputStream в инстанс Properties?
...
Рейтинг: 0 / 0
10.07.2012, 10:25:07
    #37872704
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
schwaПочему нельзя вычитать из RandomAccessFile все байты, произведя перед этим все нужные действия для захвата локов на файле, и загрузить потом их с помощью какого нибудь ByteArrayInputStream в инстанс Properties?
Давай, попробуй. Я сутки убил, чтобы найти приемлемый вариант. Ничего лучше не нашлось, как сделать этот класс с двумя иннер классами.
...
Рейтинг: 0 / 0
10.07.2012, 12:37:17
    #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
10.07.2012, 12:52:30
    #37873025
XDiaBLo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
chpasha,
Вот-вот, мудрёная штука у тебя вышла. Пока найдёшь обходной путь блин, проще уже такой адаптер чтоль сделать, как я тут привёл. Но всё равно спасибо, еслиб я ещё не сделал, то использовал бы. И кстати lock() от tryLock() как я понял отличается тем, что tryLock сразу отзывается, а lock ждёт пока файл разлочится? Так мне как раз ждать нужно, пока файл освободится. А насчёт того, что платформенно-зависимо, я уже протестировал, под виндой если файл лочится этим приложением, то другая копия этого приложения, ждёт пока снимется блокировка. В принципе так и нужно. Допустим если копий будет запущено до нескольких десятков, на разных компьютерах в сети, то они нормально смогут работать с одним конфиг-файлом. Так как он лочится то на доли секунды, коллизии редки, но хочется избежать их раз и навсегда. Одно не уверен, а что если программа где-то глюканёт и повиснет, когда залочка снимется?
...
Рейтинг: 0 / 0
10.07.2012, 13:09:22
    #37873077
chpasha
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Эксклюзивный доступ к файлу
XDiaBLochpasha,
Вот-вот, мудрёная штука у тебя вышла.
мудренная? ну ты жжешь.

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

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

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

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

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

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

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

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

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

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


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