Java 写入读取二进制文件的方法

Java 写入读取二进制文件的方法,java,classcastexception,Java,Classcastexception,我想写一个从二进制文件中读取对象的方法,但我想使用泛型对其进行泛化 我有以下代码: @SuppressWarnings ("unchecked") public static <T> T readFromBinaryFile (String filename){ T obj = null; if (FileUtils.existsFile (filename)){ ObjectInputStream ois = null; try{ ois = ne

我想写一个从二进制文件中读取对象的方法,但我想使用泛型对其进行泛化

我有以下代码:

@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;

}
@SuppressWarnings(“未选中”)
公共静态T readFromBinaryFile(字符串文件名){
T obj=null;
if(FileUtils.existsFile(filename)){
ObjectInputStream ois=null;
试一试{
ois=新对象输入流(新文件输入流(文件名));
obj=(T)ois.readObject();
}捕获(IOE异常){
调试输出(e);
}catch(classnotfounde异常){
调试输出(e);
}最后{
试一试{
如果(ois!=null)ois.close();
}捕获(IOE异常){
调试输出(e);
}
}
}
返回obj;
}
当我执行它时,我得到一个ClassCastException。我对java中的模板一无所知,因此任何信息都将受到重视。我读过一些关于擦除、编译时间和执行时间的文章,但我不太明白为什么会有这个ClassCastException

谢谢

编辑:我这样调用该方法:
FileUtils.readFromBinaryFile(文件名)(不带“”)

Java中有模板吗?只需使用Object而不是T。在Java中,所有内容都是从基对象派生的,因此您不需要T obj而是Object obj。

Java中有模板吗?只需使用Object而不是T。在Java中,所有内容都是从基对象派生的,因此您不需要T obj而是Object obj。

ClassCastException意味着您读取的类型与您期望的类型(并转换为)不匹配。我建议您在调试器(或日志消息)中查看要读取的对象并将其与您所期望的进行比较

ClassCastException表示您读取的类型与您期望的类型(并转换为)不匹配。我建议您查看在调试器(或日志消息)中读取的对象,并将其与您期望的对象进行比较

您将您的方法称为错误的。 就这样做吧:

FileUtils.readFromBinaryFile (filename); 
您调用的是所谓的泛型方法

我们不必将实际的类型参数传递给泛型方法。编译器会根据实际参数的类型为我们推断类型参数。它通常会推断出使调用类型正确的最具体的类型参数

编辑:

我试过你的例子,它是有效的(我实际上评论了一些行)

私有静态字符串filename=“number.serialized”;
公共静态void main(字符串[]args){
双d=3.14;
writeToBinary(d,文件名);
Double readD=readFromBinaryFile(文件名);
System.out.println(readD);
}
@抑制警告(“未选中”)
公共静态T readFromBinaryFile(字符串文件名){
T obj=null;
文件=新文件(文件名);
if(file.exists()){
ObjectInputStream ois=null;
试一试{
ois=新对象输入流(新文件输入流(文件名));
obj=(T)ois.readObject();
}捕获(IOE异常){
}catch(classnotfounde异常){
}最后{
试一试{
如果(ois!=null)
ois.close();
}捕获(IOE异常){
}
}
}
返回obj;
}
公共静态void writeToBinary(T obj,字符串文件名)
{
试一试{
FileOutputStream fis=新的FileOutputStream(文件名);
ObjectOutputStream oos=新的ObjectOutputStream(fis);
oos.writeObject(obj);
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
} 
}

您调用的方法错误。 就这样做吧:

FileUtils.readFromBinaryFile (filename); 
您调用的是所谓的泛型方法

我们不必将实际的类型参数传递给泛型方法。编译器会根据实际参数的类型为我们推断类型参数。它通常会推断出使调用类型正确的最具体的类型参数

编辑:

我试过你的例子,它是有效的(我实际上评论了一些行)

私有静态字符串filename=“number.serialized”;
公共静态void main(字符串[]args){
双d=3.14;
writeToBinary(d,文件名);
Double readD=readFromBinaryFile(文件名);
System.out.println(readD);
}
@抑制警告(“未选中”)
公共静态T readFromBinaryFile(字符串文件名){
T obj=null;
文件=新文件(文件名);
if(file.exists()){
ObjectInputStream ois=null;
试一试{
ois=新对象输入流(新文件输入流(文件名));
obj=(T)ois.readObject();
}捕获(IOE异常){
}catch(classnotfounde异常){
}最后{
试一试{
如果(ois!=null)
ois.close();
}捕获(IOE异常){
}
}
}
返回obj;
}
公共静态void writeToBinary(T obj,字符串文件名)
{
试一试{
FileOutputStream fis=新的FileOutputStream(文件名);
ObjectOutputStream oos=新的ObjectOutputStream(fis);
oos.writeObject(obj);
}catch(filenotfounde异常){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
} 
}

Ok,Java中有模板,但它们使用,就像在公共静态输入两次(T值)中一样,也许你指的是与C++中的模板不同的泛型Ok,Java中有模板,但它们使用,就像在公共静态输入两次(T值)中一样,也许你指的是与C++中的模板不同的泛型我想读的对象Ok。如果我通过MyObject(保存到文件previou的对象)更改T