Должен ли OpenIDE FileObject закрываться после создания? - PullRequest
0 голосов
/ 12 июня 2009

При создании модулей на платформе 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 из FileObject и закрыть его вручную?

Спасибо.

1 Ответ

1 голос
/ 12 июня 2009

После изучения API-интерфейса NetBeans и исходного кода, я считаю, что нашел ответ на свой вопрос.

Атрибуты, как указано выше, хранятся в специальном файле атрибутов. Каждая папка в виртуальной файловой системе имеет скрытый файл атрибутов (.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 геттер и сеттер) и не забудьте закрыть потоки соответственно. например,

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);            
}
...