2017-04-05 14 views
0

私はJavaFXで小さなゲームを作っています。ハイスコアシステムが必要です。 データベースでうまくいかないので、データをテキストファイルに書きました。 これは簡単に編集できるので、AppDataのテキストファイルに書きたいと思っています。 だから私は、この行で試してみました:AppDataに書き込めません

File file = new File(System.getenv("AppData") + "\\" + [Namefoler\\NameFile]); 

しかし、それは私がそのフォルダへのアクセスもしていないことを言って続けています。 ファイルの書き込みと書き込みは問題ありません。そのため、私のjarファイルと同じディレクトリにあるテキストファイルに書き込むだけで、システムは正常に動作します。 しかし、これらのエラーを投げつけ続けます。

誰かがこれを防止する方法、または私の問題のより良い解決策を知っていますか?事前

+0

http://stackoverflow.com/questions/18 906163/how-do-i-create-directories-and-files-users-appdata-directory – noobcoder

+0

両方を試してみましたが、うまくいきません! – Aleandro

+0

[preferences API](https://docs.oracle.com/javase/8/docs/technotes/guides/preferences/)は、おそらくあなたにとってより良い解決策です。 – jewelsea

答えて

1

おかげでこの答えは、のAppDataを行うことはありませんが、そう、これはPreferences APIに基づいて1つである、他のソリューションについて尋ねました。このサンプルは、ハイスコアシステム用のプリファレンスベースのAPIストレージ向けです。サンプルはデータを暗号化しません。

あなたはあなたがハイスコアをすくい上げるように設定を変更することについてユーザーが心配していると言います。ユーザーがデータを変更できないようなクライアントアプリケーションのデータを暗号化または隠すことは難しい命題です。ここではその方法を説明しません。それがあなたにとって必要条件であれば、それを達成するための方法についてインターネット上の他の情報を調べることができます。

score system

ScoreStorage.java

import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 

import java.util.prefs.BackingStoreException; 
import java.util.prefs.Preferences; 

public class ScoreStorage { 
    private static final int MAX_NUM_SCORES = 3; 

    private static final String SCORE_PREFERENCE_KEY_PREFIX = "score-"; 

    private ObservableList<Integer> scores = FXCollections.observableArrayList(); 
    private Preferences scorePreferences = Preferences.userNodeForPackage(
     ScoreStorage.class 
    ); 

    public ScoreStorage() throws BackingStoreException { 
     for (String key: scorePreferences.keys()) { 
      scores.add(scorePreferences.getInt(key, 0)); 
     } 
    } 

    public ObservableList<Integer> getUnmodifiableScores() { 
     return FXCollections.unmodifiableObservableList(scores); 
    } 

    public void clearScores() { 
     scores.clear(); 
     storeScores(); 
    } 

    public void recordScore(int score) { 
     int i = 0; 
     while (i < MAX_NUM_SCORES && i < scores.size() && scores.get(i) >= score) { 
      i++; 
     } 

     if (i < MAX_NUM_SCORES) { 
      if (scores.size() == MAX_NUM_SCORES) { 
       scores.remove(scores.size() - 1); 
      } 
      scores.add(i, score); 
      storeScores(); 
     } 
    } 

    private void storeScores() { 
     int i = 0; 
     for (int score: scores) { 
      scorePreferences.putInt(SCORE_PREFERENCE_KEY_PREFIX + i, score); 
      i++; 
     } 
     while (i < MAX_NUM_SCORES) { 
      scorePreferences.remove(SCORE_PREFERENCE_KEY_PREFIX + i); 
      i++; 
     } 
    } 
} 

HighScoreApp.java

テストハーネス:

import javafx.application.Application; 
import javafx.geometry.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.*; 
import javafx.stage.Stage; 

import java.util.Random; 
import java.util.prefs.BackingStoreException; 

public class HighScoreApp extends Application { 

    private static ScoreStorage scoreStorage; 

    private Random random = new Random(42); 

    @Override 
    public void start(Stage stage) throws Exception { 
     ListView<Integer> scoreList = new ListView<>(scoreStorage.getUnmodifiableScores()); 
     scoreList.setPrefHeight(150); 

     Label lastScoreLabel = new Label(); 

     Button generateScore = new Button("Generate new score"); 
     generateScore.setOnAction(event -> { 
      int lastScore = random.nextInt(11_000); 
      lastScoreLabel.setText("" + lastScore); 
      scoreStorage.recordScore(lastScore); 
     }); 

     Button clearScores = new Button("Clear scores"); 
     clearScores.setOnAction(event -> scoreStorage.clearScores()); 

     HBox scoreGenerator = new HBox(10, generateScore, lastScoreLabel); 
     scoreGenerator.setAlignment(Pos.BASELINE_LEFT); 

     VBox layout = new VBox(10, scoreGenerator, scoreList, clearScores); 
     layout.setPadding(new Insets(10)); 

     stage.setScene(new Scene(layout)); 
     stage.show(); 
    } 

    public static void main(String[] args) throws BackingStoreException { 
     scoreStorage = new ScoreStorage(); 
     launch(args); 
    } 
} 
+0

ありがとうございました! – Aleandro

関連する問題