2010-04-18 5 views
1

Мне нужно сделать торпедную игру для школы с топистом. Я хочу сохранить его в структуре папок рядом с JAR: /Torpedo/local/toplist/top_i.dat, где i является местом этого счета. Файлы будут созданы при первом запуске программы с этим вызовом:Проблема с текстовым файлом Java

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

     Toplist.makeToplist(); 
} 

Вот класс топлист:

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? –

+0

Я попробовал это сначала, но не работал, возможно, я сделал что-то не так, но я не мог понять это. –

ответ

1

Когда вы работаете с файлами, путь относится к тому, где вы выполняете приложение. При запуске из затмения базовый путь - это папка проекта.

Что бы вы обычно делали, если файл не существует, вызывается mkdirs() для родителя, чтобы создать иерархию папок, а затем создать файл.

+0

Я делаю это в makeToplist() –

+2

Вы не используете mkdirs(), вы используете mkdir(), который является другим методом (см. Javadoc). Если это не сработает, пожалуйста, покажите нам, какое исключение вы получите, вам будет легче помочь. – Guillaume

+0

О, я вижу. Mkdirs работает, теперь getToplist возвращает исключение nullpointer в строке 156, то есть toplistData.append ('\ n'); –