Java文件无法打开某些文件。

3
我尝试使用类似以下代码的方式在Java中打开文件: ```java ```
java.awt.Desktop.getDesktop().open(new File("c:\\coolfile.txt");

当然,在大多数情况下,它都能正常工作。

但是!

当我有一个包含Unicode字符u3000的文件时,我无法打开它!即使该文件存在。

例如:

java.awt.Desktop.getDesktop().open(new File("c:\\coolfile\u3000withweirdname.txt");

我遇到了一个异常,即使文件存在也会出现

[java] java.io.IOException: Failed to open file:/E:/_prog/test%E3%80%80.txt. Error message: The system cannot find the path specified.

请帮助我,我已经尝试了很多方法。这真的让我疯掉了 :/
编辑:
为了提供更多信息:
我可以很容易地从Java创建此名称的文件。
似乎与空格有关
我不知道是否适用于其他字符; 我还没有发现任何其他的情况。 但当然,如果有一个问题,很容易就会出现100个。
我相当确定我无法从Java读取或写入该文件,但由于这不是我的主要关注点,因此我没有测试过。

2
你需要像这样在 Java 中将 "\" 加倍:java.awt.Desktop.getDesktop().open(new File("c:\coolfile\u3000withweirdname.txt"); - RealHowTo
"\u3000" 是如何写Unicode字符u3000的。至少我是这么认为的。 - user1258312
1
@user1258312 请提供一个SSCCE以便他人帮助您,并说明您已经尝试了哪些方法。 - prajeesh kumar
1
  1. 进行一些调试更改!File f = new File("c:\\coolfile\u3000withweirdname.txt"); System.out.println("Exists: " + f.exists() ); //is it real path?
  2. 为了更快得到帮助,请发布一个SSCCE。请注意,这是引用的术语在谷歌上的排名最高,请不要期望别人给你提供信息。
  3. 引用的代码无法编译,请停止浪费我们的时间,如果不是你自己的话。
- Andrew Thompson
这不是Java的问题,而是awt的一个问题。 - Mihai Nita
显示剩余13条评论
3个回答

1
java.awt.Desktop.getDesktop().open(new File("c:\\coolfile\u3000withweirdname.txt");

这段代码无法编译。显然这不是你真正的代码。

[java] java.io.IOException: 无法打开文件:/E:/_prog/test%E3%80%80.txt

而且有证据表明,你向新的FileInputStream()传递了一个URL。它不接受URL字符串,而是需要一个文件名。


显然,你把一个URL传递给了new FileInputStream(),这是错误的。我通过调用文件夹上的getFiles()获取了文件路径。 - user1258312
@user1258312 没有证据。请展示代码。如果不是URL,那么file://和%-escapes是从哪里来的? - user207421
我不知道,我以为在格式化异常以便显示或其他方面时会出现。现在我意识到我应该制作一个可编译的示例。我没有发布项目的原因是它太大了,只会使讨论变得混乱。 - user1258312
好的,伙计,我现在发布了一个修复。我可能在其他地方犯了一些傻瓜错误,但相信我,我没有输入URL,我输入了正确的文件名。 - user1258312

1

好的,我认为我实际上找到了一种解决我的问题的方法,并在此发布以帮助可能遇到类似问题的任何人。

这个修复程序仅适用于Windows(XP及以上版本),但我甚至不知道其他操作系统是否存在此问题。即使存在类似的问题,也应该有类似的解决方案。

我正在使用以下代码成功打开一个带有字符的文件:

Process p = new ProcessBuilder("cmd", "/c start \"\" \"E:\_prog\test\u3000.txt\"").start();

这将打开文件'E:_prog\testu3000.txt'


哦,顺便说一下,感谢muCommander,我从他们的程序中借鉴了这个修复方法。 - user1258312

0
据我所知,\u3000是一个表意空格字符。为了测试您的代码,我创建了一个名为CompanyAlt+3000Address的文件。
注意:当您按下Alt+3000时,Windows会创建一个表意空格字符。然后,我将文件名复制到我的Java程序中,它对我起作用了。
Desktop.getDesktop().open(new File("C:\\Users\\Chandru\\Desktop\\Company╕Address.txt")); 

我的Windows系统可能出了点问题,按下“Alt+3000”键会显示出©字符。 - user1258312
如果我复制你的 ╕,当尝试打开 c:\test.txt 时,会出现 "java.lang.IllegalArgumentException: The file: c:\tstâ••.txt doesn't exist." 的错误提示。 - user1258312
应该没问题,亲爱的,我也在使用Windows XP。甚至在输入评论时,我按下了Alt+3000,它给了我╕符号。 - Chandra Sekhar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接