Написание метода для чтения двоичного файла - PullRequest
0 голосов
/ 08 января 2011

Я хочу написать метод, который читает объект из двоичного файла, но я хочу обобщить его, используя обобщенные значения.

У меня есть этот код:

@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, поэтому любая информация будет оценена.Я прочитал кое-что, связанное с стиранием, временем компиляции и временем выполнения, но я не очень хорошо понимаю, почему я получаю это ClassCastException.

Спасибо.

РЕДАКТИРОВАТЬ: я вызываю методкак это: FileUtils.readFromBinaryFile (filename); (без "")

Ответы [ 3 ]

2 голосов
/ 08 января 2011

ClassCastException означает, что тип, который вы прочитали, не соответствовал ожидаемому вами типу (и приведен к). Я предлагаю вам посмотреть, какой объект вы читаете в отладчике (или в журнале сообщений), и сравнить его с тем, что вы ожидаете. ,

2 голосов
/ 08 января 2011

Есть ли шаблоны в Java?Просто используйте Object вместо T. В Java все происходит от Object в основе, поэтому вам не нужен T obj, а Object obj.

1 голос
/ 08 января 2011

Вы неправильно называете свой метод. Просто сделай это так:

FileUtils.readFromBinaryFile (filename); 

То, что вы называете, это так называемый универсальный метод.

"Нам не нужно передавать фактический аргумент типа универсальному методу. Компилятор выводит нам аргумент типа на основе типов фактических аргументов. Обычно он выводит наиболее конкретный аргумент типа это сделает тип вызова правильным. " source

EDIT:

Я попробовал ваш пример, и он работает (я действительно прокомментировал некоторые строки)

    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();
        } 
    }
...