将ArrayList写入/读取到文件的奇怪问题

时间:2014-02-13 14:12:12

标签: java android file android-activity

我的活动中有这段代码:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_top_jokes_body);

        final GlobalsHolder globals = (GlobalsHolder)getApplication();

        TextView text = (TextView) findViewById(R.id.txtJoke);
        text.setText(globals.getList().get(globals.clickedPosition));

        ArrayList<String> jokeBodyList = new ArrayList<String>();


        jokeBodyList.addAll(readFromFile());
        jokeBodyList.add(text.getText().toString());

        System.out.println("List content(jokeBodyList): " + jokeBodyList.toString());
        writeToFile(jokeBodyList);
        System.out.println("The file content(new)" + readFromFile().toString());

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.top_jokes_body, menu);
        return true;
    }

    /* Write content to a file */
    private void writeToFile(ArrayList<String> list) {

        FileOutputStream fos;
        if(list != null){
        try {
                fos = openFileOutput("jokesBody2.bjk",Context.MODE_PRIVATE);
                ObjectOutputStream out = new ObjectOutputStream(fos);
                out.writeObject(list.toString());
                out.close();
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace(); 
        }
        }else{
            try {
                fos = openFileOutput("jokesBody2.bjk",Context.MODE_PRIVATE);
                ObjectOutputStream out = new ObjectOutputStream(fos);
                out.writeObject("");
                out.close();
        } catch (FileNotFoundException e) {
                e.printStackTrace();
        } catch (IOException e) {
                e.printStackTrace(); 
        }
        }
    }

    /* Read file's content */
    private ArrayList<String> readFromFile() {
        File file = new File("jokesBody.bjk");
        String ret = "";
        ArrayList<String> list = new ArrayList<String>();
        try {
            InputStream inputStream = openFileInput(file.toString());

            if (inputStream != null) {
                InputStreamReader inputStreamReader = new InputStreamReader(
                        inputStream);
                BufferedReader bufferedReader = new BufferedReader(
                        inputStreamReader);
                String receiveString = "";
                StringBuilder stringBuilder = new StringBuilder();

                while ((receiveString = bufferedReader.readLine()) != null) {
                    list.add(receiveString);
                }

                inputStream.close();
                ret = stringBuilder.toString();
            }
        } catch (FileNotFoundException e) {
            Log.e("log activity", "File not found: " + e.toString());
        } catch (IOException e) {
            Log.e("log activity", "Can not read file: " + e.toString());
        }

        return list;
    }

主要思想是将文件的内容传递给ArrayList,然后将另一个值添加到同一个ArrayList,然后将列表写回teh文件。 我正在使用两种方法来读写文件,问题是写入和读取有问题。我的意思是这两张照片

System.out.println("List content(jokeBodyList): " + jokeBodyList.toString());
System.out.println("The file content(new)" + readFromFile().toString());

正在返回一些奇怪的值。这是输出:

02-13 09:10:22.482: I/System.out(2286): List content(jokeBodyList): [����tT[���sr�java.util.ArrayListx����a��I�sizexp���w���, t�����sr�java.util.ArrayListx����a��I�sizexp���w���   t��t��t��t�.joke 13joke 12Joke 8 ,joke 14 ,joke 13 ,Joke 9t� ,Joke 9t� ,Joke 8t�t� ,Ceco's joket�    ,joke 13xt�     ,joke 12x,  ,joke 12], joke 10]
02-13 09:10:22.542: I/System.out(2286): The file content(new)[����tT[���sr�java.util.ArrayListx����a��I�sizexp���w���, t�����sr�java.util.ArrayListx����a��I�sizexp���w���  t��t��t��t�.joke 13joke 12Joke 8 ,joke 14 ,joke 13 ,Joke 9t� ,Joke 9t� ,Joke 8t�t� ,Ceco's joket�    ,joke 13xt�     ,joke 12x,  ,joke 12]]

即使文本文件为空,也会发生这种情况。我错过了什么?我知道它真的很小,但我找不到它。

1 个答案:

答案 0 :(得分:3)

out.writeObject(list.toString());完全错了! 使用out.writeObject(list);这是ObjectOutputStream的用途。

阅读是另一种方式:

ObjectInputStream ois = new ObjectInputStream( new FileInputStream( file ) );
yourArrayList = (ArrayList)ois.readObject();
ois.close();