FileNotFoundException при попытке прочитать список файлов, которые мне предоставляет система.Это проблема кодировки имени? - PullRequest
3 голосов
/ 29 августа 2011

Я использую tomcat 5.5.28 в Windows-машине с -Dfile.encoding = UTF-8 в JAVA_OPTS.

У меня проблема с чтением файлов из файловой системы, это мой код:

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) без проблем:

Я переместил этот код в другую среду: на машине linux с той же версией tomcat (5.5.28), той же версией виртуальной машины java (1.6.0_20), той же опцией file.encoding (UTF-8), ... и Я снова получаю FileNotFoundException.

Я что-то не так делаю?

Спасибо за любую помощь. Хуан Аркадио.

1 Ответ

1 голос
/ 29 августа 2011

Вы пытались найти путь, который вы строите в своем обходном коде (в обеих средах)?

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

Кроме этого, я бы посоветовал использовать такой API, как Apache Commons IO или аналогичный.

EDIT:

Если я не ошибаюсь, ваш вопрос относится к этому . Посмотрите, поможет ли обходной путь (изменив локали вашей системы Unix / Linux).

И если вам есть что сказать по этому поводу, я бы всегда советовал не использовать пробелы и специальные символы / глифы, такие как тильда и т. Д. В именах файлов. Судя по всему, речь идет о папке www (web); в этом случае использование пробелов и т. д. - это чистое безумие.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...