将arraylist保存到缓存文件并检索它

时间:2012-12-11 14:35:13

标签: java android

我想创建两个方法。一个应该存储和arraylist到缓存,另一个应该从缓存中检索arraylist。我尝试过的代码如下:

public class ByteConverter<T> {

public byte[] write_to_byte_array(ArrayList<T> list,File file){

    // write to byte array
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(file);
    } catch (FileNotFoundException e1) {
        Log.d("file not found", "file not found", e1);
    }

    ByteArrayOutputStream baos = new ByteArrayOutputStream();
    DataOutputStream out = new DataOutputStream(baos);
    for (T element : list) {
        try {
            out.writeUTF((String) element);
        } catch (IOException e) {
            Log.d("Error converting List to byte array", "Error converting List to byte array", e);
        }
    }

    byte[] bytes = baos.toByteArray();

    int len1 = 0;
    while (len1 < bytes.length) {
        try {
            fos.write(bytes, 0, len1);
            len1++;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    try {
        fos.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

    return bytes;

}

public String read_to_byte_array(byte[] bytes) throws IOException{

    // read from byte array
    String element = null;
    ByteArrayInputStream bais = new ByteArrayInputStream(bytes);
    DataInputStream in = new DataInputStream(bais);
    while (in.available() > 0) {
        element = in.readUTF();
    }

    return element; 
}

  }

但是上述方法不会向文件写入任何内容。我不知道为什么。谁能帮我?另外我在这一行接受了ClassCastException:

       out.writeUTF((String) element);

3 个答案:

答案 0 :(得分:1)

首先,ClassCastExcetion原因您没有获得任何输出。在代码写入文件之前抛出异常......

其次,ClassCastException正在发生,因为该元素不是String。从理论上讲,您可以调用element.toString()来获取字符串表示形式,但很可能该表示形式不适合您的目的。

那么正确的方法是什么?

这取决于list中对象的类型。

  • 如果他们实现Serializable(或Externalizable),那么您应该能够使用Java序列化。阅读Java教程的this section以获取更多详细信息。

  • 另一个选择可能是使用类似JAXP或GSON的东西,它们可以分别将POJO序列化为XML和JSON。

  • 最后的回退是手工编写序列化方法(以及相应的序列化方法)。


最后,我应该在代码中指出其他一些错误:

1)此代码错误:

int len1 = 0;
while (len1 < bytes.length) {
   fos.write(bytes, 0, len1);
   len1++;
}

这将写:

bytes[0]
bytes[0], bytes[1]
bytes[0], bytes[1], bytes[2]

   and so on.  

编写bytes的正确方法是:

fos.write(bytes);

fos.write(bytes, 0 bytes.length);

2)您的异常处理逻辑不正确。在3或4个地方你会发现异常,打印或记录某些东西...... 然后继续,好像什么都没有出错。您应该做的是让异常传播,并在更高级别处理它们。

3)如果write_to_byte_array方法出现问题,可能会泄漏文件描述符。最佳做法是关闭finally块中的资源,或使用新的Java 7 try-with-resource语法。

4)read_to_byte_arraywrite_to_byte_array方法的名称违反了公认的Java风格指南。它们应为readToByteArray(或更好的readFromByteArray)和writeToByteArray

答案 1 :(得分:0)

Rergarding ClassCastException,如果T类型的元素不是String,您将获得该异常,因为该对象无法转换为{{1 }}。也许您正在寻找元素String方法。

另请查看Apache Commons的toString类和方法writeLines

答案 2 :(得分:0)

  1. 使用Serializable Object,因为ArrayList实现Serializable,必须实现Serializable。

  2. 您自己可以自定义数据类型,例如:

    长度|值|长度|值....

    4字节|字节| 4字节|字节....