#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 секунды, не имеет большого значения.