ObjectOutputStream 重复输出
ObjectOutputStream duplicate output
这种情况下连问题本身都找不到。当程序从objects.dat读取时,输出只是数组中最后一个对象的变量。
Program output screenshot.
代码梳理了好几遍都找不到问题所在。据我所知,一切都很顺利,直到它尝试序列化对象 write/read 到 "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.");
}
这是问题所在:
static int score, name;
它与 ObjectOutputStream
无关 - 这意味着您没有每个 instance of TestScores
的一个分数和一个名字,但是一个 score
变量和一个 name
整体 。您的 TestScores
构造函数正在覆盖这些变量,因此当您创建第二个实例时,您已经丢失了您向用户请求的第一个 name
/score
数据。一种查看此情况的好方法是完全删除 ObjectOutputStream
和 ObjectInputStream
代码:一旦您向用户询问了所有信息,如果您尝试将其全部打印到控制台会发生什么? (基本上,您会看到相同的行为:您只会看到最后输入的值。)
您需要实例字段,而不是静态字段:
int score, name;
(或者更好的是,将它们设为私有...这不是我对代码所做的唯一更改,但这是一个起点。)
有关静态字段和实例字段之间差异的详细信息,请参阅 Java tutorial。
这种情况下连问题本身都找不到。当程序从objects.dat读取时,输出只是数组中最后一个对象的变量。 Program output screenshot. 代码梳理了好几遍都找不到问题所在。据我所知,一切都很顺利,直到它尝试序列化对象 write/read 到 "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.");
}
这是问题所在:
static int score, name;
它与 ObjectOutputStream
无关 - 这意味着您没有每个 instance of TestScores
的一个分数和一个名字,但是一个 score
变量和一个 name
整体 。您的 TestScores
构造函数正在覆盖这些变量,因此当您创建第二个实例时,您已经丢失了您向用户请求的第一个 name
/score
数据。一种查看此情况的好方法是完全删除 ObjectOutputStream
和 ObjectInputStream
代码:一旦您向用户询问了所有信息,如果您尝试将其全部打印到控制台会发生什么? (基本上,您会看到相同的行为:您只会看到最后输入的值。)
您需要实例字段,而不是静态字段:
int score, name;
(或者更好的是,将它们设为私有...这不是我对代码所做的唯一更改,但这是一个起点。)
有关静态字段和实例字段之间差异的详细信息,请参阅 Java tutorial。