Рано или поздно, но все разработчики под Android придут к необходимости хранить данные.
Вот и я при разработке очередной программы задался целью сделать универсальный класс, который поможет мне сохранять и извлекать данные.
Первое с чего мы начнем это с создания собственно класса. Он должен наследоваться от класса Serializable.
public class SerializableClass implements Serializable{
//Здесь мы перечисляем все поля, которые хотим хранить.
public boolean field1;
public String field2;
...........
Далее создадим конструктор этого класса:
public SerializableClass(boolean field1, String field2){
this.field1 = field1 ;
this.field2 = field2 ;
}
Затем идут статические методы которые преобразуют класс в массив байт и обратно соответственно:
public static byte[] serializeObject(SerializableClass o) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(o);
out.close();
byte[] buf = bos.toByteArray();
return buf;
} catch(IOException ioe) {
Log.e("serializeObject", "error", ioe);
return null;
}
}
public static SerializableClass deserializeObject(byte[] b) {
if(b==null) return null;
try {
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));
Object object = in.readObject();
in.close();
return (SerializableClass)object;
} catch(ClassNotFoundException cnfe) {
Log.e("deserializeObject", "class not found error", cnfe);
return null;
} catch(IOException ioe) {
Log.e("deserializeObject", "io error", ioe);
return null;
}
}
Но это еще не все. Нам необходимо сохранить массив байт и загрузить его. Для этого предназначены следующие два статических метода:
public static void SaveBytes(Context context, String filename, byte[] data){
File file = new File(filename);
if(file.exists()) file.delete();
try {
FileOutputStream fos = context.openFileOutput(filename, 0);
fos.write(data);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static byte[] LoadBytes(Context context, String filename){
byte[] buffer = null;
try {
FileInputStream fis = context.openFileInput(filename);
buffer = new byte[(int) fis.getChannel().size()];
fis.read(buffer);
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer;
}
Вот и весь класс. Чтобы использовать его просто вызовите его методы в какой-либо функции.
Загрузка данных:
private void LoadData(){
byte[] b = SerializableClass.LoadBytes(this,PATH);
SerializableClass serializable = SerializableClass.deserializeObject(b);
if(serializable!=null){
System.out.println(serializable.field1);
System.out.println(serializable.field2);
}
}
Сохранение данных:
private void SaveData(){
SerializableClass serializable = new SerializableClass(true, "Hello world!!!");
SerializableClass.SaveBytes(this, PATH,
SerializableClass.serializeObject(serializable));
}
Полный код класса:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import android.content.Context;
import android.util.Log;
public class SerializableClass implements Serializable{
public boolean field1;
public String field2;
public SerializableClass(boolean field1, String field2){
this.field1 = field1 ;
this.field2 = field2 ;
}
public static SerializableClass deserializeObject(byte[] b) {
if(b==null) return null;
try {
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));
Object object = in.readObject();
in.close();
return (SerializableClass)object;
} catch(ClassNotFoundException cnfe) {
Log.e("deserializeObject", "class not found error", cnfe);
return null;
} catch(IOException ioe) {
Log.e("deserializeObject", "io error", ioe);
return null;
}
}
public static byte[] serializeObject(SerializableClass o) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(o);
out.close();
// Get the bytes of the serialized object
byte[] buf = bos.toByteArray();
return buf;
} catch(IOException ioe) {
Log.e("serializeObject", "error", ioe);
return null;
}
}
public static byte[] LoadBytes(Context context, String filename){
byte[] buffer = null;
try {
FileInputStream fis = context.openFileInput(filename);
buffer = new byte[(int) fis.getChannel().size()];
fis.read(buffer);
fis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return buffer;
}
public static void SaveBytes(Context context, String filename, byte[] data){
File file = new File(filename);
if(file.exists()) file.delete();
try {
FileOutputStream fos = context.openFileOutput(filename, 0);
fos.write(data);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Вот и я при разработке очередной программы задался целью сделать универсальный класс, который поможет мне сохранять и извлекать данные.
Первое с чего мы начнем это с создания собственно класса. Он должен наследоваться от класса Serializable.
public class SerializableClass implements Serializable{
//Здесь мы перечисляем все поля, которые хотим хранить.
public boolean field1;
public String field2;
...........
Далее создадим конструктор этого класса:
public SerializableClass(boolean field1, String field2){
this.field1 = field1 ;
this.field2 = field2 ;
}
Затем идут статические методы которые преобразуют класс в массив байт и обратно соответственно:
public static byte[] serializeObject(SerializableClass o) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(o);
out.close();
byte[] buf = bos.toByteArray();
return buf;
} catch(IOException ioe) {
Log.e("serializeObject", "error", ioe);
return null;
}
}
public static SerializableClass deserializeObject(byte[] b) {
if(b==null) return null;
try {
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));
Object object = in.readObject();
in.close();
return (SerializableClass)object;
} catch(ClassNotFoundException cnfe) {
Log.e("deserializeObject", "class not found error", cnfe);
return null;
} catch(IOException ioe) {
Log.e("deserializeObject", "io error", ioe);
return null;
}
}
Но это еще не все. Нам необходимо сохранить массив байт и загрузить его. Для этого предназначены следующие два статических метода:
public static void SaveBytes(Context context, String filename, byte[] data){
File file = new File(filename);
if(file.exists()) file.delete();
try {
FileOutputStream fos = context.openFileOutput(filename, 0);
fos.write(data);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
public static byte[] LoadBytes(Context context, String filename){
byte[] buffer = null;
try {
FileInputStream fis = context.openFileInput(filename);
buffer = new byte[(int) fis.getChannel().size()];
fis.read(buffer);
fis.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return buffer;
}
Вот и весь класс. Чтобы использовать его просто вызовите его методы в какой-либо функции.
Загрузка данных:
private void LoadData(){
byte[] b = SerializableClass.LoadBytes(this,PATH);
SerializableClass serializable = SerializableClass.deserializeObject(b);
if(serializable!=null){
System.out.println(serializable.field1);
System.out.println(serializable.field2);
}
}
Сохранение данных:
private void SaveData(){
SerializableClass serializable = new SerializableClass(true, "Hello world!!!");
SerializableClass.SaveBytes(this, PATH,
SerializableClass.serializeObject(serializable));
}
Полный код класса:
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutput;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import android.content.Context;
import android.util.Log;
public class SerializableClass implements Serializable{
public boolean field1;
public String field2;
public SerializableClass(boolean field1, String field2){
this.field1 = field1 ;
this.field2 = field2 ;
}
public static SerializableClass deserializeObject(byte[] b) {
if(b==null) return null;
try {
ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(b));
Object object = in.readObject();
in.close();
return (SerializableClass)object;
} catch(ClassNotFoundException cnfe) {
Log.e("deserializeObject", "class not found error", cnfe);
return null;
} catch(IOException ioe) {
Log.e("deserializeObject", "io error", ioe);
return null;
}
}
public static byte[] serializeObject(SerializableClass o) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
try {
ObjectOutput out = new ObjectOutputStream(bos);
out.writeObject(o);
out.close();
// Get the bytes of the serialized object
byte[] buf = bos.toByteArray();
return buf;
} catch(IOException ioe) {
Log.e("serializeObject", "error", ioe);
return null;
}
}
public static byte[] LoadBytes(Context context, String filename){
byte[] buffer = null;
try {
FileInputStream fis = context.openFileInput(filename);
buffer = new byte[(int) fis.getChannel().size()];
fis.read(buffer);
fis.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return buffer;
}
public static void SaveBytes(Context context, String filename, byte[] data){
File file = new File(filename);
if(file.exists()) file.delete();
try {
FileOutputStream fos = context.openFileOutput(filename, 0);
fos.write(data);
fos.flush();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Надеюсь он Вам пригодиться и сэкономит Ваше время!
Комментариев нет:
Отправить комментарий