Java 如何使用绝对文件路径读取XML文件

Java 如何使用绝对文件路径读取XML文件,java,file-read,Java,File Read,我有一个简单的java插件项目,需要读取一个XML文件。我正在使用java.io文件读取我的文件。当我将文件路径设置为D:\Studies\HospitalManagement[ablunceservice]\config\ambunceservice.xml时,该程序运行良好。但是我被要求提供路径为config/ambuncedetails.xml。因为我是这个文件阅读概念的新手,所以我不知道如何让它工作。当我试图传递第二个粗体文本中提到的文件路径时,它会给我一个异常。我尝试使用getAbso

我有一个简单的java插件项目,需要读取一个XML文件。我正在使用java.io文件读取我的文件。当我将文件路径设置为D:\Studies\HospitalManagement[ablunceservice]\config\ambunceservice.xml时,该程序运行良好。但是我被要求提供路径为config/ambuncedetails.xml。因为我是这个文件阅读概念的新手,所以我不知道如何让它工作。当我试图传递第二个粗体文本中提到的文件路径时,它会给我一个异常。我尝试使用getAbsolutePath()方法,并将XML文件放在另一个源文件夹中,这是StackOverflow中几个类似问题中建议的,但没有解决我的问题。我如何解决这个问题?非常感谢你帮助我

源代码:-

import java.io.File;
import java.io.IOException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class AmbulanceServiceImpl implements AmbulanceService {

    private static final String AMBULANCE = "Ambulance";
    private static final String AVAILABILITY = "Availability";
    private static final String AVAILABLE = "Available";
    private static final String REGISTRATION_NO = "RegNo";
    private static final String DRIVERNAME = "Driver";
    private static final String NO_VEHICLE_AVALABLE_MESSAGE = "Sorry! No ambulance available currently";
    private static final String PATH = "config/AmbulanceDetails.xml"; //this is the way I want to specify my file path


    private NodeList nodeList;

    private void readXml() {

        File file = new File(PATH); //passing the file path 
        try {


            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
            Document document = documentBuilder.parse(file);
            document.getDocumentElement().normalize();

            nodeList = document.getElementsByTagName(AMBULANCE);


        } catch (ParserConfigurationException | SAXException | IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    private String findAvailableAmbulance() {

       //some other process

    }



    @Override
    public String getAnAmbulance() {
        // TODO Auto-generated method stub
        readXml();
        return findAvailableAmbulance();
    }

}

例外情况:-

java.io.FileNotFoundException: D:\Softwares\eclipse\config\AmbulanceDetails.xml (The system cannot find the path specified)
    at java.base/java.io.FileInputStream.open0(Native Method)
    at java.base/java.io.FileInputStream.open(FileInputStream.java:213)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:155)
    at java.base/java.io.FileInputStream.<init>(FileInputStream.java:110)
    at java.base/sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:86)
    at java.base/sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:184)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:652)
    at java.xml/com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:150)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:860)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
    at java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
    at java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
    at java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:206)
    at hospitalmanagement__abulanceservice_.AmbulanceServiceImpl.readXml(AmbulanceServiceImpl.java:37)
    at hospitalmanagement__abulanceservice_.AmbulanceServiceImpl.getAnAmbulance(AmbulanceServiceImpl.java:80)
    at hospitalmanagement__abulanceservice_.Activator.start(Activator.java:12)
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:842)
    at org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:554)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:834)
    at org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:791)
    at org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1015)
    at org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:365)
    at org.eclipse.osgi.container.Module.doStart(Module.java:603)
    at org.eclipse.osgi.container.Module.start(Module.java:467)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$2.run(ModuleContainer.java:1844)
    at org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$1$1.execute(EquinoxContainerAdaptor.java:136)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1837)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1780)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1742)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1664)
    at org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
    at org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
    at org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:345)
java.io.FileNotFoundException:D:\Softwares\eclipse\config\ambuncedetails.xml(系统找不到指定的路径)
位于java.base/java.io.FileInputStream.open0(本机方法)
位于java.base/java.io.FileInputStream.open(FileInputStream.java:213)
位于java.base/java.io.FileInputStream。(FileInputStream.java:155)
位于java.base/java.io.FileInputStream。(FileInputStream.java:110)
位于java.base/sun.net.www.protocol.file.FileURLConnection.connect(FileURLConnection.java:86)
位于java.base/sun.net.www.protocol.file.FileURLConnection.getInputStream(FileURLConnection.java:184)
位于java.xml/com.sun.org.apache.xerces.internal.impl.XMLEntityManager.setupCurrentEntity(XMLEntityManager.java:652)
位于java.xml/com.sun.org.apache.xerces.internal.impl.XMLVersionDetector.determineDocVersion(XMLVersionDetector.java:150)
位于java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:860)
位于java.xml/com.sun.org.apache.xerces.internal.parsers.XML11Configuration.parse(XML11Configuration.java:824)
位于java.xml/com.sun.org.apache.xerces.internal.parsers.XMLParser.parse(XMLParser.java:141)
位于java.xml/com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:246)
位于java.xml/com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
位于java.xml/javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:206)
在医院管理服务处uuuuu AbluanceService uuu.AmbunceServiceImpl.readXml(AmbunceServiceImpl.java:37)
在医院管理处(AmbunceServiceImpl.getAnAmbulance)(AmbunceServiceImpl.java:80)
在hospitalmanagement\uuu AbluanceService\uu.Activator.start(Activator.java:12)
位于org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:842)
位于org.eclipse.osgi.internal.framework.BundleContextImpl$3.run(BundleContextImpl.java:1)
位于java.base/java.security.AccessController.doPrivileged(AccessController.java:554)
位于org.eclipse.osgi.internal.framework.BundleContextImpl.startActivator(BundleContextImpl.java:834)
位于org.eclipse.osgi.internal.framework.BundleContextImpl.start(BundleContextImpl.java:791)
位于org.eclipse.osgi.internal.framework.EquinoxBundle.startWorker0(EquinoxBundle.java:1015)
位于org.eclipse.osgi.internal.framework.EquinoxBundle$EquinoxModule.startWorker(EquinoxBundle.java:365)
位于org.eclipse.osgi.container.Module.doStart(Module.java:603)
位于org.eclipse.osgi.container.Module.start(Module.java:467)
位于org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel$2.run(ModuleContainer.java:1844)
位于org.eclipse.osgi.internal.framework.EquinoxContainerAdaptor$1$1.execute(EquinoxContainerAdaptor.java:136)
位于org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1837)
位于org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.incStartLevel(ModuleContainer.java:1780)
位于org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.doContainerStartLevel(ModuleContainer.java:1742)
位于org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1664)
位于org.eclipse.osgi.container.ModuleContainer$ContainerStartLevel.dispatchEvent(ModuleContainer.java:1)
位于org.eclipse.osgi.framework.eventmgr.EventManager.dispatchEvent(EventManager.java:234)
位于org.eclipse.osgi.framework.eventmgr.EventManager$EventThread.run(EventManager.java:345)
项目文件夹结构:-


您应该将系统属性“user.dir”设置为您的相对文件名应该与之相对的目录。您能用一个例子告诉我如何设置吗@ControlAltDel
System.setProperty(“user.dir”,“/usr/var/”第二个参数应该传递什么??谢谢@ControlAltDel您应该使用关键字搜索:如何从类路径读取文件。任何其他类型的方法都可能导致您在计算机/用户会话上工作,但在另一台计算机上不工作。签出:。请注意,您的项目是基于eclipse的,或者文件是XML,这与您的问题无关。您的问题是“如何读取我的程序附带的文件”。我已编辑了问题,如果您愿意,可以回滚我的更改。