2016-10-02 2 views
0

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

Jacob : 10 
Mark : 15 
Steve : 7 

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

EDIT:

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

Это не выбрасывает никаких исключений, но все равно не читает входные данные из файла:/

+3

Что вы пытаетесь до сих пор? Покажите нам код – nachokk

+0

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

ответ

0

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

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

Главный класс:

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); 
    } 
} 
+0

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

+0

Использование класса [java.util.Properties] (https://docs.oracle.com/javase/8/docs/api/java/util/Properties.html) позаботится о сериализации для вас :-) – Selim

Смежные вопросы