Написание метода для чтения двоичного файла

StackOverflow https://stackoverflow.com/questions/4631023

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

}

Когда я выполняю это, я получаю классноеexception. Я ничего не знаю о шаблонах в Java, поэтому любая информация будет целенаправлена. Я прочитал что-то, связанное с стиранием, время компиляции и время исполнения, но я не очень хорошо понимаю, почему я получаю этот класс.

Спасибо.

Редактировать: Я называю методом, как это: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 означает, что тип, который вы читаете, не соответствует типу, который вы ожидали (и отбрасываете), я предлагаю увидеть, какой объект вы читаете в отладчике (или сообщение журнала), и сравните его с тем, что вы ожидаете.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top