2010-04-18 94 views
1

我必須爲學校製作一個魚雷遊戲,併爲它添加一個頂部列表。我想將它存儲在JAR附近的文件夾結構中:/Torpedo/local/toplist/top_i.dat,其中i是該分數的位置。該文件將在程序的第一次啓動與此調用創建:Java文件文件I/O問題

File f; 
f = new File(Toplist.toplistPath+"/top_1.dat"); 
if(!f.exists()){ 

     Toplist.makeToplist(); 
} 

這裏是toplist類:

package main; 

import java.awt.Color; 
import java.io.BufferedReader; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.PrintWriter; 
import java.text.SimpleDateFormat; 
import java.util.Calendar; 
import java.util.prefs.Preferences; 

import javax.swing.JFrame; 
import javax.swing.JOptionPane; 
import javax.swing.JTextArea; 

public class Toplist { 

static String toplistPath = "./Torpedo/local/toplist"; //I know it won't work this easily, it's only to get you the idea 

public static JFrame toplistWindow = new JFrame("Torpedó - [TOPLISTA]"); 
public static JTextArea toplist = new JTextArea(""); 

static StringBuffer toplistData = new StringBuffer(3000); 

public Toplist() { 
    toplistWindow.setSize(500, 400); 
    toplistWindow.setLocationRelativeTo(null); 
    toplistWindow.setResizable(false); 

    getToplist(); 

    toplist.setSize(400, 400); 
    toplist.setLocation(0, 100); 
    toplist.setColumns(5); 
    toplist.setText(toplistData.toString()); 
    toplist.setEditable(false); 
    toplist.setBackground(Color.WHITE); 


    toplistWindow.setLayout(null); 
    toplistWindow.setVisible(true); 
} 

public Toplist(Player winner) { 

    //this is to be done yet, this will set the toplist at first and then display it 

    toplistWindow.setLayout(null); 
    toplistWindow.setVisible(true); 
} 

/** 
* Creates a new toplist 
*/ 
public static void makeToplist(){ 
    new File(toplistPath).mkdir(); 
    for(int i = 1; i <= 10; i++){ 
     File f = new File(toplistPath+"/top_"+i+".dat"); 
     try { 
      f.createNewFile(); 
     } catch (IOException e) { 
      JOptionPane.showMessageDialog(new JFrame(), "Fájl hiba: toplista létrehozása", "Error", JOptionPane.ERROR_MESSAGE); 
     } 
    } 
} 


/** 
* If the score is a top score it inserts it into the list 
* 
* @param score - the score to be checked 
*/ 
public static void setToplist(int score, Player winner){ 
    BufferedReader input = null; 
    PrintWriter output = null; 

    int topscore; 

    for(int i = 1; i <= 10; i++){ 
     try { 
      input = new BufferedReader(new FileReader(toplistPath+"/top_"+i+",dat")); 
      String s; 
      topscore = Integer.parseInt(input.readLine()); 
      if(score > topscore){ 
       for(int j = 9; j >= i; j--){ 
        input = new BufferedReader(new FileReader(toplistPath+"/top_"+j+".dat")); 
        output = new PrintWriter(new FileWriter(toplistPath+"/top_"+(j+1)+".dat")); 
        while ((s = input.readLine()) != null) { 
         output.println(s); 
        } 
       } 
       output = new PrintWriter(new FileWriter(toplistPath+"/top_"+i+".dat")); 
       output.println(score); 
       output.println(winner.name); 
       if(winner.isLocal){ 
        output.println(Torpedo.session.remote.name); 
       }else{ 
        output.println(Torpedo.session.remote.name); 
       } 
       output.println(Torpedo.session.mapName); 
       output.println(DateUtils.now()); 
       break; 
      } 


     } catch (FileNotFoundException e) { 
      JOptionPane.showMessageDialog(new JFrame(), "Fájl hiba: toplista frissítése", "Error", JOptionPane.ERROR_MESSAGE); 
     } catch (IOException e) { 
      JOptionPane.showMessageDialog(new JFrame(), "Fájl hiba: toplista frissítése", "Error", JOptionPane.ERROR_MESSAGE); 
     } finally { 
      if (input != null) { 
       try { 
        input.close(); 
       } catch (IOException e) { 
        JOptionPane.showMessageDialog(new JFrame(), "Fájl hiba: toplista frissítése", "Error", JOptionPane.ERROR_MESSAGE); 
       } 
      } 
      if (output != null) { 
       output.close(); 
      } 
     } 
    } 



} 

    /** 
     * This loads the toplist into the buffer 
     */ 
public static void getToplist(){ 
    BufferedReader input = null; 
    toplistData = null; 
    String s; 

    for(int i = 1; i <= 10; i++){ 
     try { 
      input = new BufferedReader(new FileReader(toplistPath+"/top_"+i+".dat")); 
      while((s = input.readLine()) != null){ 
       toplistData.append(s); 
       toplistData.append('\t'); 
      } 
      toplistData.append('\n'); 
     } catch (FileNotFoundException e) { 
      JOptionPane.showMessageDialog(new JFrame(), "Fájl hiba: toplista betöltése", "Error", JOptionPane.ERROR_MESSAGE); 
     } catch (IOException e) { 
      JOptionPane.showMessageDialog(new JFrame(), "Fájl hiba: toplista betöltése", "Error", JOptionPane.ERROR_MESSAGE); 
     } 
    } 
} 

/** 
* 
* @author http://www.rgagnon.com/javadetails/java-0106.html 
* 
*/ 
public static class DateUtils { 
     public static final String DATE_FORMAT_NOW = "yyyy-MM-dd HH:mm:ss"; 

     public static String now() { 
     Calendar cal = Calendar.getInstance(); 
     SimpleDateFormat sdf = new SimpleDateFormat(DATE_FORMAT_NOW); 
     return sdf.format(cal.getTime()); 

     } 
    } 

} 

的問題是,它不能訪問任何文件。我已經嘗試將它們添加到類路徑中,並且我至少在網上找到了六種不同的文件/路徑處理版本,但沒有任何效果。 任何人都可以告訴我我做錯了什麼?

謝謝。

+0

爲什麼不讓它像你的圖片資源從你的其他問題?然後使用來自URL對象的輸入流? – 2010-04-18 16:32:01

+0

我一開始試過,但沒有奏效,可能我做了一些錯誤的事情,但我無法弄清楚。 – 2010-04-18 16:47:30

回答

1

當您處理文件時,路徑與您執行應用程序的位置有關。從eclipse運行時,基本路徑是項目文件夾。

如果文件不存在,您通常會執行的操作是在父文件上調用mkdirs()以創建文件夾層次結構,然後創建該文件。

+0

我在makeToplist()中這樣做 – 2010-04-18 16:48:25

+2

您不使用mkdirs(),而是使用mkdir(),這是一種不同的方法(請參閱javadoc)。如果它不起作用,請告訴我們你得到的例外,這會更容易幫助。 – Guillaume 2010-04-18 17:08:32

+0

哦,我明白了。Mkdirs有效,現在getToplist在第156行返回一個空指針異常,即toplistData.append('\ n'); – 2010-04-18 19:27:17