1

以前、stackoverflow で xml からファイルをインポートする方法について質問したことがあります (こちらをお読みください)。私に提供された解決策は、使用することでした

documentbuilder.parse( xmlhandler.class.getResourceAsStream("shutdownscheduler.xml")); 

"C:\Users\Rohan Kandwal\Documents\NetBeansProjects\Shutdown Scheduler\build\classes\shutdown\scheduler\shutdownscheduler.xml"このソリューションは、読み取り専用の目的に適したxmlファイルを選択して います。

"C:\Users\Rohan Kandwal\Documents\NetBeansProjects\Shutdown Scheduler\src\shutdown\schedulerしかし、XMLに加えられた更新を永久に保存できるように、場所からファイルにアクセスするにはdocumentbuilderが必要です 。srcフォルダではなくフォルダからファイルにアクセスする方法はありbuildますか?

4

1 に答える 1

1

通常、アプリケーションがファイルを書き込む場合、書き込みアクセス権のある場所で行う必要があります。アプリがそのようなアクセスを許可されることを (ほとんどの場合) 確実にできる唯一の場所は、ユーザーのホーム ディレクトリです。".some-application"他の Java ベースのアプリケーションは、通常、ホーム フォルダー (あなたの場合は) にという名前のディレクトリを作成することに気付いたかもしれません"C:\Users\Rohan Kandwal"。その理由 (その 1 つ) は、書き込みアクセスです。

Class.getResourceAsStream(...)同じことを行い、書き込み可能なファイルに使用することを忘れる必要があります。経由でホーム ディレクトリへのパスを取得できますSystem.getProperty("user.home")

Class.getResourceAsStream(...)例で使用されているように、ディレクトリからファイルを取得する理由buildは、IDE 内で実行しているためです。IDE の外部で実行すると、このパスが変更されます。これは、クラス ファイル ( xmlhandler.class) へのパスが変更される可能性が高く、そのパスにClass.getResourceAsStream(...)依存してリソースを検索するためです。

srcまた、アプリケーションがデプロイされたときにディレクトリが存在しない可能性が高いことにも注意してください。あったとしても、ユーザーが書き込みアクセスのある場所に展開するかどうかを知る方法はありません。したがって、あなたがやろうとしていることはあまり意味がありません。

編集01

これは、やりたいことを実行する方法の例です。これにより、任意の方法でファイルを書き込むことができるアプリケーションのホーム ディレクトリが作成されます。アプリケーションの実行間で保存したいファイルが存在しない場合は、リソース ファイルのコンテンツが作成されて埋められます。これは単なる例であることに注意してください。

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

public class ConfigDir {

    private static final String APP_DIR = ".myappdir";
    private static final String FILE_NAME = "shutdownscheduler.xml";

    private File fillFileFromTemplate(InputStream template, File file) throws FileNotFoundException, IOException {
            OutputStream out = null;
            try {
                out = new FileOutputStream(file);
                int read = 0;
                byte[] bytes = new byte[1024];
                while ((read = template.read(bytes)) != -1) {
                    out.write(bytes, 0, read);
                }
                out.flush();
                return file;
            } catch (FileNotFoundException ex) {
                throw ex;
            } finally {
                if (out != null) {
                    out.close();
                }
            }
        }

    public static void main(String[] argv) throws IOException {        
        String userdir = System.getProperty("user.home"); // user home directory
        // OR if you know that your program will run from a directory that has write access
        // String userdir = System.getProperty("user.dir"); // working directory
        if (!userdir.endsWith(System.getProperty("file.separator"))) {
            userdir += System.getProperty("file.separator");
        }
        String myAppDir = userdir + APP_DIR;
        File myAppDirFile = new File(myAppDir);
        myAppDirFile.mkdirs(); // create all dirs if they do not exist
        String myXML = myAppDir + System.getProperty("file.separator") + FILE_NAME;
        File myXMLFile = new File(myXML); // this is just a descriptor        
        ConfigDir cd = new ConfigDir();        
        if (!myXMLFile.exists()) {
            // if the file does not exist, create one based on your template
            // replace "ConfigDir" with a class that has your xml next to it in src dir
            InputStream template = ConfigDir.class.getResourceAsStream(FILE_NAME);  
            cd.fillFileFromTemplate(template, myXMLFile);
        }

        // use myXMLFile java.io.File instance for read/write from now on
        /*
        DocumentBuilderFactory documentbuilderfactory=DocumentBuilderFactory.newInstance();
        DocumentBuilder documentbuilder=documentbuilderfactory.newDocumentBuilder();
        Document document=(Document)documentbuilder.parse(myXMLFile);
        document.getDocumentElement(); 
        ...
        */        
    }    
}
于 2013-01-17T13:26:25.993 に答える