系统找不到指定的文件,但文件存在

问题描述 投票:0回答:7

我正在尝试操作名为 Test.XML 的 XML 文件。

我可以在我的文件夹中看到该文件,并且可以打开它。 代码:

DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();            
domFactory.setIgnoringComments(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(new File("MyFolder\Test.xml"));

我收到此错误:

java.io.FileNotFoundException: C:\MyFolder\Test.xml (The system cannot find the file specified)

为什么代码无法打开/读取我的文件,但其他程序(如 Notepad++)可以这样做?

***注意:文件的真实名称是“Use-cases estSuitesA_E_1002+${user}3_12022016+${date}2_2.5.xml”。

java java-io
7个回答
3
投票

请将您的代码修改为:

ClassLoader classLoader = ClassLoader.getSystemClassLoader();
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setIgnoringComments(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse(new File(classLoader.getResource("MyFolder/Test.xml").getPath()));
System.out.println(doc.getDocumentElement());

要运行此代码,请为

.class
文件构建项目。类加载器需要有
.class
文件。否则,它将无法从类路径读取文件夹或文件。

注:

  • new File("MyFolder\Test.xml")
    - 这将不起作用,因为您没有提供绝对路径。您必须使用类加载器从类路径获取文件(在这种情况下,您不必提及完整路径)。类加载器为您带来完整的绝对路径。 记住:
    java.nio.File
    需要绝对路径才能工作。

  • 如果您想从任意位置读取文件,则必须指定其完整路径。 (假设您正在尝试访问外部文件)


1
投票

尝试一下如何

Document doc = builder.parse(new File("Use-cases\\testSuitesA_E_1002+${user}3_12022016+${date}2_2.5.xml"))

在您的文件路径中, 用例 estSuitesA_E_1002+${user}3_12022016+${date}2_2.5.xml

\t
表示转义序列。

另外,我很想检查一下您正在使用的

{date}
,也许您的日期格式类似于 06 �8?


1
投票
  • 我尝试解析其他文件夹中的xml文件。就打印成功了。代码如下

  • 如果需要绝对路径,也可以使用Classloader来加载XML文件。

    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.Node;
    import org.w3c.dom.NodeList;
    import org.xml.sax.SAXException;
    
    public class Testing {
    
        public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
            parseXmlFile();
        }
    
        private static void parseXmlFile() throws ParserConfigurationException, SAXException, IOException {
            DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
            domFactory.setIgnoringComments(true);
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            Document doc = builder.parse(new File("src/main/java/xmlfiles/Test.xml"));
            if (doc.hasChildNodes()) {
                printNote(doc.getChildNodes());
    
            }
        }
    
        private static void printNote(NodeList nodeList) {
            for (int count = 0; count < nodeList.getLength(); count++) {
                Node tempNode = nodeList.item(count);
                if (tempNode.getNodeType() == Node.ELEMENT_NODE) {
                    System.out.println("Value = " + tempNode.getTextContent());
                }
    
            }
        }
    }
    

<?xml version="1.0" encoding="UTF-8"?>
<company>
	<staff id="100">
		<firstname>Tom</firstname>
		<lastname>Jerry</lastname>
		<nickname>Tomy</nickname>
		<salary>100000</salary>
	</staff>
	<staff id="200">
		<firstname>Micky</firstname>
		<lastname>Mouse</lastname>
		<nickname>Mike</nickname>
		<salary>200000</salary>
	</staff>
</company>


0
投票

看起来您正在使用下面提到的行中的相对路径来访问该文件。

Document doc = builder.parse(new File("MyFolder\Test.xml"));

此外,您使用了单个“\”,而是使用“//”。您可以使用两个选项进行调试

  1. 尝试使用文件的绝对路径(始终使用“//”)并查看应用程序是否有权访问该文件。如果存在访问权限,则从程序执行的目录形成正确的相对路径。

  2. 如果由于某种原因您的程序无法访问该文件的权限,请尝试提供所需的权限。


0
投票

我最近遇到了同样的问题,我发现在我的情况下,文件保存为“abc.txt.txt”而不是“abc.txt”。

由于文件扩展名被隐藏,我之前无法看到该文件是在名称中添加了扩展名保存的。

检查文件是否以正确的扩展名保存。

或者,由于您的文件名中包含“日期”,因此可能会导致问题。检查访问文件时的日期格式是否与文件名中的相同。


0
投票

.\\
添加到文件名的开头。

.
代表当前运行目录

看起来java正在尝试从根文件夹中查找该文件夹(

C:\
)。添加
.
告诉 java 查看当前运行目录,而不是
C:\
。更好的是,不要使用反斜杠并使用单个正斜杠:

new File("./MyFolder/Test.xml")

0
投票

试试这个:

    System.out.println(new File("").getAbsolutePath());

它将在控制台日志中写入您当前的工作目录。然后你可以像这样调整你的代码:

    System.out.println(new File("relative/path/to/File.xml").exists);

它应该告诉您文件(或目录)是否存在。注意是“/”而不是“\”。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.