Файл свойств, который я создал во время первого прогона, очищается во втором прогоне - PullRequest
3 голосов
/ 29 декабря 2011

Хорошо, я пытаюсь создать собственный клиент для Minecraft (не волнуйтесь, мой вопрос не имеет ничего общего с Minecraft в частности), и я добавил абстрактный класс для управления файлом конфигурации с помощью встроенного в Java Свойства системы. У меня есть метод, который загружает файл свойств или создает его, если он еще не существует. Этот метод вызывается в начале всех моих других методов (хотя он и делает что-либо только при первом вызове).

Файл свойств создается очень хорошо, когда я запускаю Minecraft в первый раз, но каким-то образом, когда я запускаю его во второй раз, файл отключается. Я не уверен, где или почему, или как я вытираю файл, может кто-нибудь помочь мне? Вот мой код; нарушающий метод - loadConfig ():

package net.minecraft.src;

import java.util.*;
import java.util.regex.*;
import java.io.*;

/**
 * Class for managing my custom client's properties
 *
 * @author oxguy3
 */
public abstract class OxProps
{
    public static boolean configloaded = false;
    private static Properties props = new Properties();
    private static String[] usernames;

    public static void loadConfig() {
        System.out.println("loadConfig() called");
        if (!configloaded) {
            System.out.println("loading config for the first time");
            File cfile = new File("oxconfig.properties");
            boolean configisnew;

            if (!cfile.exists()) {
                System.out.println("cfile failed exists(), creating blank file");
                try {
                    configisnew = cfile.createNewFile();
                } catch (IOException e) {
                        e.printStackTrace();
                        configisnew=true;
                }
            } else {
                System.out.println("cfile passed exists(), proceding");
                configisnew=false;
            }

            FileInputStream cin = null;
            FileOutputStream cout = null;
            try {
                cin = new FileInputStream(cfile);
                cout = new FileOutputStream(cfile);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }

            if (!configisnew) { //if the config already existed
                System.out.println("config already existed");
                try {
                    props.load(cin);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            } else { //if it doesn't exist, and therefore needs to be created
                System.out.println("creating new config");
                props.setProperty("names", "oxguy3, Player");
                props.setProperty("cloak_url", "http://s3.amazonaws.com/MinecraftCloaks/akronman1.png");
                try {
                    props.store(cout, "OXGUY3'S CUSTOM CLIENT\n\ncloak_url is the URL to get custom cloaks from\nnames are the usernames to give cloaks to\n");
                    cout.flush();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            String names = props.getProperty("names");
            System.out.println("names: "+names);
            try {
                usernames = Pattern.compile(", ").split(names);
            } catch (NullPointerException npe) {
                npe.printStackTrace();
            }
            System.out.println("usernames: "+Arrays.toString(usernames));
            configloaded=true;
        }
    }

    public static boolean checkUsername(String username) {
        loadConfig();
        System.out.println("Checking username...");
        for (int i=0; i<usernames.length; i++) {
            System.out.println("comparing "+username+" with config value "+usernames[i]);
            if (username.startsWith(usernames[i])){
                System.out.println("we got a match!");
                return true;
            }
        }
        System.out.println("no match found");
        return false;
    }

    public static String getCloakUrl() {
        loadConfig();
        return props.getProperty("cloak_url", "http://s3.amazonaws.com/MinecraftCloaks/akronman1.png");
    }
}

Если здесь слишком сложно читать, это также на Pastebin: http://pastebin.com/9UscXWap

Спасибо!

1 Ответ

4 голосов
/ 29 декабря 2011

Вы безоговорочно создаете new FileOutputStream(cfile). Это заменит существующий файл пустым. Вы должны вызывать конструктор FileOutputStream только при записи нового файла конфигурации.

if (configloaded) 
  return;
File cfile = new File("oxconfig.properties");
try {
  if (cfile.createNewFile()) {
    try {
      FileOutputStream cout = new FileOutputStream(cfile);
      props.setProperty("names", "oxguy3, Player");
      props.setProperty("cloak_url", "http://...");
      ...
      cout.flush();
    } finally {
      cout.close();
    }
  } else {
    FileInputStream cin = new FileInputStream(cfile);
    try {
      props.load(cin);
    } finally {
      cin.close();
    }
  }
  configloaded=true;
} catch(IOException ex) {
  e.printStackTrace();
}
...