Сразу к делу. Есть 2 метода записи файла: через PrintWriter и через простой OutputStream (он закрыт //). И, в отличие от PrintWriter, он хотя бы работает. Смотрел через дебаг, writer просто не записывает строки в файл. И потому эти строки потом и не читаются. Вопрос 2: Почему-то возникает ошибка в 99 строке (хотя, скорее всего, она является следствием неправильной работы сохранеия. Но это далеко не точно, так как OutputStream записывает нормально.). Вот такие вот проблемы. За любую помощь буду очень благодарен) Вот код:
package com.javarush.task.task20.task2001;

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

/*
Читаем и пишем в файл: 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();
            if (ivanov.equals(somePerson))
            {
                System.out.println("Congratulations!");
            }

        } 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 {
            PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(outputStream)));
            //BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(outputStream));
            writer.println(this.name);
            int number = this.assets.size();
            writer.println(number);
            for (int i = 0; i < number; i++) {
               writer.println(this.assets.get(i).getName());
               writer.println(this.assets.get(i).getPrice());
            }

            //outputStream.write(this.name.getBytes());
            //outputStream.write("\n".getBytes());
            //int number = assets.size();
            //outputStream.write(number);
            //outputStream.write("\n".getBytes());
            //for (int i = 0; i < number; i++) {
            //   outputStream.write(assets.get(i).getName().getBytes());
            //outputStream.write("\n".getBytes());
            //   outputStream.write((Double.toString(assets.get(i).getPrice())).getBytes());
            //outputStream.write("\n".getBytes());
            //}

        }

        public void load(InputStream inputStream) throws Exception {
            BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
            this.name = reader.readLine();
            int number = Integer.parseInt(reader.readLine());
            for (int i = 0; i < number; i++) {
                String call = reader.readLine();
                Double price = Double.parseDouble(reader.readLine());
                assets.add(new Asset(call, price));
            }
        }
    }
}
Ну и класс 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;
    }

    @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;
    }
}