文件

时间:2017-05-11 13:08:20

标签: java android fileinputstream serializable

我在阅读文件时遇到的输入存在问题。

该文件是在另一个活动中制作的,非常简单:

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.csvsrjava.util.ArrayListxaIsizexp WT1
  2
  3×

我做错了什么? 。

修改
我按照以下建议尝试了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);会出错,说明这不是可序列化的

1 个答案:

答案 0 :(得分: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文件,你必须通过对你的数组进行迭代来构建它,并逐个写入文件中的值并添加分隔符或关注这个 How to serialize object to CSV file?

编辑: 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");
    }
}

}