![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
Есть 2 потока. Один читае файл, а другой пишет. Как синхронизировать доступ к файлу ?
|
|||
|
||||
LSD (Online) |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Простейший способ, хотя и не самый оптимальный:
Есть еще варианты, но надо смотреть по задаче, надо ли уведомлять читающий процесс о новых данных, надо ли на это время останавливать запись в файл и т.д. Это сообщение отредактировал(а) LSD - 13.2.2005, 00:12 -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
Смысл такой - читающий поток проверяет дату последнего изменения файла. Если она изменилась, то он читает его. Пишуший поток просто пишет через определенные период времени.
|
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Тогда можно сделать как LSD предлагает, только учти что lock должен быть один и тот же для обеих тредов
-------------------- |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
Наверное так не получится - эти потоки находятся в разных приложениях.
Тоесть они могут запускаться независимо друг от друга. Может это можно сделать средствами самого файла ? |
|||
|
||||
LSD (Online) |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Для чтения использовать RandomAccessFile и открывать файл на запись, если в этот момент в файл пишет другая программа, то будет ошибка. -------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
djGri |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 77 Регистрация: 21.2.2005 Репутация: 1 Всего: 3 |
public void syncronized read() throws .... {
// insert code here } public void syncronized write() throws ....{ // insert code here } |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Все это не должно принадлежать этим двум тредам. Пожалуйстa пользуйся тегами [codе=javа] [/code]. -------------------- |
|||
|
||||
Zandr |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Пока не оказалось, что это вообще разные файлы на разных машинах, предложу следующее (это просто кусок из моего кода, не адаптированный под текущий вопрос):
Это сообщение отредактировал(а) Zandr - 28.2.2005, 14:30 |
||||||
|
|||||||
Guest |
|
|||
Unregistered |
![]() Это один файл на одной машине (PC1), но читатель и писатель на разных (PC2 и PC3) Тоесть участвуют 2 разные машины для манипуляцией файлом, а сам он лежит на третьей (например на сервере) |
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
извиняюсь - не зашел
![]() |
|||
|
||||
Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Значит юзай блокировки на уровне файловой системы, как в примере выше (я его попровил немного). Там осуществляется попытка блокировки на запись. Остальное в API.
|
|||
|
||||
zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
Что-то не очень-то получается
если блокировать и читающий процесс и пишущий, то вроде все должно работать, но все равно слетает ![]() |
|||
|
||||
Zandr |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 433 Регистрация: 16.7.2004 Где: Новосибирск Репутация: 9 Всего: 13 |
Не, процессы блокировать не нужно. Блокировать нужно файлы
![]()
В какую сторону? |
|||
|
||||
zss |
|
||||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: нет Всего: 2 |
Пробовал тестовый вариант, в котором при чтении файл блокируется для изменения, а при записи монопольно - вроде все работает. Непонятно, почему при чтении тоже нельзя монопольно заблокировать ?
Тестовый вариант
И самое главное. Это все работает при FileInputStream & FileOutputStream. Но мне надо при записи использовать StreamResult - а с ним к сожалению не получится получить FileChannel. Как быть ? Думал прокатит так
Но не дает писать - говорит файл заблокирован P.S. Блин - задолбался с этой синхронизацией, что нельзя было просто сделать что-нибудь вроде Mutex Это сообщение отредактировал(а) zss - 12.3.2005, 15:45 |
||||||
|
|||||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |