0

我想创建两种方法。一个应该将数组列表存储到缓存中,另一个应该从缓存中检索数组列表。我尝试过的代码如下:

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);
4

3 回答 3

1

首先,这ClassCastExcetion是您没有得到任何输出的原因。在您的代码写入文件之前引发异常...

其次,ClassCastException发生这种情况是因为元素不是String. 理论上,您可以调用element.toString()以获得字符串表示,但该表示可能不适合您的目的。

那么正确的做法是什么?

好吧,这取决于list.

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

  • 另一种选择可能是使用 JAXP 或 GS​​ON 之类的东西,它们可以分别将 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.

于 2012-12-11T14:49:47.377 回答
0

Rergarding ClassCastException,如果元素类型T不是 aString您将得到该异常,因为该对象不能被强制转换为String. 也许您正在寻找elementtoString的方法。

也看看FileUtilsApache Commons 的类和方法writeLines

于 2012-12-11T14:46:56.100 回答
0
  1. 使用 Serializable Object ,因为 ArrayList 实现了 Serializable ,所以必须实现 Serializable 。

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

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

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

于 2012-12-11T14:59:03.283 回答