ObjectOutputStream дублированный вывод - PullRequest
0 голосов
/ 28 мая 2018

Не может даже найти саму проблему в этом случае.Когда программа читает из objects.dat , выводом являются только переменные последних объектов в массиве. Скриншот вывода программы. Я несколько раз пролистал код и не могу найти проблему.Насколько я знаю, все сглаживается, пока не будет предпринята попытка сериализации и записи / чтения объектов в "objects.dat".Если бы кто-нибудь мог подсказать мне, в чем заключается проблема или как ее исправить, я был бы очень признателен.Я думаю, что проблема может быть либо в методе readFile, либо в методе writeFile, но я не уверен в этом.

Цель состоит в том, чтобы создать массив объектов, сериализовать его, записать в файл и затем прочитать файл.

public class Test implements Serializable{

public static void main(String[] args) throws InvalidTestScore, ClassNotFoundException, IOException {
    Scanner keyboard = new Scanner(System.in);
    int userInput;
    final int ARRAYLENGTH;
    //get info for ARRAYLENGTH and make a TestScore array.
    System.out.println("How many test scores are you finding the average of? (ex. 6 tests): ");
    ARRAYLENGTH = keyboard.nextInt();
    TestScores[] scoreArray = new TestScores[ARRAYLENGTH];
    //populate scoreArray with TestScore objects.
    for (int counter = 0; counter < scoreArray.length; counter++)
    {
       System.out.println("Enter the score of test " + (counter + 1) + ": ");
       userInput = keyboard.nextInt();
       scoreArray[counter] = new TestScores(counter, userInput);

    }

    System.out.println("Now writing the object to 'objects.dat'...");
    TestScores.writeFile(scoreArray);

    System.out.println("Now reading the object from 'objects.dat'...");
    TestScores.readFile(ARRAYLENGTH);
}



 package scoresPackage;
import java.io.*;

public class TestScores implements Serializable {

    static TestScores[] scoreArray, scoreRead;
    static int score, name;

    TestScores (int test, int num) throws InvalidTestScore
    {
        name = test;
        score = num;

        if (num >= 100 || num <= 0)
           {
              throw new InvalidTestScore();
           }
    }
    public static void writeFile(TestScores[] test) throws IOException
    {
        FileOutputStream outStream = new FileOutputStream("objects.dat");
        try (ObjectOutputStream objectOut = new ObjectOutputStream(outStream)) {
            for (int counter = 0; counter < test.length; counter++)
            {
                objectOut.writeObject(test[counter]);
                objectOut.reset();
            }
        }
        System.out.println("Writing success.");
    }
    public static void readFile(int ALENGTH) throws IOException, ClassNotFoundException
    {
        FileInputStream inStream = new FileInputStream("objects.dat");
        try (ObjectInputStream objectIn = new ObjectInputStream(inStream)) {
            scoreRead = new TestScores[ALENGTH];

            for (int counter = 0; counter < ALENGTH; counter++)
            {
                scoreRead[counter] = (TestScores) objectIn.readObject();
                System.out.println("Test " + name + " Score: " + score);

            }
        }
        System.out.println("Reading success.");

    }

1 Ответ

0 голосов
/ 28 мая 2018

Это проблема:

static int score, name;

Это не имеет ничего общего с ObjectOutputStream - это означает, что у вас нет одного балла и одного имени на экземпляр из TestScores, но одна score переменная и одна name в целом .Ваш конструктор TestScores перезаписывает эти переменные, поэтому к моменту создания второго экземпляра вы потеряли первые name / score данные, которые вы запросили у пользователя.Хороший способ убедиться в этом - полностью удалить код ObjectOutputStream и ObjectInputStream: как только вы запросите у пользователя всю информацию, что произойдет, если вы попытаетесь распечатать все это на консоли?(По сути, вы увидите то же поведение: вы просто увидите последние введенные значения.)

Вам нужны поля экземпляра, а не статические поля:

int score, name;

(или еще лучшесделайте их частными ... это не единственное изменение, которое я бы сделал в коде, но это отправная точка.)

См. Java-учебник для получения дополнительной информации о разнице междустатические поля и поля экземпляра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...