RCP 中编辑器操作的文件以二进制格式保存。 一般自定义编辑器操作的文件都有特殊的格式,操作这些文件通常需要打开编辑器来进行。假如遇到不想打开编辑器而修改RCP 系统中的一些特定文件,解决方案如下:
- 加载文件为编辑器编辑的文件模型对象
- 通过修改对象属性修改相对应的文件。(一般文件数据与模型数据一一对应)
- 将修改后的对象保存都原来的文件。
注意:模型对象必须实现序列化接口
读
加载文件为编辑器相对应的模型对象,这些对象都是实现了序列化接口的。
public static <T> T loadModelFromFile(String fileName, Class<T> tClazz) {
try {
IFile file = getWorkSpaceFile(fileName);
InputStream inStream = file.getContents(true);
return loadModelFromStream(inStream, tClazz);
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
public static <T> T loadModelFromStream(InputStream inStream, Class<T> tClazz) {
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(inStream);
Object obj = ois.readObject();
if (obj.getClass() == tClazz) {
return (T) obj;
}else {
System.out.println("######### 加载文件转对象失败 #########");
System.out.println("系统加载到的文件是:" + obj.getClass() + " 对象");
System.out.println("您希望的对象是:" + tClazz + " 对象");
}
return null;
} catch (Exception e) {
e.printStackTrace();
return null;
} finally {
if (Objects.nonNull(ois)) {
try {
ois.close();
inStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
写
以二进制的形式将对象写回原来的文件。
public static void saveBinaryFileFromObject(IPath fullPath, Object obj) {
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(obj);
oos.flush();
IPath locationPath = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(fullPath);
bos.writeTo(new FileOutputStream(locationPath.toFile()));
bos.flush();
} catch (IOException e) {
e.printStackTrace();
LogUtil.error("对象转换成二级制数据失败");
} finally {
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
特别解释: 写文件时,要使用操作系统路径(操作系统路径与Eclipse插件维护的路径不同),不然会报错。
IPath locationPath = ResourcesPlugin.getWorkspace().getRoot().getLocation().append(fullPath);
ResourcesPlugin.getWorkspace().getRoot() 获取工作空间的相对路径,该路径是Eclipse 插件维护的。ResourcesPlugin.getWorkspace().getRoot().getLocation() 获取到的工作空间在本地操作系统的真实路径。ResourcesPlugin.getWorkspace().getRoot().getLocation().append(fullPath) 获取文件在操作系统中的路径(工作空间操作系统路径 + 文件相对路径),其中FullPath 为文件Eclipse 插件路径。
|