バイナリファイルを読み取る方法を作成します
-
08-10-2019 - |
質問
バイナリファイルからオブジェクトを読み取るメソッドを書きたいのですが、ジェネリックを使用して一般化したいと思います。
私はこのコードを持っています:
@SuppressWarnings ("unchecked")
public static <T> T readFromBinaryFile (String filename){
T obj = null;
if (FileUtils.existsFile (filename)){
ObjectInputStream ois = null;
try{
ois = new ObjectInputStream (new FileInputStream (filename));
obj = (T)ois.readObject ();
}catch (IOException e){
Debug.out (e);
}catch (ClassNotFoundException e){
Debug.out (e);
}finally{
try{
if (ois != null) ois.close();
}catch (IOException e){
Debug.out (e);
}
}
}
return obj;
}
実行すると、ClassCastExceptionが表示されます。 Javaのテンプレートについては何も知りませんので、情報は繰り返されます。 Erasure、Compile-Time、実行時間に関連するものを読みましたが、なぜこのClassCastExceptionを手に入れたのかよくわかりません。
ありがとう。
編集:私は次のような方法を呼び出します:FileUtils.readFromBinaryFile (filename);
(それなし "")
解決
あなたはあなたの方法を間違っていると呼んでいます。このようにするだけです:
FileUtils.readFromBinaryFile (filename);
あなたが呼んでいるのは、いわゆる一般的な方法です。
「実際のタイプの引数を一般的なメソッドに渡す必要はありません。コンパイラは、実際の引数のタイプに基づいて、私たちのためにタイプの引数を推測します。一般に、コールタイプを作成する最も具体的なタイプの引数を推測します。 -正しい。" ソース
編集:
私はあなたの例を試してみました、そしてそれはうまくいきます(私は実際にいくつかの行をコメントしていました)
private static String filename = "number.serialized";
public static void main(String[] args) {
Double d = 3.14;
writeToBinary(d, filename);
Double readD = readFromBinaryFile(filename);
System.out.println(readD);
}
@SuppressWarnings ("unchecked")
public static <T> T readFromBinaryFile(String filename) {
T obj = null;
File file = new File(filename);
if (file.exists()) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(new FileInputStream(filename));
obj = (T)ois.readObject();
} catch (IOException e) {
} catch (ClassNotFoundException e) {
} finally {
try {
if (ois != null)
ois.close();
} catch (IOException e) {
}
}
}
return obj;
}
public static <T> void writeToBinary(T obj, String filename)
{
try {
FileOutputStream fis = new FileOutputStream(filename);
ObjectOutputStream oos = new ObjectOutputStream(fis);
oos.writeObject(obj);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
他のヒント
Javaにテンプレートはありますか? Tの代わりにオブジェクトを使用するだけです。Javaでは、すべてがベースのオブジェクトから派生しているため、T objではなくオブジェクトobjが必要です。
ClassCastExceptionは、読んだタイプが期待していたタイプと一致しなかったことを意味します(キャストします)。デバッガー(またはログメッセージ)で読んでいるオブジェクトを確認し、期待しているものと比較することをお勧めします。