#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 позаботится о сериализации для вас 🙂