public abstract class AbstractPreferences extends Preferences
Preferences
类,大大简化了实现的任务。
这个类只适用于Preferences的实现者。 Preferences工厂的普通用户不需要参考本文档。 Preferences
文档应该足够了。
实现者必须重写九个抽象服务提供者接口(SPI)方法: getSpi(String)
, putSpi(String,String)
, removeSpi(String)
, childSpi(String)
, removeNodeSpi()
, keysSpi()
, childrenNamesSpi()
, syncSpi()
和flushSpi()
。 所有具体的方法都精确地指定了如何在这些SPI方法之上实现它们。 如果默认实现由于任何原因(例如性能)而不能令人满意,则实施者可以自行决定覆盖一个或多个具体方法。
SPI方法分为三组关于异常行为。 getSpi方法不应该抛出异常,但并不重要,因为此方法抛出的任何异常将被get(String,String)
截取 ,这将返回给调用者指定的默认值。 removeNodeSpi, keysSpi, childrenNamesSpi, syncSpi和flushSpi方法被指定为抛出BackingStoreException
,并且如果无法执行该操作,则需要执行该抛出异常。 该异常向外传播,导致相应的API方法失败。
其余的SPI方法putSpi(String,String)
, removeSpi(String)
和childSpi(String)
有更复杂的异常行为。 他们没有指定扔BackingStoreException ,因为他们通常可以服从他们的合同,即使后备店不可用。 这是真的,因为他们没有返回任何信息,并且它们的影响不需要永久性,直到后来调用Preferences.flush()
或Preferences.sync()
。 一般来说,这些SPI方法不应该抛出异常。 在一些实现中,可能存在这样的情况,这些呼叫甚至不能排队所请求的操作以供稍后处理。 即使在这种情况下,通常最好简单地忽略调用和返回,而不是抛出异常。 在这种情况下,然而,flush()和sync所有后续调用应该返回false,为返回true将意味着以前的所有操作都成功地成为永久性。
有一种情况下, putSpi, removeSpi and childSpi 应该抛出异常:如果调用者对底层操作系统没有足够的权限来执行请求的操作。 例如,如果非特权用户尝试修改系统首选项,这将在大多数系统上发生。 (所需的权限将从实现到实现有所不同,在某些实现中,它们是修改文件系统中某些目录的内容的权利;在其他实现中,它们是修改注册表中某些密钥的内容的权利。)在任何在这种情况下,通常不宜让程序继续执行,就好像这些操作将在以后永久存在一样。 虽然在这种情况下实现不需要抛出异常,但是鼓励它们这样做。 A SecurityException
将是适当的。
大多数SPI方法需要实现在首选节点读取或写入信息。 实施者应该注意,另一个VM可能同时从后备存储中删除该节点。 重新创建节点(如果已被删除)的实施是有责任的。
实现说明:在Sun的默认Preferences实现中,用户的身份从底层操作系统继承,并且在虚拟机的生命周期内不会更改。 应当认识到,服务器端Preferences实现可能具有从请求到请求的用户身份变化,通过使用静态ThreadLocal
实例隐含地传递给Preferences方法。 强烈鼓励这种实现的作者在访问偏好时(例如通过get(String,String)
或put(String,String)
方法)来确定用户,而不是将用户永久关联到每个Preferences实例。 后一种行为与正常Preferences的使用冲突 ,会导致很大的混乱。
Preferences
Modifier and Type | Field and Description |
---|---|
protected Object |
lock
监视器用于锁定此节点的对象。
|
protected boolean |
newNode
如果此节点在创建此对象之前在后台存储中不存在,则此字段应为
true 。
|
MAX_KEY_LENGTH, MAX_NAME_LENGTH, MAX_VALUE_LENGTH
Modifier | Constructor and Description |
---|---|
protected |
AbstractPreferences(AbstractPreferences parent, String name)
创建具有指定父项和相对于其父对象的指定名称的首选项节点。
|
Modifier and Type | Method and Description |
---|---|
String |
absolutePath()
实现
absolutePath方法按照在本说明书中
Preferences.absolutePath() 。
|
void |
addNodeChangeListener(NodeChangeListener ncl)
注册指定的侦听器以接收该节点的
节点更改事件 。
|
void |
addPreferenceChangeListener(PreferenceChangeListener pcl)
注册指定的侦听器以接收此首选项节点的
优先级更改事件 。
|
protected AbstractPreferences[] |
cachedChildren()
返回此节点的所有已知未被删除的子节点。
|
String[] |
childrenNames()
实现
children方法按照在本说明书中
Preferences.childrenNames() 。
|
protected abstract String[] |
childrenNamesSpi()
返回此首选项节点的子节点的名称。
|
protected abstract AbstractPreferences |
childSpi(String name)
返回此首选项节点的命名子节点,如果它不存在则创建它。
|
void |
clear()
实现
clear方法按照在本说明书中
Preferences.clear() 。
|
void |
exportNode(OutputStream os)
实现
exportNode方法按照在本说明书中
Preferences.exportNode(OutputStream) 。
|
void |
exportSubtree(OutputStream os)
实现
exportSubtree方法按照在本说明书中
Preferences.exportSubtree(OutputStream) 。
|
void |
flush()
实现
flush方法按照在本说明书中
Preferences.flush() 。
|
protected abstract void |
flushSpi()
此方法在此节点锁定时被调用。
|
String |
get(String key, String def)
实现
get方法按照在本说明书中
Preferences.get(String,String) 。
|
boolean |
getBoolean(String key, boolean def)
实现
getBoolean方法按照在本说明书中
Preferences.getBoolean(String,boolean) 。
|
byte[] |
getByteArray(String key, byte[] def)
实现
getByteArray方法按照在本说明书中
Preferences.getByteArray(String,byte[]) 。
|
protected AbstractPreferences |
getChild(String nodeName)
如果命名的子项存在,则返回它,否则
返回null 。
|
double |
getDouble(String key, double def)
实现
getDouble方法按照在本说明书中
Preferences.getDouble(String,double) 。
|
float |
getFloat(String key, float def)
实现
getFloat方法按照在本说明书中
Preferences.getFloat(String,float) 。
|
int |
getInt(String key, int def)
实现
getInt方法按照在本说明书中
Preferences.getInt(String,int) 。
|
long |
getLong(String key, long def)
实现
getLong方法按照在本说明书中
Preferences.getLong(String,long) 。
|
protected abstract String |
getSpi(String key)
返回与此首选项节点上的指定键或
null相关联的值,如果没有关联此键,或不能在这个时间来确定所述关联。
|
protected boolean |
isRemoved()
返回
true如果此节点(或其祖先)已经被除去的
removeNode() 方法。
|
boolean |
isUserNode()
实现
isUserNode方法按照在本说明书中
Preferences.isUserNode() 。
|
String[] |
keys()
实现
keys方法按照在本说明书中
Preferences.keys() 。
|
protected abstract String[] |
keysSpi()
返回在此首选项节点中具有关联值的所有键。
|
String |
name()
实现
name方法按照在本说明书中
Preferences.name() 。
|
Preferences |
node(String path)
实现
node方法按照在本说明书中
Preferences.node(String) 。
|
boolean |
nodeExists(String path)
实现
nodeExists方法按照在本说明书中
Preferences.nodeExists(String) 。
|
Preferences |
parent()
实现
parent方法按照在本说明书中
Preferences.parent() 。
|
void |
put(String key, String value)
实现
put方法按照在本说明书中
Preferences.put(String,String) 。
|
void |
putBoolean(String key, boolean value)
实现
putBoolean方法按照在本说明书中
Preferences.putBoolean(String,boolean) 。
|
void |
putByteArray(String key, byte[] value)
实现
putByteArray方法按照在本说明书中
Preferences.putByteArray(String,byte[]) 。
|
void |
putDouble(String key, double value)
实现
putDouble方法按照在本说明书中
Preferences.putDouble(String,double) 。
|
void |
putFloat(String key, float value)
实现
putFloat方法按照在本说明书中
Preferences.putFloat(String,float) 。
|
void |
putInt(String key, int value)
实现
putInt方法按照在本说明书中
Preferences.putInt(String,int) 。
|
void |
putLong(String key, long value)
实现
putLong方法按照在本说明书中
Preferences.putLong(String,long) 。
|
protected abstract void |
putSpi(String key, String value)
将给定的键值关联放入此首选项节点。
|
void |
remove(String key)
实现
remove(String)方法按照在本说明书中
Preferences.remove(String) 。
|
void |
removeNode()
实现
removeNode()方法按照在本说明书中
Preferences.removeNode() 。
|
void |
removeNodeChangeListener(NodeChangeListener ncl)
删除指定的
NodeChangeListener,因此它不再接收更改事件。
|
protected abstract void |
removeNodeSpi()
删除此首选项节点,使其无效及其包含的任何首选项。
|
void |
removePreferenceChangeListener(PreferenceChangeListener pcl)
删除指定的首选项更改侦听器,因此它不再接收首选项更改事件。
|
protected abstract void |
removeSpi(String key)
删除此首选项节点上指定键的关联(如果有)。
|
void |
sync()
实现
sync方法按照在本说明书中
Preferences.sync() 。
|
protected abstract void |
syncSpi()
此方法在此节点锁定时被调用。
|
String |
toString()
返回此首选项节点的绝对路径名。
|
importPreferences, systemNodeForPackage, systemRoot, userNodeForPackage, userRoot
protected boolean newNode
protected final Object lock
protected AbstractPreferences(AbstractPreferences parent, String name)
parent
- 此首选项节点的父级,如果为根,则为null。
name
- 此首选项节点相对于其父节点的名称,如果是根,
则为"" 。
IllegalArgumentException
- 如果
name包含斜杠(
'/' ),或
parent是
null ,并且名称不是
"" 。
public void put(String key, String value)
Preferences.put(String,String)
。
此实现检查密钥和值是否合法,获取此偏好节点的锁定,检查节点是否尚未被删除,调用putSpi(String,String)
,如果有任何偏好更改侦听器,则将通知事件入队由事件分派线程处理。
put
在类别
Preferences
key
- 指定值与之关联的键。
value
- 与指定键相关联的值。
NullPointerException
- 如果键或值为
null 。
IllegalArgumentException
- 如果
key.length()超过
MAX_KEY_LENGTH或
value.length超过
MAX_VALUE_LENGTH 。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
public String get(String key, String def)
Preferences.get(String,String)
。
这个实现首先检查key是否null抛出一个NullPointerException如果是这种情况。 然后它获取此首选节点的锁,检查节点是否尚未被删除,调用getSpi(String)
,并返回结果,除非getSpi调用返回null或引发异常,在这种情况下,此调用返回def 。
get
在类别
Preferences
key
- 其关联值要返回的键。
def
- 在此首选项节点没有与
key相关联的值的情况下返回的值。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
NullPointerException
- 如果键是null 。
(A null默认是允许的。)
public void remove(String key)
Preferences.remove(String)
。
此实现获取此首选项节点的锁定,检查节点是否尚未被删除,调用removeSpi(String)
,如果有任何偏好更改侦听器,则将通知事件入队由事件分派线程处理。
remove
在类别
Preferences
key
- 要从偏好节点删除其映射的密钥。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
NullPointerException
- 如果
key是
null ..
public void clear() throws BackingStoreException
Preferences.clear()
。
此实现获得此首选项节点的锁定,调用keys()
获取一个键数组,并且遍历每个键上调用remove(String)
的数组。
clear
在类别
Preferences
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
Preferences.removeNode()
public void putInt(String key, int value)
Preferences.putInt(String,int)
。
此实现将value 转换为Integer.toString(int)
的字符串, 并对结果调用put(String,String)
。
putInt
在类别
Preferences
key
- 与字符串形式的值相关联的键。
value
- 其字符串形式与键相关联的值。
NullPointerException
- 如果键是
null 。
IllegalArgumentException
- 如果
key.length()超过
MAX_KEY_LENGTH 。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
Preferences.getInt(String,int)
public int getInt(String key, int def)
Preferences.getInt(String,int)
。
此实现调用get(key, null)
。 如果返回值不为空,则实现将其转换为int ( Integer.parseInt(String)
) 。 如果尝试成功,则返回值由此方法返回。 否则返回def 。
getInt
在类
Preferences
key
- 其关联值将作为int返回的键。
def
- 如果此首选项节点没有与
key关联的值或相关联的值不能被解释为int,则返回的值。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
NullPointerException
- 如果
key是
null 。
Preferences.putInt(String,int)
,
Preferences.get(String,String)
public void putLong(String key, long value)
Preferences.putLong(String,long)
。
此实现将value 转换为Long.toString(long)
的字符串, 并对结果调用put(String,String)
。
putLong
在类别
Preferences
key
- 与字符串形式的值相关联的键。
value
- 其字符串形式与键相关联的值。
NullPointerException
- 如果键是
null 。
IllegalArgumentException
- 如果
key.length()超过
MAX_KEY_LENGTH 。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
Preferences.getLong(String,long)
public long getLong(String key, long def)
Preferences.getLong(String,long)
。
此实现调用get(key, null)
。 如果返回值不为空,则该实现将尝试将其转换为long与Long.parseLong(String)
。 如果尝试成功,则返回值由此方法返回。 否则返回def 。
getLong
在类别
Preferences
key
- 其关联值将作为长期返回的键。
def
- 如果此首选项节点没有与
key相关联的值或相关联的值不能被解释为长时间,则返回值。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
NullPointerException
- 如果
key是
null 。
Preferences.putLong(String,long)
,
Preferences.get(String,String)
public void putBoolean(String key, boolean value)
Preferences.putBoolean(String,boolean)
。
此实现将value 转换为String.valueOf(boolean)
的字符串, 并对结果调用put(String,String)
。
putBoolean
在类别
Preferences
key
- 与字符串形式的值相关联的键。
value
- 其字符串形式与键关联的值。
NullPointerException
- 如果键是
null 。
IllegalArgumentException
- 如果
key.length()超过
MAX_KEY_LENGTH 。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
Preferences.getBoolean(String,boolean)
,
Preferences.get(String,String)
public boolean getBoolean(String key, boolean def)
Preferences.getBoolean(String,boolean)
。
此实现调用get(key, null)
。 如果返回值为非空值,则使用String.equalsIgnoreCase(String)
与"true"进行比较 。 如果比较返回true ,此调用返回true 。 否则,原始返回值与"false"进行比较,再次使用String.equalsIgnoreCase(String)
。 如果比较返回true ,则此调用返回false 。 否则,此调用返回def 。
getBoolean
在类别
Preferences
key
- 将其关联值作为布尔值返回的键。
def
- 如果此首选项节点没有与
key相关联的值或相关联的值不能被解释为布尔值,则返回的值。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
NullPointerException
- 如果
key是
null 。
Preferences.get(String,String)
,
Preferences.putBoolean(String,boolean)
public void putFloat(String key, float value)
Preferences.putFloat(String,float)
。
此实现将value 转换为Float.toString(float)
的字符串, 并对结果调用put(String,String)
。
putFloat
在类别
Preferences
key
- 与字符串形式的值相关联的键。
value
- 其字符串形式与键相关联的值。
NullPointerException
- 如果键是
null 。
IllegalArgumentException
- 如果
key.length()超过
MAX_KEY_LENGTH 。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
Preferences.getFloat(String,float)
public float getFloat(String key, float def)
Preferences.getFloat(String,float)
。
此实现调用get(key, null)
。 如果返回值为非空值,则实现将尝试将其转换为float ( Float.parseFloat(String)
) 。 如果尝试成功,则返回值由此方法返回。 否则返回def 。
getFloat
在类别
Preferences
key
- 其关联值将作为浮点数返回的键。
def
- 如果此首选项节点没有与
key关联的值或相关联的值不能被解释为浮点数,则返回值。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
NullPointerException
- 如果
key是
null 。
Preferences.putFloat(String,float)
,
Preferences.get(String,String)
public void putDouble(String key, double value)
Preferences.putDouble(String,double)
。
此实现将value 转换为Double.toString(double)
的字符串, 并对结果调用put(String,String)
。
putDouble
在类别
Preferences
key
- 与字符串形式的值相关联的键。
value
- 其字符串形式与键相关联的值。
NullPointerException
- 如果键是
null 。
IllegalArgumentException
- 如果
key.length()超过
MAX_KEY_LENGTH 。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
Preferences.getDouble(String,double)
public double getDouble(String key, double def)
Preferences.getDouble(String,double)
。
此实现调用get(key, null)
。 如果返回值不为空,则该实现尝试将其转换为double与Double.parseDouble(String)
。 如果尝试成功,则返回值由此方法返回。 否则返回def 。
getDouble
在类别
Preferences
key
- 其关联值将作为双重返回的键。
def
- 如果此首选项节点没有与
key相关联的值或相关联的值不能被解释为双精度,则返回值。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
NullPointerException
- 如果
key是
null 。
Preferences.putDouble(String,double)
,
Preferences.get(String,String)
public void putByteArray(String key, byte[] value)
Preferences.putByteArray(String,byte[])
。
putByteArray
在类别
Preferences
key
- 与字符串形式的值相关联的键。
value
- 其字符串形式与键关联的值。
NullPointerException
- 如果键或值为
null 。
IllegalArgumentException
- 如果key.length()超过MAX_KEY_LENGTH,或者如果value.length超过MAX_VALUE_LENGTH * 3/4。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
Preferences.getByteArray(String,byte[])
,
Preferences.get(String,String)
public byte[] getByteArray(String key, byte[] def)
Preferences.getByteArray(String,byte[])
。
getByteArray
在类别
Preferences
key
- 其相关值将作为字节数组返回的键。
def
- 如果此首选项节点没有与
key相关联的值或相关联的值不能被解释为字节数组,则返回值。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
NullPointerException
- 如果key是null 。
(为def甲null值是允许的。)
Preferences.get(String,String)
,
Preferences.putByteArray(String,byte[])
public String[] keys() throws BackingStoreException
Preferences.keys()
。
此实现获取此偏好节点的锁定,检查节点是否尚未被删除并调用keysSpi()
。
keys
在类别
Preferences
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
public String[] childrenNames() throws BackingStoreException
Preferences.childrenNames()
。
此实现获取此偏好节点的锁定,检查节点是否尚未被删除,构造一个初始化为已缓存的子节点(该节点的“子缓存”中的子节点)的TreeSet ,调用childrenNamesSpi()
,并添加所有返回子名进入集合。 使用toArray方法将树集的元素转储到String数组中,并返回此数组。
childrenNames
在类别
Preferences
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
cachedChildren()
protected final AbstractPreferences[] cachedChildren()
public Preferences parent()
Preferences.parent()
。
此实现获取此首选项节点的锁定,检查节点是否尚未被删除并返回传递给该节点的构造函数的父值。
parent
在类别
Preferences
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
public Preferences node(String path)
Preferences.node(String)
。
此实现获取此首选节点的锁定并检查节点是否尚未被删除。 如果path为"" ,则返回该节点; 如果path为"/" ,则返回该节点的根。 如果在path的第一个字符不是'/',落实分解到path令牌和递归遍历从该节点到指定节点的路径,“消费”的姓名和path在遍历的每一步斜线。 在每个步骤中,当前节点被锁定,并且为命名节点检查节点的子缓存。 如果没有找到,该名称将被检查,以确保其长度不超过MAX_NAME_LENGTH 。 然后调用childSpi(String)
方法,结果存储在该节点的子缓存中。 如果新创建的对象的newNode
对象的newNode
字段为true ,并且有任何节点更改侦听器,则会将通知事件排入队列中,以便事件分派线程进行处理。
当没有更多的令牌时,通过此方法返回由88643086887714返回的子缓存中发现的最后一个值。 如果在遍历期间,两个884630868900令牌连续出现,或者最后一个令牌是"/" (而不是一个名称),则抛出适当的IllegalArgumentException 。
如果path的第一个字符是'/'(指示绝对路径名)此首节点的锁被打破path成标记之前下降,而这种方法递归地遍历从根(而不是从本节点开始)开始的路径。 遍历与所描述的相对路径名称相同。 根据locking invariant
,在根节点开始遍历之前,将该节点上的锁删除是避免死锁可能性的关键 。
node
在
Preferences
path
- 要返回的首选项节点的路径名。
IllegalArgumentException
- 如果路径名称无效(即,它包含多个连续的斜杠字符,或以斜线字符结尾且长度超过一个字符)。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
Preferences.flush()
public boolean nodeExists(String path) throws BackingStoreException
Preferences.nodeExists(String)
。
这个实现非常类似于node(String)
,除了使用getChild(String)
而不是childSpi(String)
。
nodeExists
在类别
Preferences
path
- 要检查其存在的节点的路径名。
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
IllegalArgumentException
- 如果路径名无效(即,它包含多个连续的斜杠字符,或以斜杠字符结尾且长度超过一个字符)。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除,并且
pathname不是空字符串(
"" )。
public void removeNode() throws BackingStoreException
Preferences.removeNode()
。
该实现检查以查看该节点是否为根; 如果是这样,它会引发适当的异常。 然后,它锁定该节点的父节点,并调用遍历通过此节点生成的子树的递归辅助方法。 递归方法锁定调用它的节点,检查它尚未被删除的节点,然后确保其所有子节点被缓存:调用childrenNamesSpi()
方法,并检查每个返回的子名称,缓存。 如果一个小孩尚未缓存,则调用childSpi(String)
方法为其创建一个Preferences实例,并将此实例放入子缓存中。 然后,辅助方法在其子缓存中包含的每个节点上递归调用自身。 接下来,它调用removeNodeSpi()
,将其标记为已删除,并将其自身从其父级缓存中删除。 最后,如果有任何节点更改侦听器,它会将通知事件排入队列,以便事件发送线程进行处理。
请注意,所有祖先始终调用助手方法,直到“最近的未删除祖先”被锁定。
removeNode
在类别
Preferences
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
UnsupportedOperationException
- 如果在根节点上调用此方法。
BackingStoreException
- 如果由于后备存储器故障而无法完成此操作,或无法与之通信。
Preferences.flush()
public String name()
Preferences.name()
。
此实现仅返回传递给此节点构造函数的名称。
name
在类别
Preferences
public String absolutePath()
Preferences.absolutePath()
。
此实现仅返回在构建此节点时计算的绝对路径名(基于传递给此节点的构造函数的名称以及传递给此节点的祖先构造函数的名称)。
absolutePath
在
Preferences
public boolean isUserNode()
Preferences.isUserNode()
。
该实现将此节点的根节点(存储在私有字段中)与Preferences.userRoot()
返回的值进行比较 。 如果两个对象引用相同,则此方法返回true。
isUserNode
在
Preferences
public void addPreferenceChangeListener(PreferenceChangeListener pcl)
Preferences
Preferences.removeNode()
方法,该方法生成事件 。优选变化事件是由clear方法生成的节点的变化 。)
事件只能保证在与注册的侦听器相同的JVM中进行的更改,尽管某些实现可能会为此JVM之外的更改生成事件。 可能在更改持续存在之前生成事件。 当在该节点的后代修改首选项时,不会生成事件; 想要这样的事件的主叫必须向每个后代注册。
addPreferenceChangeListener
在类别
Preferences
pcl
- 要添加的首选项更改侦听器。
Preferences.removePreferenceChangeListener(PreferenceChangeListener)
,
Preferences.addNodeChangeListener(NodeChangeListener)
public void removePreferenceChangeListener(PreferenceChangeListener pcl)
Preferences
removePreferenceChangeListener
在类别
Preferences
pcl
- 要删除的首选项更改侦听器。
Preferences.addPreferenceChangeListener(PreferenceChangeListener)
public void addNodeChangeListener(NodeChangeListener ncl)
Preferences
复制
Preferences.removeNode()
调用导致多个节点更改事件 ,一个针对根除去节点的子树中的每个节点)。
事件只能保证在与注册的侦听器相同的JVM中进行的更改,尽管某些实现可能会为此JVM之外的更改生成事件。 在更改变得永久之前可能会生成事件。 当添加或删除此节点的间接后代时,不会生成事件; 想要这样的事件的主叫必须向每个后代注册。
关于节点创建几乎不能保证。 因为在访问时隐式创建节点,所以实现可能不可行,以确定子访问之前是否存在子节点(例如,因为后台存储不可达或缓存的信息已过期)。 在这种情况下,实现既不需要生成节点更改事件,也不禁止这样做。
addNodeChangeListener
在类别
Preferences
ncl
- 要添加的
NodeChangeListener 。
Preferences.removeNodeChangeListener(NodeChangeListener)
,
Preferences.addPreferenceChangeListener(PreferenceChangeListener)
public void removeNodeChangeListener(NodeChangeListener ncl)
Preferences
removeNodeChangeListener
在
Preferences
ncl
- 要删除的
NodeChangeListener 。
Preferences.addNodeChangeListener(NodeChangeListener)
protected abstract void putSpi(String key, String value)
这个方法是用这个节点上的锁来调用的。
key
- 关键
value
- 值
protected abstract String getSpi(String key)
一般来说,这种方法在任何情况下都不应该抛出异常。 但是,如果它抛出异常,该异常将被截获并被视为null返回值。
这个方法是用这个节点上的锁来调用的。
key
- 关键
protected abstract void removeSpi(String key)
这个方法是用这个节点上的锁来调用的。
key
- 关键
protected abstract void removeNodeSpi() throws BackingStoreException
Preferences.removeNode()
方法以自下而上的方式重复此方法,在删除节点本身之前删除节点的后代)。
这个方法是使用该节点及其父节点(以及作为单个调用到Preferences.removeNode()
的结果被删除的所有祖先)保持的锁来调用的。
在节点(或祖先)上调用flush方法之前,删除节点不需要持续。
如果这个节点抛出一个BackingStoreException ,这个例外会传出超出封闭的removeNode()
调用。
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
protected abstract String[] keysSpi() throws BackingStoreException
这个方法是用这个节点上的锁来调用的。
如果这个节点抛出一个BackingStoreException ,这个例外会传出超出封闭的keys()
调用。
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
protected abstract String[] childrenNamesSpi() throws BackingStoreException
这个方法是用这个节点上的锁来调用的。
如果这个节点抛出一个BackingStoreException ,这个例外会传出超出封闭的childrenNames()
调用。
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
protected AbstractPreferences getChild(String nodeName) throws BackingStoreException
Preferences.MAX_NAME_LENGTH
个字符。
此外,保证该节点尚未被删除。
(如果他选择覆盖这种方法,那么实现者不需要检查这些事情。)
最后,保证命名的节点在上一次被删除之前没有被这个方法的先前调用返回,或childSpi(java.lang.String)
。 换句话说,缓存的值将始终优先于调用此方法。 (如果他选择覆盖此方法,那么实现者不需要维护自己先前返回的孩子的缓存。)
此实现获取此首选项节点的锁定,调用childrenNames()
获取此节点子节点名称的数组,然后迭代数组,将每个子节点的名称与指定的节点名称进行比较。 如果子节点具有正确的名称,则调用childSpi(String)
方法,并返回结果节点。 如果迭代完成而没有找到指定的名称,则返回null 。
nodeName
- 要搜索的小孩的姓名。
BackingStoreException
- 如果由于后备存储器中的故障或无法与其进行通信,此操作无法完成。
protected abstract AbstractPreferences childSpi(String name)
Preferences.MAX_NAME_LENGTH
个字符。
此外,保证该节点尚未被删除。
(实施者不需要检查任何这些事情。)
最后,可以保证命名的节点尚未通过这种方法或者以前调用返回getChild(String)
它移除最后一次了。 换句话说,缓存的值将始终优先于调用此方法。 子类不需要维护自己先前返回的子节点的缓存。
实现者必须确保返回的节点尚未被删除。 如果先前删除了这个节点的一个相似的子节点,那么实现者必须返回一个新构建的AbstractPreferences节点; 一旦删除,一个AbstractPreferences节点不能“复苏”。
如果此方法导致创建节点,则在此节点或其祖先(或后代)上调用flush方法之前,不会保证此节点是持久的。
这个方法是用这个节点上的锁来调用的。
name
- 相对于此首选项节点返回的子节点的名称。
public String toString()
toString
在类别
Preferences
public void sync() throws BackingStoreException
Preferences.sync()
。
此实现调用一个递归帮助程序来锁定此节点,调用它上的syncSpi(),解锁该节点,并递归地调用每个“高速缓存的子”的方法。 缓存的子节点是此虚拟机中已创建但未随后删除的此节点的子节点。 实际上,该方法对根据此节点的“高速缓存子树”进行深度优先遍历,仅在该节点被锁定时调用子树中每个节点上的syncSpi()。 请注意,syncSpi()是从上而下调用的。
sync
在类别
Preferences
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
IllegalStateException
- 如果此节点(或祖先)已使用
removeNode()
方法删除。
flush()
protected abstract void syncSpi() throws BackingStoreException
如果这个节点抛出一个BackingStoreException ,这个例外会传出超出封闭的sync()
调用。
BackingStoreException
- 如果由于后备存储器中的故障或无法与之通信,此操作无法完成。
public void flush() throws BackingStoreException
Preferences.flush()
。
此实现调用一个递归帮助程序来锁定此节点,调用其上的flushSpi(),解锁此节点,并递归地在每个“缓存的子节点”上调用此方法。 缓存的子节点是此虚拟机中已创建但未随后删除的此节点的子节点。 实际上,此方法会深入第一遍遍历此节点的“缓存子树”,在子树中的每个节点上调用flushSpi(),而只锁定该节点。 请注意,flushSpi()是从上而下调用的。
如果在使用removeNode()
方法删除的节点上调用此方法,则在此节点上调用flushSpi(),但不调用其他节点。
flush
在类别
Preferences
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成,或无法与之通信。
flush()
protected abstract void flushSpi() throws BackingStoreException
如果这个节点抛出一个BackingStoreException ,这个例外会传出超出封闭的flush()
调用。
BackingStoreException
- 如果由于后备存储器中的故障导致此操作无法完成或无法与之通信。
protected boolean isRemoved()
removeNode()
方法删除。
此方法在返回用于跟踪此状态的私有字段的内容之前锁定此节点。
removeNode()
方法删除。
public void exportNode(OutputStream os) throws IOException, BackingStoreException
Preferences.exportNode(OutputStream)
。
exportNode
在类别
Preferences
os
- 发送XML文档的输出流。
IOException
- 如果写入指定的输出流导致一个
IOException 。
BackingStoreException
- 如果不能从后备存储读取偏好数据。
Preferences.importPreferences(InputStream)
public void exportSubtree(OutputStream os) throws IOException, BackingStoreException
Preferences.exportSubtree(OutputStream)
。
exportSubtree
在类别
Preferences
os
- 发送XML文档的输出流。
IOException
- 如果写入指定的输出流导致
IOException 。
BackingStoreException
- 如果无法从后备存储读取偏好数据。
Preferences.importPreferences(InputStream)
,
Preferences.exportNode(OutputStream)