在我们写app时,经常要访问服务器去拉取服务器的数据,然后做本地缓存,这样只要服务器端的数据没有更新,我们的APP就没有必要去每次都发送请求,只要从缓存的本地文件中读取出来,正确的做解析即可。
在公司最近的项目中,主要是要缓存一些目录数据,因为这些数据是不怎么变化的,不必每次都去发请求,有了这个需求后,我就开始准备缓存服务器返回来的Json数据,可后来注意到程序中接收到服务器的响应后已经将Json解析为了对象,这种情况下我就不可以将Json存到文件中去了,只能是将对象存到文件中去,于是就研究了一下Java如何将对象写入到文件中去,发现写对象到文件中与写字符串到文件基本上是一样的。
下面是我写的一个存储对象和读取对象的demo:
package com.example.objectwriterdemo;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
public class MainActivity extends Activity
{
private Student student;
private Student stu1;
private File sdCardDir;
private File sdFile;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initData();
readyToWriter();
readyToReader();
}
private void initData()
{
student = new Student();
student.name = "rzq";
student.sex = "male";
}
private void readyToWriter()
{
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
sdCardDir = Environment.getExternalStorageDirectory();
sdFile = new File(sdCardDir, "student.out");
try
{
FileOutputStream fos = new FileOutputStream(sdFile);
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(student);
fos.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
private void readyToReader()
{
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
{
try
{
FileInputStream fis = new FileInputStream(sdFile);
ObjectInputStream ois = new ObjectInputStream(fis);
stu1 = (Student) ois.readObject();
fis.close();
}
catch (Exception e)
{
e.printStackTrace();
}
}
Log.e("=========", stu1.name);
}
}
解释一下: FileInputStream,FileOutputStream是文件输入,输出流,是字节流,同时也是结点流,只有结点流是可以直接指向到具体的文件的,而ObjectInputStream,ObjectOutputStream是对象流,同时也是处理流,处理流是不能直接指向到最络要输入输出的文件的,它们只能指向到结点流,所以我们要先创建好结点流,然后将对象流指向到这些结点流上,就可能通过处理流去处理对象的输入与输出了。