Есть ли более эффективный способ записи в файлы?

Я пишу Bukkit (для тех, кто не знает: «Мод и плагины, которые упрощают запуск и управление серверами Minecraft. Включают форумы и документацию») плагин, который хранит пользовательские команды в своих соответствующих файлах. Я чувствую, что код, который я написал, крайне неэффективен.

Каждый раз, когда срабатывает PlayerCommandPreprocessEvent (каждый раз, когда вводится сообщение с "/" в начале), я создаю такую ​​переменную...

PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(fM.retrievePlayerFile(e.getPlayer().getName()), true)))

Затем я пишу в файл этого конкретного плеера, а затем закрываю вывод.

Неэффективно? Думаю, да....

Есть ли более простой и эффективный способ сделать это?

Заранее спасибо.

Изменить: fM.retrievePlayerFile(Player player) это:

public File retrievePlayerFile(String player) {
    player = player.toLowerCase();
    return (new File(plugin.getDataFolder(), "/users/" + player));
}

person Community    schedule 11.01.2014    source источник
comment
Что конкретно неэффективно в вашем нынешнем методе?   -  person Robert Harvey    schedule 12.01.2014
comment
Если бы вы не могли открывать и закрывать файл каждый раз, это могло бы ускорить процесс. Может быть, вы можете держать его открытым все время (не уверен в вашем точном сценарии).   -  person peter.petrov    schedule 12.01.2014
comment
Ну, это, наверное, звучит глупо... но как это выглядит. Создание группы анонимных объектов для простой переменной, запись одной строки текста в файл и закрытие. Если 1000 игроков были в сети, работая в среднем. 3 команды в минуту, каждую минуту это будет происходить 3000 раз. Просто мне кажется неэффективным.   -  person    schedule 12.01.2014
comment
@peter.petrov Не могу этого сделать, мне нужен писатель, открытый для каждого игрока на сервере.   -  person    schedule 12.01.2014
comment
@jdersen Вы можете закрыть его, когда пользователь выйдет из системы. Или вы можете использовать некоторые эвристики и закрыть его, если пользователь не проявляет активности в течение N минут. Идея состоит в том, чтобы оставить открытыми только те, которые действительно наиболее активны. Вы можете каким-то образом отслеживать активность пользователей за последние M минут, брать топ-K пользователей и держать их файлы открытыми. Просто некоторые идеи.   -  person peter.petrov    schedule 12.01.2014
comment
@peter.petrov Хм, это идея. В противном случае, я полагаю, это довольно эффективный код с учетом обстоятельств?   -  person    schedule 12.01.2014
comment
@jdersen По крайней мере, я не понимаю, как можно так улучшить запись в файл. Я бы посоветовал вам немного изменить общий алгоритм/дизайн и попытаться улучшить его.   -  person peter.petrov    schedule 12.01.2014
comment
@peter.petrov Хорошо, спасибо. Если вы опубликуете ответ, я приму его, чтобы закрыть ответ.   -  person    schedule 12.01.2014


Ответы (1)


Если бы вы не могли открывать и закрывать файл каждый раз, это могло бы ускорить работу.
Может быть, вы можете оставить его открытым все время (не уверен, что это ваш точный сценарий).

Если нет, попробуйте другие подходы к оптимизации.

1) Вы можете закрыть его, когда пользователь выйдет из системы. 2) Вы можете использовать некоторую эвристику и закрыть его, если пользователь не проявляет активности в течение N минут. 2) Возможная идея - оставить открытыми только те, которые действительно наиболее активны. Можно каким-то образом отследить активность пользователей за последние M минут, взять топ-K пользователей и оставить открытыми только их файлы.

Сам код не так уж и неэффективен, по крайней мере, я не вижу, как можно так улучшить запись в файл. Я бы посоветовал вам немного изменить общий алгоритм/дизайн и попытаться улучшить его.

person peter.petrov    schedule 11.01.2014