2

jar ファイルを生成した場合でもプログラムが XML ファイルにアクセスできるようにするには、XML ファイルをどこに置くことができますか?

XML ファイルをプロジェクト ファイルに入れると、プログラムは次のコードとして正常に実行されます。

public class one {

    public final static void main(String[] args) throws Exception {

      FileInputStream file = new java.io.FileInputStream("document.xml");//i put document.xml in project file
      javax.xml.parsers.DocumentBuilderFactory dbf = javax.xml.parsers.DocumentBuilderFactory.newInstance();
      dbf.setCoalescing(true);
      javax.xml.parsers.DocumentBuilder db = dbf.newDocumentBuilder();
      org.w3c.dom.Document doc = db.parse(file);

      one obj = new one ();
      obj.changeValue(doc, "192837465", "192837465");
      obj.save("document.xml",doc);
    }

    public void changeValue(org.w3c.dom.Document doc, String oldValue, String NewValue) throws Exception{
      org.w3c.dom.Element root = doc.getDocumentElement();
      org.w3c.dom.NodeList childNodes = root.getElementsByTagName("Employee");
      for (int i = 0; i < childNodes.getLength(); i++) {
        org.w3c.dom.NodeList subChildNodes = childNodes.item(i).getChildNodes();
        for (int j = 0; j < subChildNodes.getLength(); j++) {
          try {
             if (subChildNodes.item(j).getTextContent().equals(oldValue)) {
                subChildNodes.item(j).setTextContent(NewValue);
             }
          } catch (Exception e) {
              e.printStackTrace();
          }
        }
      }
    }

    public void save(String url ,org.w3c.dom.Document doc) throws Exception {

        javax.xml.transform.TransformerFactory factory1 = javax.xml.transform.TransformerFactory.newInstance();
        javax.xml.transform.Transformer transformer = factory1.newTransformer();
        transformer.setOutputProperty(javax.xml.transform.OutputKeys.INDENT, "yes");
        java.io.StringWriter writer = new java.io.StringWriter();
        javax.xml.transform.stream.StreamResult result = new javax.xml.transform.stream.StreamResult(writer);
        javax.xml.transform.dom.DOMSource source = new javax.xml.transform.dom.DOMSource(doc);
        transformer.transform(source, result);
        String s = writer.toString();
        System.out.println(s);

        java.io.FileWriter fileWriter = new java.io.FileWriter(url);
        java.io.BufferedWriter bufferedWriter = new java.io.BufferedWriter(fileWriter);

        bufferedWriter.write(s);

        bufferedWriter.flush();
        bufferedWriter.close();
    }
}

しかし、Eclipseを使用してjarファイルでプログラムを作成し、次のコマンドを使用してコマンドプロンプトからファイルを実行すると:

java -jar xml.jar

それは私にこの例外を与えます:

Exception in thread "main" java.io.FileNotFoundException: document.xml (The system cannot find the file specified)
        at java.io.FileInputStream.open(Native Method)
        at java.io.FileInputStream.<init>(Unknown Source)
        at java.io.FileInputStream.<init>(Unknown Source)
        at one.main(one.java:13)

このエラーの理由と修正方法を教えてください。

4

3 に答える 3

2

コンテンツを変更した後にファイルを保存しているため、xml.jar 内にパックせずに、ファイル システムに別のファイルとして残す可能性が高くなります。FileInputStream file = new java.io.FileInputStream("document.xml");それを使用してファイルにアクセスする には、コマンドと同じ作業ディレクトリjava -jar xml.jarにある必要があります。

これはうまくいきます

- mydir\
    - xml.jar
    - document.xml

これはしません

- mydir\
    - xml.jar
    - subdir\
       - document.xml

このすべての問題を回避するために、Java クラスでファイル名をハードコーディングするのではなく、メイン クラスに引数として渡すことをお勧めします。

java -jar xml.jar document.xml

また

java -jar xml.jar C:\somedir\somesubdir\document.xml

次のようにアクセスします。

FileInputStream file = new java.io.FileInputStream(args[0]);

編集

jar ファイル内に xml をパックする場合は、getResourceAsStream(String)を使用して ( 別の投稿で述べたように)、次のように jar 内のリソースの修飾名を使用して読み取りを簡単に行うことができます。

InputStream is = getResourceAsStream("com/my/pack/age/document.xml");

ファイルを書き戻すことは可能ですが、バグがあるため複雑でお勧めできません。詳細はこちらこちらをご覧ください

于 2013-02-26T12:56:40.573 に答える
0


たとえば、相対的な方法でファイルにアクセスする必要があります

InputStream file = Thread.currentThread().getContextClassLoader()
                    .getResourceAsStream("document.xml");

それ以外の

String fileLocation = "src/document.xml";
File xmlFile = new File(fileLocation);
FileInputStream file = new java.io.FileInputStream(xmlFile); 

次に
、アプリケーションは両方の方法でファイルにアクセスします

  1. 展開環境 (Eclipse から) および
  2. 実行可能な環境 (Jar から)
于 2013-02-26T10:20:32.237 に答える
0

FileInputStream の代わりに ClassLoader#getResourceAsStream を使用します。getResourceAsStream() vs FileInputStreamで同様の問題を見つけることができます

于 2013-02-26T10:06:20.053 に答える