powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / RandomAccessFile
25 сообщений из 37, страница 1 из 2
RandomAccessFile
    #38405336
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Известно что в файл пишут несколько нитей. Подскажите, как к гарантировано писать в конец файла. Перестановка указателя в конец файла не помогает, все равно часть данных затирается.
Метод ран:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
public void run() {
       RandomAccessFile raf = null;
       
        try {
            raf = new RandomAccessFile("file.txt", "rw");
        } catch (FileNotFoundException ex) {   }
        Random ch = new Random();
        try {

            for (int i = 0; i < Main.bytenum; i++) {
                raf.seek(raf.length());
                raf.writeChar(ch.nextInt());
                
            }
            raf.close();
			
		}
	}
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405440
Фотография Usman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaИзвестно что в файл пишут несколько нитей. Подскажите, как к гарантировано писать в конец файла. Перестановка указателя в конец файла не помогает, все равно часть данных затирается. Во-первых, нужно вынести за пределы метода run() (и класса Runnable) инициализацию переменной RandomAccessFile raf .
Ну, и во-вторых, синхронизировать потоки.
Например:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
final RandomAccessFile raf = new RandomAccessFile("file.txt", "rw");
final Random ch = new Random();
final Object monitor = new Object();
...
new Runnable() {
    public void run() {
        synchronized(monitor) {
            for (int i = 0; i < Main.bytenum; i++) {
                raf.write(ch.nextInt());
            }
        }
    }
}
...
raf.close();

P.S.
http://www.skipy.ru/technics/synchronization.html#monitors
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405853
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выделить работу с файлом в отдельный сервис и всем нитям работать с файлом только через сервис
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405895
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdroidвыделить работу с файлом в отдельный сервис и всем нитям работать с файлом только через сервис
Ага. Вот такой сервис:
Код: java
1.
ExecutorService service = Executors.newSingleThreadExecutor();
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405935
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
думаю лучше будет написать сервис с правильной синхронизацией операций записи
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405944
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Usman http://www.skipy.ru/technics/synchronization.html#monitors

По вашей ссылке:
если кто-то использует ресурс и захватил монитор для обеспечения единоличного доступа, то другой, желающий использовать тот же ресурс, должен подождать освобождения монитора
То есть насколько я понял, выходит обычная однопоточная запись в файл, а мне нужно другое.

jdroidвыделить работу с файлом в отдельный сервис и всем нитям работать с файлом только через сервис
У меня и так было выделено:

Код: java
1.
2.
3.
4.
ExecutorService exec = Executors.newFixedThreadPool(num);
        for (int i = 0; i < num; i++) {
            Future f1 = exec.submit(bt);
        }



