Проблема ввода-вывода в текстовый файл Java - PullRequest
1 голос
/ 18 апреля 2010

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

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());

      }
    }

}

Проблема в том, что он не может получить доступ ни к одному из файлов. Я попытался добавить их в путь к классам и, по крайней мере, шесть различных вариантов обработки файлов / путей, которые я нашел в Интернете, но ничего не помогло. Может ли кто-нибудь сказать мне, что я делаю не так?

Спасибо.

1 Ответ

1 голос
/ 18 апреля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...