Как избежать исключения FileNotFound при запуске Java в Linux из-за чувствительности к регистру?

StackOverflow https://stackoverflow.com/questions/1733770

Вопрос

Мое веб-приложение работает в Windows.Я также хотел бы запустить свое приложение в Linux.Кажется, я преодолел большинство проблем, таких как разделитель путей и т.д.

Настоящая проблема сейчас в том, что я получаю FileNotFoundException когда Java-код пытается открыть файл, скажите Abc.txt когда только abc.txt существует.:(

Я не могу продолжать менять все имена файлов на строчные или прописные, так как у меня очень много файлов.Сильно не меняя код, есть ли какой-нибудь возможный способ избежать этого?

Это было полезно?

Решение

Нет никакого способа избежать этого, поскольку java.io.File API зависит от системы.Вы должны использовать правильный регистр при работе с файлами в Linux / Unix.На самом деле, моим советом / решением было бы следовать строгим и переносимым соглашениям во время разработки в Windows (напримериспользуйте только имена файлов в нижнем регистре или, лучше, используйте точное имя файла при программном доступе к нему).Честно говоря, я не понимаю, почему вы пытаетесь загрузить Abc.txt когда имя файла является abc.txt.Это скорее плохая привычка (которой научился, проводя слишком много времени за Windows), чем проблема Linux / Unix.

Другие советы

Исправь это!

Любая схема, которую вы придумаете, чтобы обойти это исправление, в долгосрочной перспективе будет хуже.

Ну, во-первых, я думаю, что вы следует рассмотрите возможность перехода к согласованной схеме именования, а не к использованию какого-либо обходного пути.

В любом случае, как насчет считывание всех имен файлов и помещение их в карту который содержит имя в нижнем регистре в качестве ключа?Тогда вы сможете найдите правильное имя файла на карте.

Это также позволило бы вам обнаружить конфликт, напримердва файла "FileA.txt " и "FILEA.TXT" в том же каталоге, который имеет те же представления в нижнем регистре, и в этом случае вы знаете, что вам нужно решить проблему совершенно другим способом (потому что вы должны знать, какой из них вы хотите открыть, а это неоднозначно, и такой обходной путь тогда этого не сделает).

Предполагая, что файлы в Linux имеют смешанный регистр, простого ответа на этот вопрос нет.

Лучшее, что я могу придумать, - это заставить ваше приложение перечислить соответствующие каталоги и создать в памяти структуру данных фактических имен файлов Linux.Затем, чтобы открыть файл без учета регистра, вы разбиваете путь к нему на компоненты, выполняете поиск в дереве памяти с использованием поиска без учета регистра, вводите реальный (чувствительный к регистру) путь и используете его для открытия файла.

Проблема с этим заключается в том, что оно (и, действительно, ваше приложение) не может справиться со случаем, когда у вас есть (скажем) "foo.txt" И "Foo.txt" в том же каталоге Linux.

Но лучшее решение - изменить ваше приложение таким образом, чтобы оно работало с именами путей, чувствительными к регистру.

Почему вы не можете изменить много файлов?Если количество файлов действительно единственное, что вас сдерживает, то просто напишите небольшой скрипт, который переименует их все в нижний регистр.

Из вашего вопроса неясно, что вызывает изменение регистра ваших файлов.Если все ваши файлы написаны в нижнем регистре в Linux, в то время как в Windows они имеют смешанный регистр, вы могли бы просто преобразовать имя файла в нижний регистр, вот так:

new File(filename.toLowerCase())

Есть решение, которое обладает ужасной производительностью во время выполнения, но очень просто в реализации:

Заменить new FileReader(name) с чем - то вроде

openFile(name);

public FileReader openFile(String name) throws FileNotFoundException {
  File dir = (new File(name)).getParentFile();
  for (File f : dir.listFiles()) {
    if (f.getName().equalsIgnoreCase(name)) {
    return new FileReader(f);
  }
  throw new FileNotFoundException("File not found: " + name);
}

Я не компилировал этот код, в нем могут быть опечатки и ошибки.Я оставляю их вам для исправления.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top