Сначала напишу условие задачи, потом напишу суть своей проблемы
1) Условие----------------------------------
- Читаем и пишем в файл: Human
- Часто необходимо сохранять состояние работы программы. До появления сериализации каждый делал это своим способом.
- В этой задаче нужно сохранить в файл состояние работы программы и вычитать состояние из файла без использования сериализации.
- Реализуй логику записи в файл и чтения из файла для класса Human.
- Поле name в классе Human не может быть пустым.
- Метод main реализован только для тебя и не участвует в тестировании.
2)Проблема---------------------------------------
- Я создал в классе Asset методы load(InputStream inputStream) и save(OutputStream outputStream) для сохнарение объектов этого класса, такие же методы создал и для класса Human
- Сохрание состояний объекта произошло КОРРЕКТНО
- Проблема возникает при считываи объекта из файла, а точнее только при входе в метод load() класса Asset. Поток inputStream, который я передаю в параметры этого метода почемуто "становится пустым", "до передачи" в этот метод в нем были значения
Я думаю что проблема вот в чем - изначально при заворачивании потока в классе human в обертку BufferedReader , все данные потока считались в буфер обертки и указатель потока inputStream сразу переместился на конец потока и в метод load(inputStream) класса Asset я передал поток inputStream уже с "указателем на конце" - ЭТО ТОЛЬКО МОЕ ПРЕДПОЛОЖЕНИЕ ,РЕБЯТ Я ХОЧУ ЗНАТЬ КАК НА САМОМ ДЕЛЕ. ПОСОВЕТУЙТЕ ГДЕ МОЖНО ПРОЧИТАТЬ ПОДРОБНО КАК УСТРОЕН inputStream И BufferedReader - МЕХАНИЗМ УКАЗАТЕЛЕЙ НА ТЕКУЩИЙ БАЙТ.чтобы исправить проблему я пробовал в конструкторе BufferedReader(inputStream,размер буфера) установить размер буфера 1 байт , чтобы в классе Human BufferedReader( сразу все не считывал себе в буфер и при передаче inputStream в Asset передавался НЕПУСТОЙ поток, точнее поток с указателем на том байте, который еще не был "загружен", но это не помогло , видимо промежуточная обертка new InputStreamReader еще чтото буферизует
public void load(InputStream inputStream) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String isNamePresent = br.readLine();
if(isNamePresent.equals("yes")) name = br.readLine();
String isAssetPresent = br.readLine();
if(isAssetPresent.equals("yes")){
int size = Integer.parseInt(br.readLine());
for (int i = 0; i < size; i++) {
Asset asset = new Asset(null,0);
asset.load(inputStream);
assets.add(asset);
}
}
}
}
Код класса Solution(с внутренним классом Human)
public class Solution {
public static void main(String[] args) {
//исправьте outputStream/inputStream в соответствии с путем к вашему реальному файлу
try {
File your_file_name = File.createTempFile("your_file_name", null);
OutputStream outputStream = new FileOutputStream(your_file_name);
InputStream inputStream = new FileInputStream(your_file_name);
Human ivanov = new Human("Ivanov", new Asset("home", 999_999.99), new Asset("car", 2999.99));
ivanov.save(outputStream);
outputStream.flush();
Human somePerson = new Human();
somePerson.load(inputStream);
inputStream.close();
System.out.println(somePerson.name);
//check here that ivanov equals to somePerson - проверьте тут, что ivanov и somePerson равны
} catch (IOException e) {
//e.printStackTrace();
System.out.println("Oops, something wrong with my file");
} catch (Exception e) {
e.printStackTrace();
System.out.println("Oops, something wrong with save/load method");
}
}
public static class Human {
public String name;
public List<Asset> assets = new ArrayList<>();
public Human() {
}
public Human(String name, Asset... assets) {
this.name = name;
if (assets != null) {
this.assets.addAll(Arrays.asList(assets));
}
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Human human = (Human) o;
if (name != null ? !name.equals(human.name) : human.name != null) return false;
return assets != null ? assets.equals(human.assets) : human.assets == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + (assets != null ? assets.hashCode() : 0);
return result;
}
public void save(OutputStream outputStream) throws Exception {
String isNamePresent = name != null ? "yes" : "no";
outputStream.write((isNamePresent+System.lineSeparator()).getBytes());
outputStream.flush();
if(name!=null) outputStream.write((name+System.lineSeparator()).getBytes());
outputStream.flush();
String isAssetPresent = assets != null ? "yes" : "no";
outputStream.write((isAssetPresent+System.lineSeparator()).getBytes());
outputStream.flush();
if(assets!=null) {
int size = assets.size();
outputStream.write((String.valueOf(size)+System.lineSeparator()).getBytes());
outputStream.flush();
for (int i = 0; i < assets.size(); i++) {
assets.get(i).save(outputStream);
}
}
}
public void load(InputStream inputStream) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
String isNamePresent = br.readLine();
if(isNamePresent.equals("yes")) name = br.readLine();
String isAssetPresent = br.readLine();
if(isAssetPresent.equals("yes")){
int size = Integer.parseInt(br.readLine());
for (int i = 0; i < size; i++) {
Asset asset = new Asset(null,0);
asset.load(inputStream);
assets.add(asset);
}
}
}
}
}
Код класса Asset--------------------------------------------------
public class Asset {
public Asset(String name, double price) {
this.name = name;
this.price = price;
}
private String name;
private double price;
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public void save(OutputStream outputStream) throws Exception {
outputStream.write((name+System.lineSeparator()).getBytes());
outputStream.write((price+System.lineSeparator()).getBytes());
outputStream.flush();
}
public void load(InputStream inputStream) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
name = br.readLine();
price = Integer.parseInt(br.readLine());
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Asset asset = (Asset) o;
if (Double.compare(asset.price, price) != 0) return false;
return name != null ? name.equals(asset.name) : asset.name == null;
}
@Override
public int hashCode() {
int result;
long temp;
result = name != null ? name.hashCode() : 0;
temp = Double.doubleToLongBits(price);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
} package com.javarush.task.task20.task2001;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
public class Asset {
public Asset(String name, double price) {
this.name = name;
this.price = price;
}
private String name;
private double price;
public String getName() {
return name;
}
public double getPrice() {
return price;
}
public void save(OutputStream outputStream) throws Exception {
outputStream.write((name+'\n').getBytes());
outputStream.write((price+""+'\n').getBytes());
}
public void load(InputStream inputStream) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
name = br.readLine();
price = Integer.parseInt(br.readLine());
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Asset asset = (Asset) o;
if (Double.compare(asset.price, price) != 0) return false;
return name != null ? name.equals(asset.name) : asset.name == null;
}
@Override
public int hashCode() {
int result;
long temp;
result = name != null ? name.hashCode() : 0;
temp = Double.doubleToLongBits(price);
result = 31 * result + (int) (temp ^ (temp >>> 32));
return result;
}
}