#java
#java
Вопрос:
Я создаю HTTP-сервер на Java, чтобы (при запуске) он находил все файлы в каталоге (и это подкаталоги) и добавлял их на сервер. Но когда вы получаете путь к файлу и пытаетесь передать его HTTPServer.createContext() , он выдает java.lang.IllegalArgumentException: Illegal value for path or protocol
. (в качестве строкового аргумента скажите «folder/index.html «). Чтобы получить это значение, я использовал
file.getParent().substring(24) "/" file.getName()
Я использовал substring, потому что мне пришлось исключить папку, в которой находится веб-сервер. Недопустимым символом является обратная косая черта. Я попытался расширить файл, чтобы изменить separator
и separatorChar
, но это создало только 2 новые переменные. При использовании String.replace(), похоже, не имело никакого эффекта. Есть ли другой метод, отличный File.getParent
от или File.getPath
, который я могу использовать, или есть способ использовать String.replace
, который я не вижу?
РЕДАКТИРОВАТЬ: String.replace() кажется лучшим ответом… Но я не совсем уверен, как его использовать.
РЕДАКТИРОВАТЬ 2: по какой-то причине обратная косая черта не отображается, поэтому я изменил ее.
Комментарии:
1. Вы, будучи профессионалом Java, должны проверить, что
Paths
может предложить класс в отношении разделения и обработки пути2. @Marged Хорошо, я так и сделаю. Кроме того, «JAVAPRO» является относительным термином.
3. Но вы знаете, что
String.replace()
это не изменяет исходную строку, а возвращает измененную строку в результате?4. @vanje Я попробовал
(file.getParent().substring(24) "/" file.getName()).replace("\'", "/")
в качестве аргумента метод, который создает контекст http-сервера. Я все делаю правильно? Я понимаю, что «\'» может быть неправильным…
Ответ №1:
Вы должны использовать java System.getProperty.
Обратите внимание, что в этом контексте "file.separator"
это ключ, который мы используем для get
этого свойства из текущей системы, выполняющей виртуальную машину Java.
Вместо использования косой черты (/), вы должны выбрать независимый от платформы разделитель файлов, в качестве примера это должно быть:
String separator = System.getProperty("file.separator");
System.out.println(separator);
// unix / , windows
Комментарии:
1. Но я должен использовать
/
, потому что это единственное, что примет HTTPServer. Это ужасная идея — устанавливать системное свойство с помощью System.setProperty() ? Или это сломает мой компьютер?2. это происходит потому, что разделитель файлов является примитивом операционной системы, он не является значением по умолчанию для всех операционных систем. (linux, windows, macos и т.д.)
3. Но мне нужно другое в моей строке, что мне делать?
4. Вам нужно использовать system.getProperty. Так что это будет работать для любой операционной системы. Если вам нужно другое, вы можете использовать объект для определения этого поведения. Допустим, у вас есть aliasPath и realPath . Где реальный путь загрузит правильный
path
из файловой системы.5. @anygenergicJAVAPRO Файлы сильно отличаются от URL-адресов. У них разные правила.
Ответ №2:
Взгляните на Paths.get(...)
Попробуйте Paths.get(".")
// текущий рабочий каталог.
Или укажите, с какого пути он должен начинаться:
Используйте System.getProperty("user.dir")
для текущего пользователя, вошедшего в систему, домашний каталог. String pathStr = «/»;
Path homeDir = Paths.get(System.getProperty("user.dir"))
Переход из каталога пользователя в каталог данных: homeDir.get("data")
Path dataPath = Paths.get(System.getProperty("user.dir"));
File dataFile = dataPath.toFile();
Теперь используйте операции с файлом данных, чтобы проверить, какие файлы и каталоги есть в этом расположении файловой системы.