0

2つのメソッドを作成したいと思います。1つはキャッシュにarraylistを格納し、もう1つはキャッシュから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);
4

3 に答える 3

1

まず、これClassCastExcetionが出力が得られない理由です。コードがファイルに書き込む前に例外がスローされます...

次に、ClassCastException要素が。ではないため、が発生していStringます。理論的には、文字列表現を取得するために呼び出すことができますelement.toString()が、その表現が目的に適していない可能性があります。

では、正しいアプローチは何ですか?

まあそれはのオブジェクトの種類に依存しますlist

  • それらが実装Serializable(またはExternalizable)している場合は、Javaシリアル化を使用できるはずです。詳細については、Javaチュートリアルのこのセクションをお読みください。

  • もう1つのオプションは、POJOをそれぞれXMLとJSONにシリアル化できるJAXPやGSONなどを使用することです。

  • 最後のフォールバックは、シリアル化メソッド(および対応するシリアル化メソッド)を手動でコーディングすることです。


最後に、コード内の他のいくつかのエラーを指摘する必要があります。

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ブロック内のリソースを閉じるか、新しいJava7のtry-with-resource構文を使用することです。

read_to_byte_array4)およびメソッドの名前はwrite_to_byte_array、受け入れられているJavaスタイルガイドラインに違反しています。それらはreadToByteArray(またはさらに良いreadFromByteArray)およびである必要がありwriteToByteArrayます。

于 2012-12-11T14:49:47.377 に答える
0

Rergarding ClassCastException、typeの要素Tがaでない場合String、そのオブジェクトはにキャストできないため、その例外が発生しますString多分あなたは要素toStringのメソッドを探しています。

FileUtilsApacheCommonsのクラスとメソッドも見てくださいwriteLines

于 2012-12-11T14:46:56.100 に答える
0
  1. ArrayListはSerializableを実装しているため、SerializableObjectを使用します。Serializableを実装する必要があります。

  2. あなた自身は、例えば、カスタムデータ型をすることができます:

    長さ|値|長さ|値...

    4bytes | bytes | 4bytes |bytes...。

于 2012-12-11T14:59:03.283 に答える