2011-12-29 10 views
3

これは、 Javaの組み込みのPropertiesシステムを使用して設定ファイルを管理する抽象クラスを追加しました。私はプロパティファイルをロードするメソッドを持っています。このメソッドは、他のすべてのメソッドの最初に呼び出されます(呼び出されたときは何もしません)。第1回で作成したプロパティファイルが2回目に空白になる

初めてMinecraftを実行すると、プロパティファイルがうまく作成されますが、何とか2回目に実行するとファイルが消去されます。どこで、なぜ、どのように私はファイルをきれいにしているのか分からない、誰かが私を助けてくれる?ここに私のコードです。

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"); 
    } 
} 

それはここで読むにはあまりにも難しい場合は、それはペーストビンでもあります::http://pastebin.com/9UscXWap

おかげで問題のある方法は、loadConfig()です!

+0

このサイトにコードを編集します。 PastebinがStackOverflowと同時に起動するという保証はありません。 – Makoto

+0

@Makoto Okay、done - ここに投稿しました。 –

答えて

4

無条件で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(); 
} 
+0

私はそのコンストラクタを 'if(!cfile.exists())'ステートメントに移しました。それは魅力的に機能しました。ありがとうerickson! –

関連する問題