Java 访问程序文件时出现fileNotFoundException
Java fileNotFoundException when accessing program files
我似乎一辈子都无法避免这个错误。在我之前的 post 中,我试图将属性更新到 xml 文件。我可以很好地读取文件,但是当我尝试写入文件时,我得到一个文件未找到的异常。
程序读取 XML 文件并找到只写入它的属性没有问题。在解决这个问题一段时间后,将文件放在 Program Files 目录中似乎是一个问题。如果我将 xml 文件移动到 C:\Temp\test.xml 我可以毫无问题地写入它。一旦它进入具有任何类型空格的文件夹,它似乎就找不到它。似乎是 StreamResults 的问题。
File file = new File(filePath);
document = documentBuilder.parse(file);
NodeList sessionNodelist = document.getElementsByTagName("session");
if (sessionNodelist.getLength() > 0)
{
Element sessionElement = (Element) sessionNodelist.item(0);
sessionElement.setAttribute("timeout", "12");
sessionElement.setAttribute("warning", "10");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
try{
StreamResult result = new StreamResult(file);
transformer.transform(source, result);
}catch(Exception e)
{
logger.info(e.getMessage());
}
}
java.io.FileNotFoundException: C:\Program%20Files\Test.xml
(系统找不到指定的路径)
我不确定如何解决这个错误。您会想,如果它可以在第一次文件调用中读取并找到它,那么第二次文件调用应该可以吗?
更新:我尝试了一些其他方法。
因此,当我将文件路径设置为 "C:\Program Files\test.xml" File.exists return 时,以及读写。如果我将 %20 添加到程序文件路径,它们都是 return false" 例如 C:\Program%20Files\test.xml.
所以document = documentBuilder.parse(file);
可以完美地解析文件。
当 StreamResults 尝试打开文件时,它发现文件未找到错误并在程序文件名中显示 %20。
StreamResult result = new StreamResult(file);
transformer.transform(source, result);
java.io.FileNotFoundException: C:\Program%20Files\Test.xml
(系统找不到指定的路径)
是否有另一种方法可以将结果流式传输到 xml 文件而不是 StreamResults?
而不是使用:
String filePath = "C:\Program%20Files\Test.xml";
使用这个:
String filePath = "C:\Program%20Files\Test.xml";
问题在于解析 "\" 字符
编辑:
我对 Java 的文件没有那么多经验 I/O 但这是我发现的:
File file = new File(filePath);
System.out.println(file.canRead()); // false
System.out.println(file.canWrite()); // false
这可能是这里问题背后的原因(这里需要 Excpert 的智慧来澄清)。
似乎File
找不到文件,我想是因为路径有问题。
路径可以是相对的或绝对的。您可以尝试使其相对,并检查它是否有效...
我明白了。在大量阅读其他人遇到类似问题后,我不得不做以下工作才能使其正常工作。
StreamResult result = new StreamResult(file.getPath());
transformer.transform(source, result);
现在可以了。奇怪,但它有效。
我似乎一辈子都无法避免这个错误。在我之前的 post 中,我试图将属性更新到 xml 文件。我可以很好地读取文件,但是当我尝试写入文件时,我得到一个文件未找到的异常。
程序读取 XML 文件并找到只写入它的属性没有问题。在解决这个问题一段时间后,将文件放在 Program Files 目录中似乎是一个问题。如果我将 xml 文件移动到 C:\Temp\test.xml 我可以毫无问题地写入它。一旦它进入具有任何类型空格的文件夹,它似乎就找不到它。似乎是 StreamResults 的问题。
File file = new File(filePath);
document = documentBuilder.parse(file);
NodeList sessionNodelist = document.getElementsByTagName("session");
if (sessionNodelist.getLength() > 0)
{
Element sessionElement = (Element) sessionNodelist.item(0);
sessionElement.setAttribute("timeout", "12");
sessionElement.setAttribute("warning", "10");
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
try{
StreamResult result = new StreamResult(file);
transformer.transform(source, result);
}catch(Exception e)
{
logger.info(e.getMessage());
}
}
java.io.FileNotFoundException: C:\Program%20Files\Test.xml
(系统找不到指定的路径)
我不确定如何解决这个错误。您会想,如果它可以在第一次文件调用中读取并找到它,那么第二次文件调用应该可以吗?
更新:我尝试了一些其他方法。
因此,当我将文件路径设置为 "C:\Program Files\test.xml" File.exists return 时,以及读写。如果我将 %20 添加到程序文件路径,它们都是 return false" 例如 C:\Program%20Files\test.xml.
所以document = documentBuilder.parse(file);
可以完美地解析文件。
当 StreamResults 尝试打开文件时,它发现文件未找到错误并在程序文件名中显示 %20。
StreamResult result = new StreamResult(file);
transformer.transform(source, result);
java.io.FileNotFoundException: C:\Program%20Files\Test.xml
(系统找不到指定的路径)
是否有另一种方法可以将结果流式传输到 xml 文件而不是 StreamResults?
而不是使用:
String filePath = "C:\Program%20Files\Test.xml";
使用这个:
String filePath = "C:\Program%20Files\Test.xml";
问题在于解析 "\" 字符
编辑: 我对 Java 的文件没有那么多经验 I/O 但这是我发现的:
File file = new File(filePath);
System.out.println(file.canRead()); // false
System.out.println(file.canWrite()); // false
这可能是这里问题背后的原因(这里需要 Excpert 的智慧来澄清)。
似乎File
找不到文件,我想是因为路径有问题。
路径可以是相对的或绝对的。您可以尝试使其相对,并检查它是否有效...
我明白了。在大量阅读其他人遇到类似问题后,我不得不做以下工作才能使其正常工作。
StreamResult result = new StreamResult(file.getPath());
transformer.transform(source, result);
现在可以了。奇怪,但它有效。