一般从文件中读取

时间:2015-03-18 09:11:58

标签: 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 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需要&#34;弄清楚&#34;应该是什么样的合适类型?文件的大小约为json的一半,但如果大数据的速度要慢得多,我会坚持使用json ......

所以我一般有两个问题: 1)我可以使用typereference作为第二个例子吗? 2)如果不是/是将比第一(其他)类型的读数更快/更慢?

由于

1 个答案:

答案 0 :(得分:0)

您可以通过提供Class<T>这样的对象来绕过警告:

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它的类型是什么。最后它返回Object。目标演员表由开发人员提供。所以我猜没有性能下降。