Работа с файлом в Java

#java #file #search #logging #input

#java #файл #Поиск #ведение журнала #ввод

Вопрос:

У меня небольшая проблема со всеми средствами чтения и записи файлов в Java. Я хочу, чтобы моя программа получала имя пользователя, а затем, задав им пару вопросов, оценивала их оценку. Это довольно просто, но теперь я хочу задокументировать это в файле журнала, подобном этому:

 Jacob : 10
Mark : 15
Steve : 7
  

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

Редактировать:

 import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.Scanner;

public class Main {
    static Scores scoreClass = new Scores();

    private static void setupMap() {
        try {
            FileInputStream fin = new FileInputStream("scores.map");
            @SuppressWarnings("resource")
            ObjectInputStream ois = new ObjectInputStream(fin);
            scoreClass = (Scores) ois.readObject();
          } catch (Exception e) {
              System.err.println("Could not load score data");
              e.printStackTrace();
          }
    }
    private static void saveMap() {
        try {
            FileOutputStream fout = new FileOutputStream("scores.map");
            @SuppressWarnings("resource")
            ObjectOutputStream oos = new ObjectOutputStream(fout);
            oos.writeObject(scoreClass);
        } catch (Exception e) {
            System.err.println("Could not save score data");
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        setupMap();
        int score = 0;
        String guess;
        String[][] questions_with_answers = {{"I __________ to school.(go)", "She __________ tennis. (play)", "She _______ a bitch. (be)"}, {"am going", "was playing", "is being"}};
        Scanner answer = new Scanner(System.in);
        Scanner studentInput = new Scanner(System.in);
        System.out.println("What is your name?");
        String name = answer.nextLine(); 
        if(Scores.getScore(name) == -1){
            Scores.setScore(name, score);
        } else {
            Scores.getScore(name);
        }

        System.out.println("Hello "   name   ". Your score is: "   score);
        for(int i = 0; i < (questions_with_answers[0].length); i  ){
            System.out.println(questions_with_answers[0][i]);
            guess = studentInput.nextLine();
            if(guess.equals(questions_with_answers[1][i])){
                System.out.println("Correct! You get 1 point.");
                score = score   1;
                System.out.println("Your score is "   score);
            } else {
                System.out.println("You made a mistake! No points...");
            }
        }
        System.out.printf("Congrats! You finished the test with "  score  " points out of "   questions_with_answers[0].length);    
        Scores.setScore(name, score);
        saveMap();
        answer.close();
        studentInput.close();
    }
}
  

Это не создает никаких исключений, но по-прежнему не считывает входные данные из файла :/

Комментарии:

1. Что вы пробовали до сих пор? Покажите нам какой-нибудь код

2. Вы можете использовать в каждой строке String [] array = line.split(":"); , которая возвращала бы массив, в вашем случае, если он был сохранен правильно, размер массива должен быть 2. Затем просто используйте int score = Integer.valueOf(array[1])

Ответ №1:

Вы можете сохранить данные в виде хэш-карты, а затем сериализовать их в файл сохранения

Я написал пример, который включает класс с именем Scores, который имеет методы для считывания оценки и добавления оценки к содержащейся хэш-карте. Я также добавил методы в основной класс для сохранения и открытия файла, который будет содержать данные класса score.

Основной класс:

 public class Main {
    static Scores scoreClass = new Scores();

    public static void main(String[] args) {
        setupMap();
        //Do score calculations
        saveMap();

    }
    private static void setupMap() {
        try {
            FileInputStream fin = new FileInputStream("scores.map");
            @SuppressWarnings("resource")
            ObjectInputStream ois = new ObjectInputStream(fin);
            scoreClass = (Scores) ois.readObject();
          } catch (Exception e) {
              System.err.println("Could not load score data");
              e.printStackTrace();
          }
    }
    private static void saveMap() {
      try {
          FileOutputStream fout = new FileOutputStream("scores.map");
          @SuppressWarnings("resource")
          ObjectOutputStream oos = new ObjectOutputStream(fout);
          oos.writeObject(scoreClass);
      } catch (Exception e) {
          System.err.println("Could not save score data");
          e.printStackTrace();
      }
  }

}
  

Класс оценки:

 public class Scores implements Serializable{
    private static final long serialVersionUID = 1L;

    public static Map<String, Integer> scoreMap = new HashMap<String, Integer>();

    public static int getScore(String name) {
        if (scoreMap.containsKey(name)) {
            return scoreMap.get(name);
        } else {
            return -1;
        }
    }

    public static void setScore(String name, int score) {
        scoreMap.put(name, score);
    }
}
  

Комментарии:

1. большое спасибо за помощь человеку 🙂 по-прежнему по какой-то причине оценка и имя не считываются из файла :/ есть идеи относительно того, почему это может быть?

2. Использование java.util. Класс Properties позаботится о сериализации для вас 🙂