Не сохранются значения из мапы в файл

q20w26a

Разработчик
Инструктор
Пользователь
Сообщения
573
Решения
27
Я, аки не самый лучший кодер, набросал недавно весьма рабочее, но относительно костыльное решение.
Недавно я понял, что не понимаю что я наделал, так как код просто не работает.

Java:
import java.io.*;
import java.time.Instant;

public class AllowlistFile {
    private final String PATH;

    public AllowlistFile(String PATH) throws IOException {
        this.PATH = PATH;
        File file = new File(PATH);
        if (!file.exists())
            file.createNewFile();
    }

    public void save(BufferedWriter writer) throws IOException {
        int size = AllowedPlayersManager.getCount();
        if (size == 0)
            return;
        String[] names = AllowedPlayersManager.getNames().toArray(new String[size]);
        Long[] times = AllowedPlayersManager.getTime().toArray(new Long[size]);
        for(int i = 0; i < size; i++) {
            writer.write(new StringBuilder(names[i]).append(";").append(times[i]).append("\n").toString());
        }
    }

    public void load(BufferedReader reader) throws IOException {
        String line = reader.readLine();
        while (line != null) {
            String[] info = line.split(";");
            if (info.length == 2 && info[0] != null && info[1] != null) {
                long time = Long.parseLong(info[1]);
                if (time > Instant.now().getEpochSecond())
                    AllowedPlayersManager.addPlayer(info[0], time);
            }
            line = reader.readLine();
        }
    }

    public String getPath() {
        return PATH;
    }
}

Даже если size больше 0 (что можно проверить с помощью дебага или банального логгера), значения просто не сохраняются и файл остается пустым.


Java:
//где-то в onEnable
        BufferedReader reader = null;
        try {
            allowlistFile = new AllowlistFile(getDataFolder() + File.separator + "allowlist");
            PATH = allowlistFile.getPath();
            reader = new BufferedReader(new FileReader(path));
            allowlistFile.load(reader);
            reader.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        
// в onDisable
         try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(PATH));
            allowlistFile.save(writer);
            getLogger().info("All players saved!");
            writer.close();
        }  catch (IOException e) {
            e.printStackTrace();
        }

Я знаю что это корявое, кривое, не очень красивое решение, что можно было бы переделать архитектуру и пользоваться мощью try-with-resources и другими способами сохранения данных, но мне не до этого. Файл кстати создается, иначе я бы просто не дошел до этого момента)
 
Если твоя проблема, что при выключении плагина в файл ничего не записывается, то очевидно, что там size == 0. Иначе быть не может. Я не знаю как ты "дебажил", что при size > 0 у тебя не сохраняло, будут ли выводиться логи перед writer.write(...) в том цикле? Логически там цикл будет выполнятся и как минимум символы какие нибудь запишет. К тому же в конце идет writer.close(), который флушит и закрывает, все ок.

P.S. Путь можно прописывать с "/" всегда и везде, работает на всех системах, джава об этом позаботилась
 
Если твоя проблема, что при выключении плагина в файл ничего не записывается, то очевидно, что там size == 0
Вывожу логгером size, добавив перед этим значение в мапу. Показывает 1. Я даже убирал проверку на размер. Попробую еще что-нибудь придумать...
 
Вывожу логгером size, добавив перед этим значение в мапу. Показывает 1. Я даже убирал проверку на размер. Попробую еще что-нибудь придумать...
Я не понимаю смысла того, что ты кидаешь в AllowlistFile путь к файлу (в конструкторе), потом же его в другом коде достаешь и хранишь в переменной чтобы потом создать BufferedWriter / BufferedReader чтобы передать... Почему нельзя просто в этот же AllowlistFile передать просто File, а там уже при любых операциях создавать BufferedWriter / BufferedReader?

Как минимум это бы убрало всякие мысли о том, что у тебя где то криво путь достается и т.п. Вроде того, что ты создаешь файл в одном месте а пишешь куда то в другое. Иначе пока не вижу как оно может не писать при size > 0 и с условием что PATH корректный и тот же, что и был при создании файла.

Ну и да, юзай try-with-resources а еще попробуй file пихнуть, а не path:
Код:
try (BufferedWriter writer = new BufferedWriter(new FileWriter(file))) {
    writer.write(...);
}
 
Назад
Сверху Снизу