在NetBeans平台上创建模块时,FileObject
对象表示IDE的虚拟文件系统中的文件。创建新的FileObject
很简单,但NetBeans是否完全控制对实际File
的引用,还是应该自己关闭FileObject
?我的代码是这样的:
FileObject appRoot = FileUtil.getConfigRoot().getFileObject("myapp");
try {
FileObject fo = servers.createData(filename);
fo.setAttribute("name", "a name");
fo.setAttribute("desc", "a description");
} catch (IOException ex) {
throws new FileCreationException("Could not create file " + filename, ex);
}
使用上面的代码,我是否会打开一些对实际文件的引用,或者我应该获取OutputStream
的{{1}}并手动关闭它?
感谢。
答案 0 :(得分:1)
在深入了解NetBeans API和源代码后,我相信我已经找到了自己问题的答案。
上面设置的属性存储在特殊属性文件中。虚拟文件系统中的每个文件夹都有一个隐藏属性文件(.nbattrs
),其中包含为每个FileObject
存储的属性,例如
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE attributes PUBLIC "-//NetBeans//DTD DefaultAttributes 1.0//EN"
"http://www.netbeans.org/dtds/attributes-1_0.dtd">
<attributes version="1.0">
<fileobject name="dk-i2m-netbeans-smtpdummyservice-mailserver-1244831819713">
<attr name="name" stringvalue="My test"/>
<attr name="desc" intvalue="Server for testing outgoing e-mails"/>
</fileobject>
</attributes>
此文件完全由NetBeans控制,不需要打开或关闭输入/输出流。
但是,如果您要将内容添加到FileObject
而不仅仅是属性,则必须使用正常的Java方式来使用InputStream
和OutputStream
FileObject
(都有一个getter和setter)并记得相应地关闭流。 e.g。
FileObject appRoot = FileUtil.getConfigRoot().getFileObject("myapp");
try {
FileObject fo = servers.createData(filename);
fo.setAttribute("name", "a name");
fo.setAttribute("desc", "a description");
// Lock the FileObject before writing
FileLock lock;
try {
lock = fo.lock();
} catch (FileAlreadyLockedException ex) {
Exceptions.printStackTrace(ex);
return;
}
try {
OutputStream out = fo.getOutputStream(lock);
try {
// Write into the output stream
} finally {
// Remember to close the stream
out.close();
}
} finally {
lock.releaseLock();
}
} catch (IOException ex) {
throws new FileCreationException("Could not create file " + filename, ex);
}