В доступе отказано при попытке записи с помощью FileWriter / BufferedWriter в Java. - PullRequest
0 голосов
/ 26 апреля 2018

Я действительно борюсь за это. По сути, я работаю с парой моих одноклассников в проекте, где мы должны предоставить римейк космических войн, и мы внедрили однопользовательский режим, в котором вы можете получить очки. Проблема в том, что я могу прочитать свой файл, но не могу написать на нем. Я попробовал все системы, которые я мог найти в Интернете, но не смог решить проблему. Вот код класса, который управляет системой рекордов. Я даже попытался создать файл с кодом и попытался удалить его и воссоздать пустой. файл находится в домашнем каталоге проекта прямо сейчас. Методы readFile и getHighscores работают, но проверка всегда застревает в записывающей части. я получаю сообщение об ошибке: «Il Privilegio Richiesto не Appartiene Al Client [Ljava.lang.StackTraceElement; @ 6eb60ef7" что переводится как «Запрошенная привилегия не принадлежит клиенту»

Имейте в виду, что все это в git-репозитории, где у меня должны быть все разрешения, но в принципе это единственная идея, которая осталась в моей голове.

package controller;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

/**
 *the creation of the HighscoreManager class.
 */
public class HighscoreManager {

    private static final int LAST_HIGHSCORE_INDEX = 9;
    private static final String FILE_NAME = "/Highscores.txt";
    private ArrayList<Integer> highscores = new ArrayList<Integer>();

    /**
     * reads the file and loads the highscore list.
     */
    private void readFile() {
        InputStream is = null;
        InputStreamReader isr = null;
        BufferedReader br = null;
        String s;
        highscores.clear();
        try {
            is = this.getClass().getResourceAsStream(FILE_NAME);
            isr = new InputStreamReader(is);
            br = new BufferedReader(isr);
            while ((s = br.readLine()) != null) {
                highscores.add(Integer.parseInt(s));
            }
            if(br!=null && isr !=null && is!= null) {
                br.close();
                isr.close();
                is.close();
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }
    }

    /**
     * checks if the passed score is an actual highscores.
     * @param score 
     */
    public void checkHighscores(final int score) {
        readFile();
        File file = new File(FILE_NAME);
        boolean newHighscoreFound = false;
        for (int i = 0; i < highscores.size(); i++) {
            if (score > highscores.get(i)) {
                newHighscoreFound = true;
                break;
            }
        }
        if (newHighscoreFound) {
            highscores.add(LAST_HIGHSCORE_INDEX, score);
            Collections.sort(highscores);
            Collections.reverse(highscores);
            for (int i : highscores) {
                System.out.println(i);
            }
            if(!file.exists()) {
                try {
                    file.createNewFile();
                } catch (IOException e) {
                    System.out.println(e.getMessage());
                }
            }
            FileWriter fw = null;
            BufferedWriter bw = null;
            try {
                fw = new FileWriter(file);
                bw = new BufferedWriter(fw);
                for(int i : highscores) {
                    bw.write(i);
                }
            } catch(IOException e) {
                System.out.println(e.getStackTrace());
            } finally {
                if(fw != null && bw != null) {
                    try {
                        fw.close();
                        bw.close();
                    } catch (IOException e) {
                        System.out.println(e.getStackTrace());
                    }

                }
            }

        }
    }

    /**
     * returns an array list of strings containing all the current highscores.
     * @return toBeReturned
     */
    public ArrayList<String> getHighscores() {
        ArrayList<String> toBeReturned = new ArrayList<>();
        try {
            highscores.clear();
            readFile();
            for (int i : highscores) {
                toBeReturned.add(String.valueOf(i));
            }
        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            System.out.println("There you have your highscores.");
        }
        return toBeReturned;
    }
}

1 Ответ

0 голосов
/ 26 апреля 2018

Вам не нужен доступ к объекту Class для загрузки файла (или даже связанного ClassLoader). Просто используйте обычный Java IO.

Чтобы прочитать ваш набор рекордов:

highScores = Files.lines(Paths.get(FILE_NAME))
                .map(Integer::parseInt)
                .collect(Collectors.toList());

Чтобы написать новый набор рекордов:

Files.write(Paths.get(FILE_NAME), highScores.stream()
                .map(String::valueOf)
                .collect(Collectors.toList()));

(Кроме того, почему это помечено "git"?)

...