Почему я получаю ошибку при чтении файла из файловой системы с использованием полного пути?

#java #spring-boot #filesystems

Вопрос:

У меня есть следующее, чтобы прочитать файл из файловой системы, я предоставляю методу полное имя файла, включая «c://». вот метод:

 private Resource loadAsResource(String filename) throws MalformedURLException {     
              Path file = root.resolve(filename);
              Resource resource = new UrlResource(file.toUri());
                         
              if (resource.exists() || resource.isReadable()) {
                return resource;
              }
            return null;                        
    }
 

при печати журналов я обнаружил, что и exist (), и isReadable() возвращают значение false.
вот сообщение об ошибке из журнала tomcat:

 cannot be resolved in the file system for checking its content length
 

Пожалуйста, также обратите внимание, что когда я обновляю страницу (угол 9), файл (изображение) отображается
на экране, так что это не проблема пути.
Я искал решение и нашел возможное решение для использования пути к классам, но в моем случае я не могу его использовать, потому что требуется использовать файловую систему. Папка не может находиться в статической папке, потому что я не хочу, чтобы она была в файле jar. В рабочей папке должно содержаться 140 тыс. файлов, включая фотографии и видео.

Комментарии:

1. URL-адрес файла начинается file:// не с буквы диска.

2. Это базовая папка C:\Users\john\OneDrive\Documents Мне нужно изменить его на что ?

3. file://c:/Users/john/OneDrive/Documents — Я не уверен, что это сработает, но это, по крайней мере, действительный URL-адрес файла.

4. в «Ресурсном ресурсе» находится URL-адрес, который вы предложили [файл:/C:/Пользователи/john_/OneDrive/Документы…

5. Если код работает правильно, если вы подождете несколько секунд, то, очевидно, что-то изменилось во время этого ожидания. Теперь, зная ваш код, я вижу 2 вещи, которые могут измениться таким образом, чтобы код внезапно начал работать: 1) Значение root изменений. Регистрация значения file определенно показала бы это. — 2) Файл создается каким-то фоновым процессом, который еще не завершен при первом вызове. То, что вы видите, известно как состояние гонки.

Ответ №1:

Мне не нравится это решение, но оно просто работает:

 private Resource loadAsResource(String filename) {
        try {
              Path file = root.resolve(filename);
              Resource resource = new UrlResource(file.toUri());
              int i=0;
              while(!resource.exists() || !resource.isReadable()) {
                  Thread.sleep(100);
                  if (  i == 20) {
                      break;
                  }
              }
              return resource;                    
            } catch (MalformedURLException e) {
              throw new RuntimeException("Error: "   e.getMessage());
            } catch (InterruptedException e) {
                 throw new RuntimeException("Could not read the file!");
            }       
    }
 

Цикл будет прерван через 2 секунды, не имеет большого значения.

Комментарии:

1. Просмотр каталога на предмет изменений