Java-找不到带有ö;或ü;在北卡罗来纳州

Java-找不到带有ö;或ü;在北卡罗来纳州,java,file-io,Java,File Io,我正在与处理一些外部存储上的PDF文件。我正在加载它们,并注意到在我的日志中我得到了一些文件NotFoundExceptions。我在查看异常情况时,注意到一个奇怪的标志(一个内有?的黑色正方形=�) 这个 这就是我制作文件的方式。如果有区别,我会从缓冲读取器中获取字符串 File myPathFile FileReader fr = new FileReader(myPathFile); BufferedReader br = new BufferedReader(fr

我正在与处理一些外部存储上的PDF文件。我正在加载它们,并注意到在我的日志中我得到了一些
文件NotFoundExceptions
。我在查看异常情况时,注意到一个奇怪的标志(一个内有
的黑色正方形=�) 这个

这就是我制作文件的方式。如果有区别,我会从缓冲读取器中获取字符串

    File myPathFile
    FileReader fr = new FileReader(myPathFile);
    BufferedReader br = new BufferedReader(fr)
    String o = br.readLine();
    File f = new File(o)
我认为这和:

     File f = new File("\\test\ö\myFile.pdf"); //When the UNC looks like this it won't work. (the ö is �)
     File f2 = new File("\\test\myFile.pdf");   //This works

首先,它不是URL,而是UNC

那么,它不是一个正确的UNC,因为您忘记了一些非常重要的部分

\\ComputerName\SharedFolder\Resource
分组在哪里

[\\] flag to suggest it's a UNC
[ComputerName] The name of the remote computer
[\] separator character
[SharedFolder] The shared folder name
[\Resource] The path name of the remote file
最后,您没有正确转义字符串中的特殊字符,因此您甚至可能没有离开计算机,更不用说到达您想要的位置了

要在Java中键入
\
,您需要知道
\
用于null、backspace等特殊字符。因此,要获得单个正常的
\
,必须键入
\
。这将是您的第一个示例

在非Microsoft系统上,请记住远程路径名可能使用
/
而不是
\
,并且
/
不是转义字符,因此无需键入两次

 File f = new File("\\\\test\\ö\\myFile.pdf");
因为您没有名为
ö

第二个例子呢

 File f2 = new File("\\\\test\\myFile.pdf");
您的第二个示例不起作用,因为它缺少要打开的资源

假设您不想离开您的计算机,您丢失了部分本地文件名。在windows上,完整路径包括“卷名”,通常是
C:
或类似的名称

 File f = new File("c:\\test\\myFile.pdf");
有时人们会忽略卷名,在这种情况下,您需要依靠操作系统的良好性能来尝试为您查找文件。一般来说,这不是一个好主意

 File f = new File("\\test\\myFile.pdf");

但是,尽管这看起来与第二个示例类似,但它包含一个额外的正斜杠来转义正斜杠。而您的实际示例没有。您确定这是您的代码吗?它甚至不应该编译…
\m
不是有效的转义。请看,这不是URL,这是UNC。其他一些组合可能会起作用,但只是因为您的操作系统正在尝试“帮助您”。它们不是有效名称,但Microsoft Windows有一个历史记录,其中包括有时允许您执行无效操作,因为允许无效操作被认为是Microsoft历史记录中可用性的关键点。它对100000个其他文件运行良好,所以我不知道我必须更改它。我认为文件共享来自unix服务器。unc的eem要这样混合:\\test\myFolder/myfile.pdfI更新了答案以更好地涵盖多平台问题。感谢您的提示。