读取系统提供的文件列表时出现FileNotFoundException异常。这是一个名称编码问题吗?

3

我在一台Windows机器上使用带有-Dfile.encoding=UTF-8的JAVA_OPTS的Tomcat 5.5.28。

我遇到了从文件系统读取文件的问题,这是我的代码:

File directory = new File(directoryPath);
if (directory.exists()) {
    File[] fileInDir = directory.listFiles();
    for (int i=0; i<fileInDir.length; i++) {
        FileInputStream fileInput = new FileInputStream(fileInDir[i]);
        ...
    }
}

如果文件不包含任何“奇怪”的字符,它可以正常工作。 如果目录中包含带有重音符号/波浪符号的文件名时,创建FileInputStream时会出现FileNotFoundException。

我解决了这个问题,使用解码后的字符串而不是File对象,做法如下:

String name = new String(fileInDir[i].getName().getBytes(), System.getProperty("file.encoding"));
String parent = new String(fileInDir[i].getParent().getBytes(), System.getProperty("file.encoding"));

Charset systemCharset = Charset.forName(System.getProperty("file.encoding"));
CharsetDecoder systemDecoder = systemCharset.newDecoder();
CharBuffer cbufN = systemDecoder.decode(ByteBuffer.wrap(name.getBytes()));
CharBuffer cbufP = systemDecoder.decode(ByteBuffer.wrap(parent.getBytes()));
String path = cbufP.toString() + File.separator + cbufN.toString();

FileInputStream fileInput = new FileInputStream(path);

它在我的Windows机器上运行良好,我可以读取像(X:\directory\zípìç\ñañaf.txt)这样的文件而没有问题:
我将此代码移动到其他环境:具有相同Tomcat版本(5.5.28),相同Java虚拟机版本(1.6.0_20),相同file.encoding选项(UTF-8)的Linux机器上,并再次收到FileNotFoundException。
我做错了什么吗?
感谢任何帮助。 Juan Arcadio.
1个回答

1

你尝试过查看你在解决方案代码中构建的路径吗(在两个环境中都是如此)?

System.out.println("Path: "+path);

除此之外,我建议使用类似于Apache Commons IO或类似的API。

编辑:

如果我没记错的话,你的问题与this one有关。看看那里的解决方法是否有帮助(更改您的Unix / Linux系统的语言环境)。

如果您对此有任何意见,我始终建议不要在文件名中使用空格和特殊字符/字形,例如波浪符等。从外观上看,这是一个www(Web)文件夹;在这种情况下,使用空格等纯属疯狂。


我怀疑在这种情况下Commons IO不会有任何帮助。 - skaffman
不可否认。但是Java的IO(特别是某些版本)声誉很差,至少可以这么说。因此需要注意。 - Wivani
路径名错误,应该是这样的:Windows - 路径:C:\www\compartida\carpetón Linux - 路径:/www/compartida/carpet�在Windows中,使用Apache的commons io库时,只需使用File对象即可正常工作。FileInputStream fileInput = FileUtils.openInputStream(fileInDir[i]);但在Linux环境中,如果文件名包含某些特殊字符,则会出现“FileNotFoundException”错误。有什么建议吗? - Juan Arcadio
在Linux中构建了什么路径(带或不带Apache IO)? - Wivani
我进行字符串转换构建的路径与Apache IO在Linux中构建的路径相同。当它抛出我的路径转换异常时,请打印:java.io.FileNotFoundException: /www/compartida/carpet� (No such file or directory)当它抛出Apache IO异常时,请打印:java.io.FileNotFoundException: File '/www/compartida/carpet�' does not exist - Juan Arcadio
谢谢,我会与Linux系统管理员讨论测试更改系统区域设置。 - Juan Arcadio

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