powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / RandomAccessFile
12 сообщений из 37, страница 2 из 2
RandomAccessFile
    #38406082
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sharmankajdroidиспользуйте log4j, там все уже реализовано или базу данных и транзакции в качестве бонуса, зачем изобретать велосипед
хочу разобраться, поэтому нужен свой :)
лисапет только на картинке просто устроен, а когда начинаеш его собирать самостоятельно всплывает огромная масса нюансов
кстати log4j опенсорсный, он не за один день писался, там можно посмотреть как все должно правильно работать и понять стоит ли писать свой :-)
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406084
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaДавайте считать, что у меня академический интерес :)

Дык с постановкой задачи определитесь. "Чтобы не перезатиралось" это что-то очень сумбурное и расплывчатое.
Конечная цель какая? Написать тест убедится что прирост производительности отсутствует?
Какого размера блоки записываются за одну операцию одним потоком?
Пишем только в конец или в любую позицию?

sharmankaВопрос по этому счетчику - как, куда, каким образом?

14877167
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406087
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jdroid он не за один день писался, там можно посмотреть как все должно правильно работать и понять стоит ли писать свой :-)
AFAIK там очередь и однопоточная запись в файл. Так ведь?
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406106
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Blazkowiczjdroid он не за один день писался, там можно посмотреть как все должно правильно работать и понять стоит ли писать свой :-)
AFAIK там очередь и однопоточная запись в файл. Так ведь?
давно там не лазил, но вряд-ли за это время придумали что-то революционное
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406196
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем спасибо, получилось по способу, который я описывал выше.

P.S.:
Если кому-то интересно, то на этапе, когда конечный размер файла известен, а запись еще не началась создаем пустой файл и назначаем ему длину методом setLength. В нитях же, в зависимости от номера текущей нити пропускаем (номер) * (количество, которое должна записать нить) байт. На выходе имеем запись несколькими нитями одновременно в один файл без всяких локов на файл, счетчиков, и что самое важное - без затираний. Профит.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406205
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
sharmankaто на этапе, когда конечный размер файла известен, а запись еще не началась
Гениально. А если размер файла не известен до записи?
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406207
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Покажите код, если не сложно.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406240
sharmanka
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BlazkowiczГениально. А если размер файла не известен до записи?
Не знаю. Как вариант - сбрасывать в какой-то кеш, обсчитывать длину и по накатанной.




cdtyjvПокажите код, если не сложно.
Да, конечно. Убрал то, что не относится к теме:
Основной файл
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
	    RandomAccessFile raf = null;
        raf = new RandomAccessFile("1.txt", "rw");
        raf.setLength(length);
        raf.close();
        
        ExecutorService exec = Executors.newFixedThreadPool(num);
        for (Integer i = 1; i <= num; i++) {
            bt.setName(i.toString());
            Future f1 = exec.submit(bt);
            lst.add(f1);
			}



Метод ран:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
    public void run() {
       RandomAccessFile raf = null;
       
        try {
            raf = new RandomAccessFile("1.txt", "rw");
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
        String tname = MyThread.currentThread().getName();
        tname = tname.substring(14);
        System.out.printf("#%s trying to write % d bytes\n",tname, Main.bytenum);
        
        try {
            Integer skip = Main.bytenum * (Integer.parseInt(tname)-1);
            int num = raf.skipBytes(skip);
            
            System.out.printf("#%s skipped %d bytes\n",tname, num);
            for (int i = 0; i < Main.bytenum; i++) {
                raf.write(Integer.parseInt(tname));
			}
			raf.close();
		}
	}
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406523
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слишком узкоспециализированный код. Нормально подходит только для случаев, когда потоки пишут данные одинаковой длины. Плюс общее количество этих данных должно быть известно заранее.
В первом вашем сообщении постановка задачи была более общей, и данные вариант кода ее не решает.
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406873
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sharmankaВсем спасибо, получилось по способу, который я описывал выше.

P.S.:
Если кому-то интересно, то на этапе, когда конечный размер файла известен, а запись еще не началась создаем пустой файл и назначаем ему длину методом setLength. В нитях же, в зависимости от номера текущей нити пропускаем (номер) * (количество, которое должна записать нить) байт. На выходе имеем запись несколькими нитями одновременно в один файл без всяких локов на файл, счетчиков, и что самое важное - без затираний. Профит.

как вариант сферического коня в вакууме для решения абстрактных задач программирования решение вполне достойное
а если приложение должно работать хотя бы год без перезагрузки какой размер файла резервировать?
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406888
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvСлишком узкоспециализированный код. Нормально подходит только для случаев, когда потоки пишут данные одинаковой длины. Плюс общее количество этих данных должно быть известно заранее.
В первом вашем сообщении постановка задачи была более общей, и данные вариант кода ее не решает.
Та это постоянно такое. Сначала задаётся общий вопрос. На него даётся масса ответов. Затем следует ответ в стиле, "никто не смог помочь, но я молодец нашел решение для своего частного случая".
...
Рейтинг: 0 / 0
RandomAccessFile
    #38406917
jdroid
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
sharmankaна этапе, когда конечный размер файла известен, а запись еще не началась создаем пустой файл и назначаем ему длину методом setLength.

у меня всего два потока, причем точно знаю что первый запишет в файл 20 терабайт, а второй всего 10 байт. что делать если работа планировщика потоков недетерминирована и отличается в зависимости от реализации JVM а я не хочу резервировать 20 терабайт для записи 10 байт.
...
Рейтинг: 0 / 0
12 сообщений из 37, страница 2 из 2
Форумы / Java [игнор отключен] [закрыт для гостей] / RandomAccessFile
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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