четверг, 12 января 2012 г.

Сохранение и загрузка данных

Рано или поздно, но все разработчики под 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();
}  
}
}

Надеюсь он Вам пригодиться и сэкономит Ваше время!


Комментариев нет:

Отправить комментарий