Java 一般地从文件中读取
我正在尝试快速读取文件。我以前使用JSON格式,但后来我使用二进制文件减小了文件大小。我就是搞不懂如何从文件中使用泛型读取 对于JSON,我使用了TypeReferenceJava 一般地从文件中读取,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
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提供它