C.1 java.io.File的替代实现示例
本附录提供了一个简要示例,说明如何指定和实现一个现有类,以便与现有实现进行互操作,但不需要对文件名的表示(作为String)做出相同的假设。
系统类java.io.File
表示文件名,并具有用于解析、操作文件和目录的名称的方法。它有一个包含当前文件名的私有字段。解析路径的方法的语义取决于当前路径分隔符,该分隔符保存在静态字段中。该路径分隔符是文件的序列化状态的一部分,因此在读取文件时可以调整文件名。
File
对象的序列化状态定义为可序列化字段和文件的数据值序列。在这种情况下,每种类型各有一个。
可序列化字段:
String path; // 带有嵌入分隔符的路径名
可序列化数据:
char // 路径名分隔符
替代实现可能定义如下:
class File implements java.io.Serializable {
...
private String[] pathcomponents;
// 使用ObjectStreamClass定义可序列化字段
/**
* @serialField path String
* 由分隔符分隔的路径组件。
*/
private static final ObjectStreamField[] serialPersistentFields
= { new ObjectStreamField("path", String.class) };
...
/**
* @serialData 默认字段,后跟分隔符字符。
*/
private void writeObject(ObjectOutputStream s)
throws IOException
{
ObjectOutputStream.PutField fields = s.putFields();
StringBuffer str = new StringBuffer();
for(int i = 0; i < pathcomponents; i++) {
str.append(separator);
str.append(pathcomponents[i]);
}
fields.put("path", str.toString());
s.writeFields();
s.writeChar(separatorChar); // 添加分隔符字符
}
...
private void readObject(ObjectInputStream s)
throws IOException
{
ObjectInputStream.GetField fields = s.readFields();
String path = (String)fields.get("path", null);
...
char sep = s.readChar(); // 读取先前的分隔符字符
// 使用分隔符将路径解析为组件,并存储到pathcomponents数组中。
}
}