Проблема актуальна :(
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405953
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так в чем проблема то? Вам уже дали корректный ответ: необходимо синхронизировать операцию записи, что бы одновременно мог писать только один поток. Других решений здесь нет.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405963
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
cdtyjvТак в чем проблема то? Вам уже дали корректный ответ: необходимо синхронизировать операцию записи, что бы одновременно мог писать только один поток. Других решений здесь нет.
Мне нужно писать в несколько потоков и 100% такое решение есть, потому что я видел рабочую программу. Осталось дело за малым - написать такую же.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405971
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaТо есть насколько я понял, выходит обычная однопоточная запись в файл, а мне нужно другое.

Какое, нафиг, "другое"? Логически подумай как два потока могут одновременно записать в конец файла, если запись изменяет позицию конца? В любом случае нужна очередь. Если нужно всё это дело жутко заопимтимизировать, то можно взять AtomicInteger в котором трекать длину файла при каждой записи. Если запись производится в конец, то AtomicInteger инкрементируется на длину добавляемого блока. В качестве конца файла все потоки должны использовать этот AtomicInteger.

Но такая оптимизация, ИМХО, особого смысла не имеет. Запись в файл намного медленнее чем блогикровки или другая синхронизация. Особенно если там HDD . Возможно если там SDD или виртуальный диск, и то не факт. Там ещё файловая система с операционкой много чего могут заблокировать.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405975
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaМне нужно писать в несколько потоков

Именно в конец файла?

sharmankaи 100% такое решение есть

100% есть готовое или 100% можно реализовать?

sharmankaпотому что я видел рабочую программу.
Откуда вы знаете как она устроена?

sharmankaОсталось дело за малым - написать такую же.
Осталось дело за малым синхронизировать запись в конце файла - не важно каким способом.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405981
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczМне нужно писать в несколько потоков
Именно в конец файла?
Это не уточняется, я думаю можно писать в любое место, главное чтобы предыдущие записи не затирались.

Blazkowicz100% есть готовое или 100% можно реализовать?
готовое

BlazkowiczОткуда вы знаете как она устроена?
автор сказал
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405983
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
суть в том, что при rw как мне кажется, никуда кроме как в конец, запистаь не получится
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405989
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaсуть в том, что при rw как мне кажется, никуда кроме как в конец, запистаь не получится
Вам "кажется"? Других объективных предпосылок нет? Запись с "добавлением" не путаете?
...
Рейтинг: 0 / 0
RandomAccessFile
    #38405992
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczЗапись с "добавлением" не путаете?
Со "вставкой" то есть.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406002
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
писать в файл одновременно невозможно (особенности устройства жесткого диска)
если нужна производительность потоков на запись, сервис копирует сообщения себе в очередь и отдает управление потоку, а фоновым потоком пишет из очереди в файл.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406017
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdroidписать в файл одновременно невозможно (особенности устройства жесткого диска)
А кто сказал что файловая система на жестком диске?

jdroidесли нужна производительность потоков на запись, сервис копирует сообщения себе в очередь и отдает управление потоку, а фоновым потоком пишет из очереди в файл.
Не понятно чего автор темы желает. HDD и SSD можно легко полностью нагрузить одним единственным потоком.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406031
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowicz100% есть готовое или 100% можно реализовать?
готовое

BlazkowiczОткуда вы знаете как она устроена?
автор сказал[/quot]

BlazkowiczА кто сказал что файловая система на жестком диске?

опишите, плиз, архитектуру системы вашего автора
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406041
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaЭто не уточняется, я думаю можно писать в любое место, главное чтобы предыдущие записи не затирались.

Это уже будет нетранзакционная база данных. Что такое "предыдущие записи". Откуда поток может знать что кто-то уже что-то написал?

sharmankaавтор сказал
То есть он 100% прав. И вы 100% правильно поняли что он имел ввиду. А мы тут все вас обманываем?
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406049
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczBlazkowiczЗапись с "добавлением" не путаете?
Со "вставкой" то есть.
Хорошо, пусть будет вставка. Главное чтобы уже записанное не терялось и запись шла параллельно. То есть если есть 5 нитей, каждая из которых должна записать 200 тысяч байт, то чтобы итоговый файл вышел размером в миллион байт.


Появилась мысль ставить указатель в каждой нити пропуская N байт от начала. Тогда первая нить будет писать с нулевой позиции и до N-той, вторая с N+1 и до 2N и т.д. Тогда сложность в том, чтобы определить в какая по счету эта нить (чтобы пропустить определнное количество позиций). Что скажите по этому поводу?
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406052
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczЭто уже будет нетранзакционная база данных. Что такое "предыдущие записи". Откуда поток может знать что кто-то уже что-то написал?
Наверное вызвав метод raf.length() и сравнив его с каким-то "предыдущим" значением.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406062
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sharmankaBlazkowiczпропущено...

Со "вставкой" то есть.
Хорошо, пусть будет вставка. Главное чтобы уже записанное не терялось и запись шла параллельно. То есть если есть 5 нитей, каждая из которых должна записать 200 тысяч байт, то чтобы итоговый файл вышел размером в миллион байт.


Появилась мысль ставить указатель в каждой нити пропуская N байт от начала. Тогда первая нить будет писать с нулевой позиции и до N-той, вторая с N+1 и до 2N и т.д. Тогда сложность в том, чтобы определить в какая по счету эта нить (чтобы пропустить определнное количество позиций). Что скажите по этому поводу?

используйте log4j, там все уже реализовано или базу данных и транзакции в качестве бонуса, зачем изобретать велосипед
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406066
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
jdroidиспользуйте log4j, там все уже реализовано или базу данных и транзакции в качестве бонуса, зачем изобретать велосипед
хочу разобраться, поэтому нужен свой :)
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406070
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaХорошо, пусть будет вставка. Главное чтобы уже записанное не терялось и запись шла параллельно. То есть если есть 5 нитей, каждая из которых должна записать 200 тысяч байт, то чтобы итоговый файл вышел размером в миллион байт.
Появилась мысль ставить указатель в каждой нити пропуская N байт от начала. Тогда первая нить будет писать с нулевой позиции и до N-той, вторая с N+1 и до 2N и т.д. Тогда сложность в том, чтобы определить в какая по счету эта нить (чтобы пропустить определнное количество позиций). Что скажите по этому поводу?
Ну, так я это и предлагал выше - завести потокобезопасный счетчик конца файла для вычисления позиции записи каждого потока.
Но какой в этом грандиозный смысл, если код тупо усложняется, а производительность диска никак не увеличивается? А в случае HDD даже уменьшается.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406071
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaхочу разобраться, поэтому нужен свой :)
Уже все разжевали подробно чтобы разобратся.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406080
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczНу, так я это и предлагал выше - завести потокобезопасный счетчик конца файла для вычисления позиции записи каждого потока.
Но какой в этом грандиозный смысл, если код тупо усложняется, а производительность диска никак не увеличивается? А в случае HDD даже уменьшается.
Давайте считать, что у меня академический интерес :)

Вопрос по этому счетчику - как, куда, каким образом?
...
Рейтинг: 0 / 0
25 сообщений из 37, страница 1 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / RandomAccessFile
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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