RCP
中编辑器操作的文件以二进制格式保存。
一般自定义编辑器操作的文件都有特殊的格式,操作这些文件通常需要打开编辑器来进行。假如遇到不想打开编辑器而修改RCP
系统中的一些特定文件,解决方案如下:
- 加载文件为编辑器编辑的文件模型对象
- 通过修改对象属性修改相对应的文件。(一般文件数据与模型数据一一对应)
- 将修改后的对象保存都原来的文件。
注意:模型对象必须实现序列化接口
读
加载文件为编辑器相对应的模型对象,这些对象都是实现了序列化接口的。
/**
* 将文件装载为模型
*
* @param <T> 目标模型
* @param fileName
* @param clazz
* @return
* @throws Exception
*/
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;
}
}
/**
* 将模型流转为模型
*
* @param <T> 目标模型
* @param inStream
* @param clazz
* @return
* @throws IOException
* @throws ClassNotFoundException
*/
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) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
写
以二进制的形式将对象写回原来的文件。
/**
* save file from object as binary format
* <p>
* 以二进制的形式将对象保存为文件
* </P>
* <p><code>obj</code> 必须实现 <code>Serializable</code>接口</p>
* @param fullPath
* @param obj 自定义对象
*/
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
插件路径。