#java #objectinputstream #objectoutputstream
#java #objectinputstream #objectoutputstream
Вопрос:
Я пытаюсь прочитать и записать объекты в файл. Чтение выходных данных в новый объект работает, но каждое значение равно null.
Вот код:
public void read() throws Exception
{
try
{
FileInputStream fIn = new FileInputStream(file);
ObjectInputStream in = new ObjectInputStream(fIn);
Object obj = in.readObject();
System.out.println(obj);
public void save() throws Exception
{
FileOutputStream fOut = new FileOutputStream(file.toString());
ObjectOutputStream out = new ObjectOutputStream(fOut);
out.writeObject(this);
out.flush();
out.close();
}
Вот выходные данные файла: (изображение выходных данных)
Я хотел бы получить значения, которые я ранее записал в файл в новом созданном объекте, однако все, что я получаю, равно null для всех значений.
Редактировать: поскольку люди запрашивают весь класс, и я понятия не имею, какой код может быть причиной чего, вот весь класс UserFile:https://pastebin.com/Gr1tcGsg
Комментарии:
1. Является ли новый объект правильным классом? Также покажите исходный код класса, который вы сериализовали. В нем могут быть ошибки.
2. NB Вам не нужен
file.toString()
. Простоfile
подойдет. Вам также не нужно очищать перед закрытием.3. @user207421 close вызывает сброс, и да, он все равно сбрасывает перед закрытием.
4. Хорошо, я прочитал, что он не сбрасывает. В качестве хорошей практики с потоком объектов полезно сбрасывать после записи в заголовки push. Но это общее правило конкретной реализации stream.
5. Нет, это не так. Это общее правило для ObjectOutputStream.
Ответ №1:
Я запустил этот код, и он работает, что означает, что вы, скорее всего, прочитали перед записью или получили исключение типа InvalidClassException: no valid constructor
, которое имело бы смысл в вашем случае.
Код, который я запустил:
public class SavedObject implements Serializable
{
public static void main(String[] args) throws IOException, ClassNotFoundException
{
new SavedObject();
}
private final int random;
private SavedObject() throws IOException, ClassNotFoundException
{
random = ThreadLocalRandom.current().nextInt();
File file = new File("Object.txt");
save(file);
read(file);
}
private void save(File file) throws IOException
{
FileOutputStream fileOutput = new FileOutputStream(file);
ObjectOutputStream objectOutput = new ObjectOutputStream(fileOutput);
objectOutput.writeObject(this);
objectOutput.close();
fileOutput.close();
System.out.println(this);
}
private void read(File file) throws IOException, ClassNotFoundException
{
FileInputStream fileInput = new FileInputStream(file);
ObjectInputStream objectInput = new ObjectInputStream(fileInput);
Object obj = objectInput.readObject();
System.out.println(obj);
objectInput.close();
fileInput.close();
}
public String toString()
{
return "SavedObject(Random: " random ")";
}
}
Который печатает:
SavedObject(Random: -2145716528)
SavedObject(Random: -2145716528)
Также несколько советов для вас:
- У вас нет try-catch, если вы
throws
- Иметь более читаемые имена переменных
- Отправьте больше кода в вашем следующем вопросе
- ObjectOutputStream не рекомендуется, если вы можете, вы должны записать значения такими, какие они есть
- Не используйте
throws
«Исключение», вместо этого используйтеthrows
« - Поместите файл вместо file.toString()
Ответ №2:
Я обнаружил проблему, она заключалась в том, что в моем конструкторе я неправильно применял полученную информацию из файла. Спасибо всем за помощь.