Java 一般地从文件中读取

Java 一般地从文件中读取,java,file,generics,serialization,Java,File,Generics,Serialization,我正在尝试快速读取文件。我以前使用JSON格式,但后来我使用二进制文件减小了文件大小。我就是搞不懂如何从文件中使用泛型读取 对于JSON,我使用了TypeReference public <T> T read(final TypeReference<T> type, String path, String fileName) { T data = null; try { checkDir(path); String pat

我正在尝试快速读取文件。我以前使用JSON格式,但后来我使用二进制文件减小了文件大小。我就是搞不懂如何从文件中使用泛型读取

对于JSON,我使用了TypeReference

public <T> T read(final TypeReference<T> type, String path, String fileName) {
    T data = null;

    try {
        checkDir(path);
        String pathAll = homePath + path + "/" + fileName;

        data = new ObjectMapper().readValue(new File(pathAll), type);

    } catch (JsonGenerationException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return data;
}
但对于二进制文件,我找不到类似的东西。所以我就用了这个警告

@SuppressWarnings("unchecked")
public <T> T readSerializable(String path, String fileName) {
    Object data = null;
    checkDir(path);
    String pathAll = homePath + path + "/" + fileName;

    ObjectInputStream inputStream = null;
    try {
        inputStream = new ObjectInputStream(new FileInputStream(pathAll));
        data = inputStream.readObject();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } finally {
        if (inputStream != null) {
            try {
                inputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    return (T) data;
}
有没有办法也使用typereference来读取二进制文件?或者我应该给它留个警告,但它不是比使用JSON慢吗,因为Java需要弄清楚它应该是什么类型?文件的大小大约是json的一半,但如果大数据的速度明显变慢,我还是会坚持使用json

因此,我一般有两个问题: 我可以用typereference作为第二个例子吗? 2如果不是/是,那会比第一种其他类型的阅读更快/更慢吗


谢谢

您可以通过提供如下类对象绕过警告:

public <T extends Serializable> T readSerializable(String path, Class<T> clazz) {
    ObjectInputStream is = null;
    try {
        is = new ObjectInputStream(new FileInputStream(path));
        return clazz.cast(is.readObject());
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        if (is != null) {
            try {
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    return null;
}

我不认为ObjectOutputStream是什么类型的。最后它返回一个对象。目标cast由开发人员提供。因此,我想不会有性能下降。

谢谢,我知道这一点,这就是为什么我试图得到T的类型引用,而不仅仅是T。谢谢。有什么更好的选择,只需使用User.class调用方法,或者在那里创建TypeReference?实际上,这两者之间有什么区别吗?我认为您会很好地使用User.class,因为您只需以字节流的形式读取对象,然后将其强制转换为您想要的内容。它也适用于泛型。例如:您可以序列化C,反序列化后,如果删除约束,您将得到C或C,但您可以将其强制转换为C。在JSON情况下,它是不同的,因为解组器创建对象的实例,然后设置其属性。但是,由于类型擦除,内部类型在运行时不可用,因此必须使用TypeReference提供它