Странный вывод из файла

У меня проблема с входными данными, которые я получаю при чтении файла.

Файл создается в другом действии и очень прост:

ArrayList stuff = new ArrayList();
stuff.add("1,2,3");

try{
String saveFile = "saveGamesTest1.csv";
FileOutputStream saveGames = openFileOutput(saveFile, getApplicationContext().MODE_APPEND);    

ObjectOutputStream save = new ObjectOutputStream(saveGames);

save.writeObject(stuff);    
save.close(); }

В другом действии он читается через

try {
            FileInputStream fileIn=openFileInput("saveGamesTest1.csv");
            InputStreamReader InputRead = new InputStreamReader(fileIn);

            Scanner s = new Scanner(InputRead).useDelimiter(",");
            System.out.println(s.next());
            System.out.println(s.next());
            System.out.println(s.next());

        }

Я ожидал (и надеялся) получить результат, например

1
2
3

Однако результат, который я получаю, таков:

/storage/emulated/0/Android/data/ys.test/files/saveGamesTest1.csv����sr��java.util.ArrayListx����a���I��sizeexp������ w������t��1
2
3x

Что я делаю не так?
.

EDIT
Я попробовал Serializable, как предложено ниже, например:

public class Save implements java.io.Serializable {
        public String name;
        public String address;
        public transient int SSN;
        public int number;

    }


    public void save(){

        Save e = new Save();
        e.name = "Reyan Ali";
        e.address = "Phokka Kuan, Ambehta Peer";
        e.SSN = 11122333;
        e.number = 101;

        try {
            String saveFile = "save.ser";
            FileOutputStream saveGames = openFileOutput(saveFile, getApplicationContext().MODE_APPEND);
            ObjectOutputStream out = new ObjectOutputStream(saveGames);
            out.writeObject(e);
            out.close();
            saveGames.close();
            System.out.printf("Serialized data is saved in save.csv");
        }
        catch(IOException i) {
            i.printStackTrace();
            out.println("Save exception gepakt");
        }
    }  

Однако out.writeObject(e); выдает ошибку о том, что это не Serializable.


person YankeeSierra    schedule 11.05.2017    source источник
comment
JavaScript != Java   -  person Roope    schedule 11.05.2017


Ответы (1)


Вы не храните объект как csv, а сериализуете объект java, который вы должны читать как объект, а не как файл csv.

посмотрите здесь https://www.tutorialspoint.com/java/java_serialization.htm в сериализации части объекта

Вы должны использовать

FileInputStream in = null;
ObjectInputStream ois = null;
ArrayList stuff2 = null;
try {
    in = openFileInput("saveGamesTest1.csv");
    ois = new ObjectInputStream(in);
    stuff2 = (ArrayList) ois.readObject();
} catch(IOException e) {...}
catch(ClassNotFoundException c) {...}
finally {
    if (ois != null) {
        ois.close();
    }
    if (in != null) {
        in.close();
    }
}

Если вам нужен файл csv, вы должны создать его, например, перебирая свой массив и записывая одно за другим значение в свой файл и добавляя разделитель или следуя этому Как сериализовать объект в файл CSV?

РЕДАКТИРОВАТЬ: элегантный способ в Java 7 сериализовать объект (здесь список, как в вашем примере) и десериализовать:

public class Main {

public static void main(String[] args) {
    List<Integer> lists = new ArrayList<>();
    List<Integer> readList = null;
    String filename = "save.dat";
    lists.add(1);
    lists.add(2);
    lists.add(3);

    //serialize
    try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(filename))) {
        oos.writeObject(lists);
    } catch (IOException e) {
        e.printStackTrace();
    }
    //don't need to close because ObjectOutputStream implement AutoCloseable interface

    //deserialize
    try (ObjectInputStream oos = new ObjectInputStream(new FileInputStream(filename))) {
        readList = (List<Integer>) oos.readObject();
    } catch (IOException | ClassNotFoundException e) {
        e.printStackTrace();
    }
    //don't need to close because ObjectInputStream implement AutoCloseable interface


    //test
    if(!lists.equals(readList)) {
        System.err.println("error list saved is not the same as the one read");
    }
}

}
person Timo    schedule 11.05.2017
comment
Я попытался использовать этот пример, который вы мне дали. Но это приводит к ошибке в 'out.writeObject(e);' говоря, что это не сериализуемый - person YankeeSierra; 11.05.2017
comment
Ваш объект e реализовал сериализуемый ?? - person Timo; 11.05.2017
comment
Твоя первая реализация с «материальной» работой? Если да, то вам просто нужно читать, а не писать - person Timo; 11.05.2017
comment
Материал работает, поэтому я попробую ваше предложение. В то время, когда вы это писали, я отредактировал свой первый пост с Serializable, который не работает. - person YankeeSierra; 11.05.2017
comment
Спасибо за вашу помощь, я наконец-то заработал, спасибо вам! - person YankeeSierra; 12.05.2017