Проблема с обработкой файлов
Я начинающий программист Java, и у меня возникли проблемы с выводом файлов с моим проектом Java. В этом проекте у меня должна быть программа "Камень, ножницы, бумага", которая выводит результаты в отдельный файл. Когда я запускаю программу и затем смотрю на файл, он записывает только самые последние результаты вместо каждого. Любой совет о том, что делать, было бы здорово. Пожалуйста, извините за плохую форму; Я уберу это позже. Я также стер большую часть комментариев, чтобы сократить их. Благодарю.
import java.util.*;
import java.awt.*;
import java.io.*;
public class RockPaperScissors {
public static int count = 0;
public static void main(String[] args) {
execute();
}
public static void execute(){
System.out.println("This program will allow you to play \n\"Rock, Paper, Scissors\" against a computer.");
System.out.println();
System.out.println("Enter 'r' for Rock, 'p' for Paper, or s for Scissors.");
System.out.println("Enter 'w' to have an insta-win for that round. Enter '-1' at anytime to exit program.");
String info = userInput();
int value = guessCode();
decideOutcome(value, info);
again();
}
public static String userInput() {
Scanner console = new Scanner (System.in);
String s = console.next();
return s;
}
public static int guessCode() {
Random r = new Random ();
return (r.nextInt(3)+1); // Random integer between 1 and 3;
}
public static void decideOutcome(int i, String j) {
try {
PrintStream output = new PrintStream(new File ("records.txt"));
if (j.equalsIgnoreCase("rock")|| j.equalsIgnoreCase("r")) {
count++;
switch (i){
case 1:
System.out.println("You've won! Computer picked scissors.");
output.println(count + " Win ");
break;
case 2:
System.out.println("You've tied.... Computer also picked rock.");
output.println(count + " Tie ");
break;
case 3:
System.out.println("You've lost. Computer picked paper.");
output.println(count + " Loss ");
break;
}
} else if (j.equalsIgnoreCase("paper")|| j.equalsIgnoreCase("p")) {
count++;
switch (i){
case 1:
System.out.println("You've lost; Computer picked scissors.");
output.println(count + " Loss ");
break;
case 2:
System.out.println("You've won! Computer picked rock.");
output.println(count + " Win ");
break;
case 3:
System.out.println("You've tied.... Computer also picked paper.");
output.println(count + " Tie ");
break;
}
} else if (j.equalsIgnoreCase("scissors")|| j.equalsIgnoreCase("s")) {
count++;
switch (i){
case 1:
System.out.println("You've tied.... Computer picked scissors.");
output.println(count + " Tie ");
break;
case 2:
System.out.println("You've lost; Computer picked rock.");
output.println(count + " Loss ");
break;
case 3:
System.out.println("You've won! Computer also picked paper.");
output.println(count + " Win ");
break;
}
} else if (j.equalsIgnoreCase("w")) {
count++;
System.out.println("You've effortlessly defeated the computer!");
output.println(count + " Win ");
} else if (j.equals("-1")) {
System.out.println("Thanks for playing!"); // need to find way to reach end.
if (count == 1) { // If the user terminates after the first match.
System.out.println("You've played a single match.");
} else if (count > 1) { // Anything more than 1 match played upon termination.
System.out.println("You've played " + count + " matches total.");
} else { // This is for exceptions when user inputs gibberish for their sign and then 'no' for the second input.
System.out.println("No matches were played.");
}
System.out.println("Good Bye!");
System.exit(0);
} else {
System.out.println("You didn't input the right thing.");
}
} catch (FileNotFoundException e) {
System.out.println("File was not found; try again");
}
}
public static void again() {
System.out.println("Do you want to play again? (Type in 'y' for Yes or 'n' for No.)");
Scanner console2 = new Scanner (System.in);
String t = console2.next();
while (t.equalsIgnoreCase("yes")||t.equalsIgnoreCase("y")) {
System.out.println();
System.out.println();
execute(); //
}
if (t.equalsIgnoreCase("no") || t.equalsIgnoreCase("n") || t.equals("-1")) {
System.out.println("Hope you had fun! I'm sure I've had just as much fun with making this program! Good Bye!");
if (count == 1) { // If the user terminates after the first match.
System.out.println("You've played a single match.");
} else if (count > 1) { // Anything more than 1 match played upon termination.
System.out.println("You've played " + count + " matches total.");
} else { // This is for exceptions when user inputs gibberish for their sign and then 'no' for the second input.
System.out.println("No matches were played.");
}
System.exit(0);
} else { // If the user doesn't input 'yes' or 'no.'
System.out.println("Not the proper response, but it's assumed that you don't want to continue.");
if (count == 1) { // If the user terminates after the first match.
System.out.println("You've completed a single match.");
} else if (count >= 2) { // Anything more than 1 match played upon termination.
System.out.println("You've completed " + count + " matches total.");
} else { // The user haphazardly messes up both inputs.
System.out.println("No matches were finished.");
}
System.exit(0);
}
}
}
3 ответа
Когда ты decideOutcome()
открываешь PrintStream
в файл каждый раз.
Но этот конструктор не стремится к концу файла! Это означает, что вы перезаписываете содержимое каждый раз.
Попробуйте использовать FileWriter
вместо этого, с соответствующим конструктором.
Редактировать: так как для выполнения задания требуется PrintStream
(почему?), вам придется сделать это вместо этого:
PrintStream output = new PrintStream(new FileOutputStream("records.txt", true));
Но в реальной жизни вы, вероятно, будете использовать BufferedWriter
вместо; почти никто не использует PrintStream
,
Принтстрим, который вы используете, начинает запись в файл с начала, а не с того места, где находится последняя строка. Для работы с файлами будет лучше использовать Filewriter, так как он имеет режимы добавления и вставки. Что вам нужно, это режим добавления.
Вы никогда не можете использовать PrintStream
выполнить эту задачу так, как вы это делаете. В API четко указано, что конструктор PrintStream
делает следующее:
PrintStream (File file) Создает новый поток печати, без автоматической очистки строки, с указанным файлом.
file - файл для использования в качестве места назначения этого потока печати. Если файл существует, он будет обрезан до нулевого размера; в противном случае будет создан новый файл. Вывод будет записан в файл и помещен в буфер.
Нет конструкторов, которые позволили бы вам добавить предыдущий файл.
Поэтому решение заключается в том, что вы можете использовать только PrintStream
конструктор ровно ОДИН РАЗ. Это может быть достигнуто путем output
Переменная переменная класса и избавиться от вашего объявления (а также try-catch) в decideOutcome()
,
private static PrintStream output;
public static void main(String[] args) {
try {
output = new PrintStream(new File("records.txt"));
execute();
} catch (FileNotFoundException e) {
System.out.println("File was not found; try again");
} finally {
output.close();
}
}
Еще одна важная вещь, на которую стоит обратить внимание: когда вы открываете поток, такой как Scanner или PrintStream, вы всегда должны закрывать его. Лучшее место, чтобы закрыть их в finally
пункт, так как эта часть вашего кода гарантированно выполняется.